我的.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)
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 [""]位.
对于您的信息,这实际上取决于您的托管服务提供商。正如康斯坦丁在另一个答案中所说,它可能正在使用负载均衡器。
就我而言(Infomaniak),上面没有任何实际工作,我得到了无限重定向循环。
正确的方法实际上在他们的支持站点中有解释:
RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://your-domain.com/$1 [R=301,L]
Run Code Online (Sandbox Code Playgroud)
因此,请务必咨询您的托管服务提供商。希望他们有一篇文章解释如何做到这一点。否则,请寻求支持。
归档时间: |
|
查看次数: |
23363 次 |
最近记录: |