.htaccess重定向次数太多



我已经为子域编写了.htaccess,但它重定向了太多次。

我的完整代码看起来像

RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ http://subdomain/$1 [R,L]

RewriteEngine On      
RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ $1.php [NC,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^404/?$ /404.php [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^ http://subdomain/404 [L,R]

问题很可能是最顶层的重定向。它实现了一个重定向循环。此外,还不清楚它的实际目的是什么。。。什么是";子域";在这里主机名/子域名?像http://sub.example.com/$1这样的东西?

假设所有";子域";如果由同一个http服务器提供服务,则需要添加一个附加条件来打破这种外观:

RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteCond %{HOST_NAME} !^sub.example.com$ 
RewriteRule ^(.*)$ http://sub.example.com/$1 [R,L]

这也可以简化为:

RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteCond %{HOST_NAME} !^sub.example.com$ 
RewriteRule ^ http://sub.example.com%{REQUEST_URI} [R,L]

还可以考虑使用加密的https协议,这实际上是目前的标准。

RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ http://subdomain/$1 [R,L]

您实际上并没有说明您要做什么。但是,像这样检查SERVER_PORT端口80的唯一原因是您是否重定向到HTTPS(端口443(。但是您正在重定向到HTTP(端口80(,所以这自然会导致重定向循环。

您需要在替换字符串中将http更改为https。例如:

RewriteCond %{SERVER_PORT} 80
RewriteRule (.*) https://subdomain/$1 [R=301,L]

(最终,这应该是一个301永久重定向,一旦你确认它按预期工作。(

或者,如果您不打算强制HTTPS(但应该强制(,请完全删除这些指令。


RewriteRule ^ http://subdomain/404 [L,R]

并在最后一条规则中更改为https。(但是,您不应该重定向到"404">错误文档。(

最新更新