在 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]