我遇到了一个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'的请求应该捕获该规则并停止检查任何进一步的比赛。为了使其正常工作,我需要更改什么?
谢谢!
答案 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行。