最后的包罗万象的ModRewrite优先于以前的规则


Last catch-all ModRewrite takes precedent over previous rules

我在使用.htaccess文件时遇到了一些困难,我似乎无法理解。根据htaccess测试器,它应该按我的预期工作,但事实并非如此。我的前两个规则仅在最后一个规则被注释掉时才有效。一旦我添加了最后一个规则,似乎前两个规则就不再重要了。请指教。(我知道不建议使用不受版本控制的 api 端点,但我现在需要它来实现兼容性。

RewriteRule beta api.v2.php [QSA,L]
RewriteRule v1/(.*)$ api.v1.php?request=$1 [QSA,NC,L]
#current default api version
RewriteRule (.*)$ api.v1.php?request=$1 [QSA,NC,L]

使用此 htaccess domain.dev/beta/endpoint将转到 api.v1.php 而不是 api.v2.php(使用 Slim),但是一旦删除最后一行,它就会按预期进入 v2。有什么想法吗?

根据您发布的htaccess,重写似乎是:beta -> api.v2.php -> api.v1.php

建议:在重写规则上放置条件,并在最后一个规则上显式检查 api.v2.php

RewriteCond %{REQUEST_URI} ^/beta
RewriteRule beta api.v2.php [L,QSA]
RewriteCond %{REQUEST_URI} ^/v1
RewriteRule v1'/(.*)$ /api.v1.php?request=$1 [QSA,NC,L]
# make sure not to rewrite valid api requests (api.v2.php) to default version
RewriteCond %{REQUEST_URI} !^'/api
RewriteRule ^(.*)$ api.v1.php?request=$1 [QSA,NC,L]