在 htaccess 中组合静态和动态路由
Combining static and dynamic routes in htaccess
我正在处理一些遗留代码,其中包含大量 htaccess 重定向,如下所示:
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^login/([-A-z0-9]+)*$ ./login.php?id= [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= [R=302,NC,QSA,L]
但是,我们正在添加新组件,并且我实现了一个使用路由的自定义构建的光照框架。
在不重写整个代码的情况下,我需要将不符合上述任何规则的 URL 发送到 app.php,这将按路由进行路由规则。
所以当我在 .htaccess 的末尾添加这一行时
RewriteRule ^(.*)$ app.php?route_query= [L,QSA]
尽管上面有 [L] 标志, htaccess 仍然处理所有内容以 app.php(自然会导致错误)。
如果 URL 匹配,我如何阻止 .htaccess 比匹配的行走得更远?
我认为 [L] 标志可以做到这一点。但事实并非如此。
我考虑过重写静态路由,但这超出了我们的协议范围。
感谢您的帮助。
RewriteCond
范围仅适用于下一个 RewriteRule
。从您的示例中,仅检查以下规则 RewriteRule ^login/([-A-z0-9]+)*$ ./login.php?id= [R=302,NC,QSA,L]
。在你的例子中,当你在末尾添加通配符规则时,它总是一次又一次地匹配(你创建了一个透明的无限重写循环)。
你需要做的是在开始时忽略现有的 folders/files,然后做你的烂摊子
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= [L,QSA]
我正在处理一些遗留代码,其中包含大量 htaccess 重定向,如下所示:
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^login/([-A-z0-9]+)*$ ./login.php?id= [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= [R=302,NC,QSA,L]
但是,我们正在添加新组件,并且我实现了一个使用路由的自定义构建的光照框架。
在不重写整个代码的情况下,我需要将不符合上述任何规则的 URL 发送到 app.php,这将按路由进行路由规则。
所以当我在 .htaccess 的末尾添加这一行时
RewriteRule ^(.*)$ app.php?route_query= [L,QSA]
尽管上面有 [L] 标志, htaccess 仍然处理所有内容以 app.php(自然会导致错误)。
如果 URL 匹配,我如何阻止 .htaccess 比匹配的行走得更远?
我认为 [L] 标志可以做到这一点。但事实并非如此。
我考虑过重写静态路由,但这超出了我们的协议范围。
感谢您的帮助。
RewriteCond
范围仅适用于下一个 RewriteRule
。从您的示例中,仅检查以下规则 RewriteRule ^login/([-A-z0-9]+)*$ ./login.php?id= [R=302,NC,QSA,L]
。在你的例子中,当你在末尾添加通配符规则时,它总是一次又一次地匹配(你创建了一个透明的无限重写循环)。
你需要做的是在开始时忽略现有的 folders/files,然后做你的烂摊子
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= [L,QSA]