【问题标题】:Redirect www. to non-www and redirect all http to https with .htaccess重定向www。到非 www 并使用 .htaccess 将所有 http 重定向到 https
【发布时间】:2017-01-12 00:37:09
【问题描述】:

问了数百万次的问题,但是在阅读了这里的许多答案之后,我仍然无法弄清楚这一点。我需要重定向所有请求,如下所示:

  1. http://domain.tld > https://domain.tld
  2. http://www.domain.tld > https://domain.tld
  3. https://www.domain.tld > https://domain.tld
  4. http://sub.domain.tld > https://sub.domain.tld(当.htaccess 放在子域文件夹中时)

到目前为止,我一直在使用 html5boilerplate 中的代码,将 www 解决为非 www

<IfModule mod_rewrite.c>
  RewriteCond %{HTTPS} !=on
  RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
  RewriteRule ^(.*)$ http://%1/ [R=301,L]
</IfModule>

他们还有一个 http 到 https 重定向的代码,但是在添加这段代码后(在 www 重定向之上),页面正在加载并且在超时后它显示错误/重定向太多

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{HTTPS} !=on
  RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
</IfModule>

我也尝试过this SO answer 之类的示例,但该网站仍然无法正常工作。目前唯一的解决方案是使用第一段代码并将 http 替换为 https 但这并不能解决最重要的重定向 (1)

当前完整的.htaccess 内容:

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteBase /

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)\/$ /$1 [R=301,L]

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule /?([A-Za-z0-9_-]+)/?$ index.php?id=$1 [QSA,L]

    #RewriteCond %{HTTPS} off [OR] #by uncommenting this, site stops working
    RewriteCond %{HTTP_HOST} ^www
    RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$
    RewriteRule ^ https://%1%{REQUEST_URI} [R,L]
</IfModule>

【问题讨论】:

    标签: .htaccess redirect mod-rewrite


    【解决方案1】:

    要在单个 http 请求中重定向到 https 和非 www,您可以使用

    RewriteEngine on
    RewriteCond %{HTTPS} off [OR]
    RewriteCond %{HTTP_HOST} ^www
    RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$
    RewriteRule ^ https://%1%{REQUEST_URI} [NE,L,R]
    

    在测试此规则之前清除浏览器的缓存。

    【讨论】:

    • 试过了,但在清理缓存和硬重新加载后,我仍然在 Chrome 中得到“ERR_TOO_MANY_REDIRECTS”。我得到domain.tld 正确,但之后,它正在加载并抛出错误
    • 你在使用云耀斑吗?
    • 不,我没有使用 CF 或任何其他 CDN。我刚刚安装了 Let's Encrypt 证书并想使用它(如果我直接转到 https: 页面或使用 www.domain,它就可以正常工作)
    【解决方案2】:

    有时,根据某些服务器配置,HTTPS 变量似乎总是设置为 off。这可以解释循环,我已经在 SO 上看到过类似的案例。

    一个简单的解决方法是测试 SERVER_PORT(如果您使用默认 80 和 443),或者您也可以测试 HTTP:X-Forwarded-Proto

    示例(1)测试是否不是 https:

    RewriteCond %{HTTP:X-Forwarded-Proto} !https
    

    示例(2)测试是否不是 https:

    RewriteCond %{SERVER_PORT} !403
    

    【讨论】:

    • 谢谢贾斯汀,示例 1 在所有主机上都能完美运行,示例 2 的行为与其他主机相同,重定向太多
    • 因此,在一个主机上,示例 2 有效,示例 1 无效。很高兴有所有可能的解决方案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-02
    • 2018-11-12
    • 2020-05-27
    • 1970-01-01
    相关资源
    最近更新 更多