我有一个网站,其中有各个部分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/shop.php重新写入/shop/shop.php(读取:我们有一个无限循环)。如果将此条件应用于该重写规则,则不会发生这种情况,因为/shop/shop.php是实际文件:
RewriteCond%{REQUEST_FILENAME}!-f
所以是啊......
答案 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