【问题标题】:Apache rewrite merge rulesApache重写合并规则
【发布时间】:2011-11-29 17:43:50
【问题描述】:

在我添加 RewriteCond 之前,管理员 RewriteRule 会影响 scripts/admin.js

然后我注意到 scripts/members.js 受到与成员上下文相同的规则的影响。

我在下面添加了完全相同的 RewriteCond...

RewriteEngine on
RewriteCond %{REQUEST_URI} !\.(css|js|zip)$
RewriteRule .*/admin(.+) admin$1 [QSA]
RewriteCond %{REQUEST_URI} !\.(css|js|zip)$
RewriteRule .*/members(.+) members$1 [QSA]

不用每次都手动添加 RewriteCond 来处理问题,请问如何合并这些规则?

RewriteRule .*/admin(.+) admin$1 [QSA]
RewriteRule .*/blog(.+) blog$1 [QSA]
RewriteRule .*/forums(.+) forums$1 [QSA]

【问题讨论】:

    标签: apache mod-rewrite


    【解决方案1】:

    您可以像这样将您的三张支票合并为一张:

    RewriteCond %{REQUEST_URI} !\.(css|js|zip)$
    RewriteRule .*/(admin|blog|forms)(.+) $1$2 [QSA]
    

    但对于您来说,简单地停止处理 js/css 文件似乎是一个更好的选择,除非您出于某种原因确实需要将规则应用于它们。

    【讨论】:

    • 感谢您的回复。看起来它应该可以工作,但在尝试并重新调整了大约 20 分钟后,由于某种原因它根本不起作用。为了确保,我也注释掉了所有其他代码。
    【解决方案2】:

    您可以反转条件并制定一个传递规则,该规则基本上告诉 mod_rewrite 停止。这样,您就有了 1 个 RewriteCond、1 个通过条件应用的额外 RewriteRule,然后是其他所有内容:

    # Just one of these, note that there is no !
    RewriteCond %{REQUEST_URI} \.(css|js|zip)$
    # pass through, if the request is for a css/js/zip, stop rewriting
    RewriteRule ^ - [L]
    
    # otherwise, do some rewriting
    RewriteRule .*/admin(.+) admin$1 [QSA]
    RewriteRule .*/blog(.+) blog$1 [QSA]
    RewriteRule .*/forums(.+) forums$1 [QSA]
    

    但是,这将影响您拥有的任何其他可能适用于对 css/js/zip 的请求的规则,因为这将导致对这些扩展的所有请求都绕过所有重写。

    【讨论】:

    • 感谢您的回复,不幸的是,仅测试了我提到的具体问题后没有任何改变。
    猜你喜欢
    • 2011-09-02
    • 2011-10-26
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    相关资源
    最近更新 更多