mod_rewrite重写第二个RewriteRule

时间:2013-03-13 19:27:08

标签: php .htaccess mod-rewrite

我遇到了一个mod_rewrite问题,我的.htaccess文件中的第二条规则覆盖了第一条规则。有问题的.htaccess文件如下所示:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /path/appname

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule /api/v1/(.*)$ api/v1/index.php?rquest=$1 [QSA,NC,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php
</IfModule>

我看到的问题是:

如果我直接转到http://example.com/path/appname/api/v1/valid/endpoint,第一个RewriteRule会正确触发,我会从API中获得结果。

但是,请说我访问http://example.com/path/appname/app - 根据第二个RewriteRule重写的页面。该页面向api / v1页面发出AJAX请求。这些请求是通过第二个RewriteRule引导并发送到我的基本index.php页面。

我对这可能是多么困惑,因为我的理解是[L]标志阻止任何进一步的规则一旦匹配就被运行,因此一旦任何具有'api / v1'的请求应该捕获该规则并停止检查任何进一步的比赛。为了使其正常工作,我需要更改什么?

谢谢!

1 个答案:

答案 0 :(得分:0)

您应该排除先前规则集的细分受路径,因此不会再次处理它。像这样:

# Don't redirect/map when folders or files exist 
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# Exclude the previous path
RewriteCond %{REQUEST_URI} !api/v1/?   [NC]

# Prevent loops
RewriteCond %{REQUEST_URI} !index\.php [NC]

RewriteRule . index.php                [L]

</IfModule>

用上面的行替换你问题中的最后4行。