如果我访问domain.com,网站会重定向到domain.com/en,这是预期的。但随后最后一条规则开始并将其抛入一个循环中,使我的网址看起来像这样:
http://domain.com/en/?lang=en&request=&site=basecamp&lang=en&request=&site=basecamp&lang=en&request=&site=basecamp&lang=en&request=&site=basecamp
.htaccess文件
Options +FollowSymlinks
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} !/(content|images|css|js|fonts|pdfs)/
RewriteRule /([^.]+\.(jpe?g|gif|bmp|png|css|js|eot|svg|ttf|ico|pdf))$ /$1 [NC,R,L]
RewriteCond %{REQUEST_URI} !(content|images|css|js|fonts|pdfs)/.*
RewriteRule !^[a-z]{2}/ /en/ [NC,L,R]
RewriteCond %{REQUEST_URI} !/(init\.php|content|images|css|js|fonts|pdfs)/
RewriteRule ^([a-z]{2})/(.*)$ init.php?lang=$1&request=$2&site=basecamp[L,QSA]
为什么htaccess文件重定向到/?GET_VARS而不是/init.php?GET_VARS?
我怎样才能避免这种循环?
答案 0 :(得分:1)
尝试删除前导和尾部斜杠,以更改上一个条件。您已将URI重写为:
/init.php
但是没有像你提供的条件那样的尾部斜线,所以再次应用规则。它应该看起来像:
RewriteCond %{REQUEST_URI} !(init\.php|content|images|css|js|fonts|pdfs)
不确定为什么你坚持在条件结束时使用尾随斜杠:
# with this / here, it will never match init.php --------v
RewriteCond %{REQUEST_URI} !/(init\.php|content|images|css|js|fonts|pdfs)/
但你可以直接排除init.php来解决它:
RewriteCond %{REQUEST_URI} !init.php
所以,很明显,你的最后一组条件/规则将如下:
RewriteCond %{REQUEST_URI} !init.php
RewriteCond %{REQUEST_URI} !/(content|images|css|js|fonts|pdfs)/
RewriteRule ^([a-z]{2})/(.*)$ init.php?lang=$1&request=$2&site=basecamp [L,QSA]
或者最坏的情况,只需在规则的最开头添加:
RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]
这可以防止任何类型的重写引擎完全循环。