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

Deb*_*sad 15 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]
Run Code Online (Sandbox Code Playgroud)

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

Kon*_*tin 32

以防万一有人在负载均衡器后面使用Apache http-> https重写时有重定向循环,这里的解决方案对我有用.

当负载平衡器执行SSL操作时,在负载均衡器后面使用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]
Run Code Online (Sandbox Code Playgroud)

第二种方法是将X-Forwarded-Proto头从负载均衡器发送到Apache并在重写条件下使用它:

RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
Run Code Online (Sandbox Code Playgroud)

  • 是的,你是对的!我有同样的问题.但是我无法使你的代码工作,我改为使用它:`RewriteEngine On RewriteCond%{SERVER_PORT} 80 RewriteRule ^(.*)$ https://domain.com/$1 [R,L]` (2认同)
  • 谢谢康斯坦丁,到处都在寻找.HTTP:X-Forwarded-Proto解决了它. (2认同)

Z M*_*Z M 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
Run Code Online (Sandbox Code Playgroud)

但这些都不适合我.我最终发现了潜在的事实,那里的不同服务器以不同的方式配置,并且它们都提供不同的服务器变量.

如果以上都不适合您,那么诀窍是使用PHP来查找您访问http页面时特定服务器发送给您的env变量,以及当您访问https页面时它向您发送的env变量,以及然后你可以使用该变量来进行重定向.只需使用以下代码在服务器上创建一个PHP文件(例如showphpvars.php):

<?php phpinfo() ?>
Run Code Online (Sandbox Code Playgroud)

然后使用浏览器查看它.在其中找到带有_SERVER ["HTTP_HOST"(etc)]的变量部分,并找到针对http与https进行更改的变量.我的结果是一个名为SSL的变量,使用https时设置为1,使用http时根本不设置.

我使用该变量重定向到使用PHP的https,这比使用htaccess好得多,但我认为任何_SERVER变量也可以使用htaccess访问,如果你热衷于继续使用它.只需在引号内使用名称,而不使用PHP添加的_SERVER [""]位.


Ind*_*igo 6

对于您的信息,这实际上取决于您的托管服务提供商。正如康斯坦丁在另一个答案中所说,它可能正在使用负载均衡器。

就我而言(Infomaniak),上面没有任何实际工作,我得到了无限重定向循环。

正确的方法实际上在他们的支持站点中有解释

RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://your-domain.com/$1 [R=301,L]
Run Code Online (Sandbox Code Playgroud)

因此,请务必咨询您的托管服务提供商。希望他们有一篇文章解释如何做到这一点。否则,请寻求支持。