让一些RewriteCond影响多个规则

时间:2009-11-11 15:06:22

标签: php mod-rewrite url-rewriting

我有一个网站,其中有各个部分parse request URLs by themselves,有些则没有(例如vBulletin论坛)。我必须向适当的脚本发送请求的.htaccess是:

# wiki, shop, admin
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !(.*)\.js
RewriteRule ^wiki/(.*)$ w/index.php?title=$1 [PT,L,QSA]
RewriteRule ^wiki/*$ wiki/ [L,QSA]
RewriteRule ^shop/ /shop/shop.php [NC,L]
RewriteRule ^forum/admincp/pkr/ /forum/admincp/pkr/pkr.php [NC,L]

这不像我预期的那样有效。我忘记了重写条件仅适用于跟随它们的第一个规则。问题是我如何将这些 RewriteCond itions应用于所有这些规则,而不必将它们复制4次?


出了什么问题:

  • / shop / example重写为/shop/shop.php
  • 然后将
  • /shop/shop.php重新写入/shop/shop.php(读取:我们有一个无限循环)。如果将此条件应用于该重写规则,则不会发生这种情况,因为/shop/shop.php是实际文件:

    RewriteCond%{REQUEST_FILENAME}!-f

所以是啊......

3 个答案:

答案 0 :(得分:5)

反转表达式并将其附加到破坏规则:

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} (.*)\.js
RewriteRule ^ - [L]

答案 1 :(得分:5)

我不明白Gumbo的答案,所以我发现这是有用的:

您可以反转匹配规则(例如使用!符号)而不是匹配某些内容并执行该测试中的多个RewriteRule,如果找不到它,跳过X条规则。如:

RewriteCond %{HTTP_HOST} !^www.mydomain.com [NC]
RewriteRule . - [S=2] # Skip the below X lines if the above test passes
RewriteRule ^/images/(.*) /resources/images/$1 [L]
RewriteRule ^/favicon.ico /resources/favicon.ico [L]

因此,如果HTTP_HOST以www.mydomain.com开头,我想要处理最后两个RewriteRules。但我正在做的是,如果HTTP_HOST 以www.mydomain.com开头,则跳过接下来的两条规则。第一个RewriteRule:. - [S=2]实际上没有改变任何东西,但S = 2标志意味着跳过下一个X = 2规则。

如果你问我一点反向逻辑。

答案 2 :(得分:0)

或者只是再做一个像

这样的条件
RewriteCond %{THE_REQUEST} !shop.php

甚至更好

RewriteCond %{THE_REQUEST} !(.*)\.php