我的.htaccess文件中有以下规则
# to redirect http to https
RewriteCond %{HTTPS} off
RewriteRule (.*) https://www.example.com/$1 [R=301,L]
# to redirect urls with index.php to /
RewriteCond %{THE_REQUEST} ^.*/index.php
RewriteRule ^(.*)index.php$ /$1 [R=301,L]
# to redirect non www requests to www url
RewriteCond %{HTTP_HOST} !^www\.example\.com
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]
当我尝试访问该网站时,它将变为重定向循环。如何解决此问题并正确重定向?
答案 0 :(得分:32)
以防有人在使用Apache http-> https重写负载均衡器后重定向循环,这里的解决方案对我有用。
当负载平衡器执行SSL操作时,在负载平衡器后面的Apache使用 RewriteCond%{HTTPS}关闭时遇到了同样的问题。
如果未通过Apache ModSSL配置网站的https版本,则不会将%{HTTPS}变量设置为“on”并保持无限重定向。
修复它的最简单的解决方案是将所有https流量定位到另一个Apache VirtualHost(当SSL由负载均衡器处理时),它是主要副本的副本,但具有不同的端口(比方说81)。在.htaccess中,对于端口81上没有的所有内容执行mod_rewrite:
ReWriteCond %{SERVER_PORT} !^81$
RewriteRule ^/(.*) https://%{HTTP_HOST}/$1 [NC,R,L]
第二种方法是将X-Forwarded-Proto标头从负载均衡器发送到Apache并在重写条件下使用它:
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
答案 1 :(得分:13)
我在尝试使用.htaccess文件从http移动到https时,看到很多人遭受重定向循环。如何解决这个问题有很多不同的答案。有人说:
ReWriteCond %{SERVER_PORT} 80
OR
RewriteCond %{HTTPS} off
OR
RewriteCond %{HTTPS} !on
OR (as above)
RewriteCond %{HTTP:X-Forwarded-Proto} !https
OR EVEN
RewriteCond %{HTTP:X-Forwarded-SSL} =off
但这些都不适合我。我最终发现了潜在的事实,即不同的服务器以不同的方式配置,并且它们都提供不同的服务器变量。
如果以上都不适合您,那么诀窍就是使用PHP来查找您访问http页面时特定服务器发送给您的env变量,以及访问https时它向您发送的env变量页面,然后您可以使用该变量进行重定向。只需使用以下代码在服务器上创建一个PHP文件(例如showphpvars.php):
<?php phpinfo() ?>
然后使用浏览器查看它。使用_SERVER找到变量部分[&#34; HTTP_HOST&#34; (等)],并有一个侦察周围的http改为http与https。我的结果是一个名为SSL的变量,使用https时设置为1,使用http时根本不设置。
我使用该变量重定向到使用PHP的https,这比使用htaccess好得多,但我认为如果您希望继续使用htaccess,也可以使用htaccess访问任何_SERVER变量那。只需在引号内使用名称,而不使用PHP添加的_SERVER [&#34;&#34;]位。
答案 2 :(得分:3)
有关您的信息,这实际上取决于您的托管服务提供商。它可能正在使用负载均衡器,如康斯坦丁在另一个答案中所述。
在我的情况下(Infomaniak),上面没有任何实际工作,我得到了无限的重定向循环。
正确的方法是actually explained in their support site:
RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://your-domain.com/$1 [R=301,L]
因此,请务必咨询您的托管服务提供商。希望他们有一篇文章解释如何做到这一点。否则,只需询问支持。
答案 3 :(得分:2)
如果你得到一个重定向循环,无论你在htaccess中做什么,都要用PHP重定向。
我使用phpinfo(),就像@ z-m建议的那样,找到我在SSL上时发生变化的变量。就我而言,它是$ _SERVER [&#39; HTTP_X_PROTO&#39;] ==&#34; https&#34;。如果不在SSL上,则不设置此变量。
这是我用来从HTTP重定向到HTTPS的代码:
if ($_SERVER['HTTP_X_PROTO'] != "https") {
header("HTTP/1.1 301 Moved Permanently");
$location = "https://" . $_SERVER[HTTP_HOST] . $_SERVER[REQUEST_URI];
header("Location: $location");
exit;
}
答案 4 :(得分:0)
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{
答案 5 :(得分:0)
就我而言:
if ($_SERVER['HTTPS'] != "on")