Apache .htaccess重定向循环问题

Apache .htaccess重定向循环问题,apache,.htaccess,Apache,.htaccess,若我转到domain.com,站点将重定向到domain.com/en,这是预期的。但最后一条规则开始生效,并将其放入一个循环中,使我的url看起来像这样: http://domain.com/en/?lang=en&request=&site=basecamp&lang=en&request=&site=basecamp&lang=en&request=&site=basecamp&lang=en&request=

若我转到domain.com,站点将重定向到domain.com/en,这是预期的。但最后一条规则开始生效,并将其放入一个循环中,使我的url看起来像这样:

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\u VARS而不是/init.php?GET\u VARS


如何避免这种循环?

请尝试通过删除前导斜杠和尾随斜杠来更改上一个条件。您已将URI重写为:

/init.php
但是没有像您提供的条件中那样的尾随斜杠,因此再次应用该规则。它应该是这样的:

RewriteCond %{REQUEST_URI} !(init\.php|content|images|css|js|fonts|pdfs)
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]

不确定您为什么坚持在条件结束时使用尾随斜杠:

#                 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|content|images|css|js|fonts|pdfs)
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]

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

谢谢您到目前为止的耐心Jon。因此,更新后的规则不起作用:
RewriteCond%{REQUEST\u URI}/(init\.php | content | images | css | js | font | pdf)/RewriteRule^([a-z]{2})/(.*)$/init.php?lang=$1&request=$2&site=basecamp[L,QSA]
我忘了删除后面的斜杠。但是我复制并粘贴了与您编写的规则完全相同的规则,我仍然遇到同样的问题。如果您查看我问题中的url,您会发现它不包含init.php,所以这可能就是为什么
!init.php
不是working@gAMBOOKa
!php
表示URI中的任何位置都不能有
init.php
。所讨论的URL是
init.php?lang=$1&request=$2&site=basecamp
,它肯定包含一个
init.php
@gAMBOOKa,它阻止了所有的循环。重写引擎将把一个URI放回所有规则中,如果它的输出与输入的不同(例如,如果它发生了更改),重写引擎将把生成的URI放回所有规则中,并且它将永远这样做,要么URI是相同的输入输出,要么是500服务器错误。