Apache重写合并规则

时间:2011-11-29 17:43:50

标签: apache mod-rewrite

之前,管理员RewriteRule正在影响 scripts / admin.js ,直到我添加了RewriteCond。

然后我注意到 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]

2 个答案:

答案 0 :(得分:0)

您可以反转条件并制作一个基本上告诉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请求的任何其他规则,因为这会导致对这些扩展的所有请求都绕过所有重写。

答案 1 :(得分:0)

您可以将三张支票合并为:

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

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