.htaccess 错误 - ERR_TOO_MANY_REDIRECTS
.htaccess error - ERR_TOO_MANY_REDIRECTS
我有这个 .htaccess 文件可以将 http://
重定向到 https://
我也做了 www.
到根域重定向!
www.
到根域有效!但是 https://
重定向没有!
如果我将 RewriteCond %{HTTPS} on
设置为 RewriteCond %{HTTPS} off
或 RewriteCond %{HTTPS} =!on
,我会收到浏览器错误:
The example.com page isn’t working
mysite.com redirected you too many times.
Try clearing your cookies.
ERR_TOO_MANY_REDIRECTS
我所做的一次编辑给了我一个 500 错误,但我将其恢复到以前的状态!我所做的只是更改:RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
到 RewriteRule(.*) https://%{HTTP_HOST}%{REQUEST_URI}
或 RewriteRule (.*)https://%{HTTP_HOST}%{REQUEST_URI}
有人对如何解决这个问题有任何想法吗?
这是我的整个 .htaccess
文件!
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
RewriteCond %{HTTPS} on [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^ https://antimalwareprogram.co%{REQUEST_URI} [R=301,L,NE]
</IfModule>
RewriteCond %{HTTPS} on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
是的,这将创建一个重定向循环。逻辑不对。这说明的是...如果 HTTPS 是 "on",则重定向到 HTTPS。您应该检查 HTTPS 是否为 "off"(或 "not on",即 !on
)。
(通过删除参数之间的空格,您可能会创建一个重写循环,因此会出现 500 错误。空格是 Apache 配置文件中的分隔符。)
请尝试如下操作:
RewriteEngine On
RewriteCond %{HTTPS} !on [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^ https://example.com%{REQUEST_URI} [R=302,L,NE]
它处理 HTTPS 和 www 规范重定向。你不需要第一条规则。您也不需要 <IfModule>
容器。
仅当您确定它工作正常时才将 302
更改为 301
。
确保您在测试前已清除浏览器缓存。 301s 被浏览器硬缓存。
更新: 如果这仍然给您相同的错误(重定向循环),那么您的 SSL 可能由前端代理管理,而不是您的应用程序服务器。如果是这种情况,那么您将无法使用 HTTPS
服务器变量。查看这些相关问题:
在这种情况下,似乎需要使用 ENV:HTTPS
(环境变量)来代替 HTTPS
(Apache 服务器变量)。但是请注意,这是非标准的/特定于服务器的,因为它意味着前端代理正在用于管理 SSL。
我有这个 .htaccess 文件可以将 http://
重定向到 https://
我也做了 www.
到根域重定向!
www.
到根域有效!但是 https://
重定向没有!
如果我将 RewriteCond %{HTTPS} on
设置为 RewriteCond %{HTTPS} off
或 RewriteCond %{HTTPS} =!on
,我会收到浏览器错误:
The example.com page isn’t working
mysite.com redirected you too many times.
Try clearing your cookies.
ERR_TOO_MANY_REDIRECTS
我所做的一次编辑给了我一个 500 错误,但我将其恢复到以前的状态!我所做的只是更改:RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
到 RewriteRule(.*) https://%{HTTP_HOST}%{REQUEST_URI}
或 RewriteRule (.*)https://%{HTTP_HOST}%{REQUEST_URI}
有人对如何解决这个问题有任何想法吗?
这是我的整个 .htaccess
文件!
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
RewriteCond %{HTTPS} on [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^ https://antimalwareprogram.co%{REQUEST_URI} [R=301,L,NE]
</IfModule>
RewriteCond %{HTTPS} on RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
是的,这将创建一个重定向循环。逻辑不对。这说明的是...如果 HTTPS 是 "on",则重定向到 HTTPS。您应该检查 HTTPS 是否为 "off"(或 "not on",即 !on
)。
(通过删除参数之间的空格,您可能会创建一个重写循环,因此会出现 500 错误。空格是 Apache 配置文件中的分隔符。)
请尝试如下操作:
RewriteEngine On
RewriteCond %{HTTPS} !on [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^ https://example.com%{REQUEST_URI} [R=302,L,NE]
它处理 HTTPS 和 www 规范重定向。你不需要第一条规则。您也不需要 <IfModule>
容器。
仅当您确定它工作正常时才将 302
更改为 301
。
确保您在测试前已清除浏览器缓存。 301s 被浏览器硬缓存。
更新: 如果这仍然给您相同的错误(重定向循环),那么您的 SSL 可能由前端代理管理,而不是您的应用程序服务器。如果是这种情况,那么您将无法使用 HTTPS
服务器变量。查看这些相关问题:
在这种情况下,似乎需要使用 ENV:HTTPS
(环境变量)来代替 HTTPS
(Apache 服务器变量)。但是请注意,这是非标准的/特定于服务器的,因为它意味着前端代理正在用于管理 SSL。