【问题标题】:Force non-www and HTTPS in htaccess redirect results in too many redirects在 htaccess 重定向中强制使用非 www 和 HTTPS 会导致重定向过多
【发布时间】:2017-09-30 07:05:51
【问题描述】:

我试图在 htaccess 中强制使用非 www https,但我发现的每个示例都会引发错误“重定向太多”

我要重定向:

  • http://www.example.com
  • http://example.com
  • https://www.example.com

到:

  • https://example.com

我找到的最佳解释解决方案在这里:
https://simonecarletti.com/blog/2016/08/redirect-domain-http-https-www-apache/

...给出以下示例:

RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^ https://example.com%{REQUEST_URI} [L,NE,R=301]

感谢解释,我明白它在做什么,但我仍然遇到同样的错误 - 重定向太多。

我能做的最好的是:

RewriteCond %{HTTP_HOST} ^www.example.com$ [NC]
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]

...当然这不会重定向http://example.com

我在httpd.conf 中没有设置重定向,在 Plesk 中没有设置。我在 CentOS 6.8、Apache 2.2.15、Plesk 12.5 上。

可能导致问题的原因是什么?

【问题讨论】:

    标签: apache .htaccess redirect mod-rewrite


    【解决方案1】:

    当使用 http:// 或 https:// 时,添加您指定的 RewriteCondRewriteRule 会给我 ?off_example.com。这是预期的吗?

    不,这不是预期的结果 - 这将是问题所在。当通过https://... 访问时,HTTPS 应该是on。如果HTTPS 服务器变量 从未设置为“on”(或者更确切地说,永远不会从“off”更改),那么您的RewriteRule 将导致重定向循环。

    这表明“让我们在 Plesk 中加密插件”是通过某种“代理”(前端)服务器实现的?您的应用程序服务器仍然通过未加密的 HTTP 响应代理,并且客户端与代理的​​连接通过 HTTPS 加密。至少,看起来是这样的——但你的主人应该能够确认这一点。

    如果是这种情况,那么代理通常会设置额外的 HTTP 请求标头,其中包含有关客户端连接的详细信息。您应该能够检查应用程序看到的请求标头,但通常使用正在使用的协议(“http”或“https”)设置 X-Forwarded-Proto 标头。如果是这种情况,那么您可能可以将现有指令更改为以下内容:

    RewriteEngine On
    RewriteCond %{HTTP:X-Forwarded-Proto} !https [OR]
    RewriteCond %{HTTP_HOST} ^www\. [NC]
    RewriteRule ^ https://example.com%{REQUEST_URI} [L,NE,R=301]
    

    另一种不太常见的方法是让(前端)服务器设置HTTPS 环境变量(可能是provided by mod_ssl?) - 请注意,这与类似命名的不同HTTPS 服务器变量,如上所述。此环境变量使用 mod_rewrite 指令中的语法%{ENV:HTTPS} 访问,如果设置,则包含与HTTPS 提供的相同值服务器变量 .例如:

    RewriteEngine On
    RewriteCond %{ENV:HTTPS} off [OR]
    RewriteCond %{HTTP_HOST} ^www\. [NC]
    RewriteRule ^ https://example.com%{REQUEST_URI} [L,NE,R=301]
    

    【讨论】:

    • 您建议的解决方案有效,谢谢!看标题提醒我使用了Cloudflare CDN,所以我猜这是这里的代理?我看到这里描述了 Cloudflare 的 SSL 重定向选项:link 所以现在我想我需要找出最有效的解决方案是什么。
    • Cloudflare 确实是代理 - 如果您使用“灵活 SSL”选项,那么您将需要上述指令。但是,如果您使用 Cloudflare,那么设置页面规则可能是首选选项:How do I redirect all visitors to HTTPS/SSL?
    猜你喜欢
    • 2018-12-29
    • 1970-01-01
    • 2011-01-02
    • 2014-09-29
    • 2018-01-13
    • 1970-01-01
    • 1970-01-01
    • 2014-07-26
    • 2017-03-30
    相关资源
    最近更新 更多