Apache .htaccess重定向循环问题
若我转到domain.com,站点将重定向到domain.com/en,这是预期的。但最后一条规则开始生效,并将其放入一个循环中,使我的url看起来像这样: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=
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服务器错误。