重定向循环,同时使用.htaccess将所有http请求重定向到https

时间:2013-08-20 06:45:53

标签: apache .htaccess

我的.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]

当我尝试访问该网站时,它将变为重定向循环。如何解决此问题并正确重定向?

6 个答案:

答案 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")