在htaccess中组合静态和动态路由

时间:2018-07-23 10:03:25

标签: apache .htaccess mod-rewrite apache2

我正在处理一些具有大量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]标志可以做到这一点。但事实并非如此。

我考虑过重写静态路由,但这超出了我们协议的范围。

谢谢您的帮助。

1 个答案:

答案 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]