2012-09-14 54 views
0

如果我转到domain.com,网站会重定向到预期的domain.com/en。但随后在最后一条规则踢它扔在一个循环使我的URL看起来像这样:.htaccess重定向循环问题

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

尝试通过删除前导斜杠和尾部斜杠来更改上一个条件。您已将您的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] 

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

+0

不,那也行不通。 – HyderA

+0

感谢您的耐心至今Jon。所以这是更新后的规则:'RewriteCond%{REQUEST_URI}!/(init \ .php | content | images | css | js | fonts | pdfs)/ RewriteRule ^([az] {2})/ (。*)$ /init.php?lang=$1&request=$2&site=basecamp [L,QSA]' – HyderA

+0

@gAMBOOKa请参阅编辑 –