.htaccess重定向循环问题

时间:2012-09-14 15:17:10

标签: apache .htaccess

如果我访问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?

我怎样才能避免这种循环?

1 个答案:

答案 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]

这可以防止任何类型的重写引擎完全循环。