我正在处理一些具有大量htaccess重定向的旧代码,如下所示:
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^login/([-A-z0-9]+)*$ ./login.php?id=$1 [R=302,NC,QSA,L]
RewriteRule ^my-account/*$ ./my-account.php [R=302,NC,L]
RewriteRule ^legacy-path-1/*$ ./god-knows-what.php [R=302,NC,L]
RewriteRule ^legacy-path-2/*$ ./static-dynamic-page.php [R=302,NC,L]
RewriteRule ^legacy-why-would-you-code-this-path/*$ ./king-of-spagetti-code.php [R=302,NC,L]
.............
# about dozen of similar lines as above
.............
#my last line in that mess
RewriteRule ^another-static-link/([-A-z0-9]+)*$ ./another-one-of-many-copy-paste-pages.php?pool_id=$1 [R=302,NC,QSA,L]
但是,我们要添加新的组件,并且我实现了使用路由的自定义构建的轻型框架。
无需重写整个代码,我需要将与上述任何规则都不匹配的URL发送到 app.php ,该URL将按照路由规则进行路由。
所以当我在.htaccess的末尾添加此行
RewriteRule ^(.*)$ app.php?route_query=$1 [L,QSA]
尽管上面有[L]标志, htaccess仍然会处理app.php的所有内容(自然会导致错误)。
如果URL匹配,如何阻止.htaccess超出匹配行?
我认为[L]标志可以做到这一点。但事实并非如此。
我考虑过重写静态路由,但这超出了我们协议的范围。
谢谢您的帮助。
答案 0 :(得分:1)
RewriteCond
范围仅用于下一个RewriteRule
。从您的示例中,仅检查以下规则RewriteRule ^login/([-A-z0-9]+)*$ ./login.php?id=$1 [R=302,NC,QSA,L]
。就您而言,在最后添加通配符规则时,它总是一次又一次地匹配(创建透明的无限重写循环)。
您需要做的是一开始就忽略现有的文件夹/文件,然后乱成一团
Options +FollowSymLinks
RewriteEngine On
# don't touch existing folders/files
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]
# your mess here
RewriteRule ^(.*)$ app.php?route_query=$1 [L,QSA]