让一些RewriteCond影响多个规则

Bar*_*lom 5 php mod-rewrite url-rewriting

我有一个网站,其中各个部分自己解析请求URL,有些则不解析(例如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]
Run Code Online (Sandbox Code Playgroud)

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


出了什么问题是这样的:

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

    RewriteCond%{REQUEST_FILENAME}! - f

是的...

Gum*_*mbo 5

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

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


Mic*_*ler 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]
Run Code Online (Sandbox Code Playgroud)

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

如果你问我,有点反向逻辑.