首页 > 解决方案 > HSTS 和重定向

问题描述

我在这里https://hstspreload.org测试我的网站,我收到了这个错误:

错误:HTTP 首先重定向到 www

http://example (HTTP) 应 在添加 www 子域之前立即重定向到https://example (HTTPS)。现在,第一个重定向是https://www.example。需要额外的重定向以确保任何支持 HSTS 的浏览器都会记录顶级域的 HSTS 条目,而不仅仅是子域。

据我所知,有效的重定向应该以这种方式完成:

  1. http://example(这是用户在地址栏中输入的内容)
  2. https://example(第一次重定向,到 HTTPS)
  3. https://www.example(第二次重定向,到子域 www)

目前,这是我htaccess导致重定向的代码:

RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]

是否可以/建议在此处插入另一个重定向?有没有风险?

任何评论/建议/建议/烂番茄表示赞赏:-)

标签: apache.htaccessredirectmod-rewritehsts

解决方案


评论摘要:

  • httpd.conf 和 .htaccess 中的配置从上到下阅读。
  • 对于 RewritRules,它们按顺序应用,从上到下,直到到达最后一个。应用符合条件的所有规则。
  • 为防止这种情况,您可以[L]标签添加到 RewriteRule。这个标签告诉 Apache,如果它匹配条件,它是最后应用的规则。此请求将忽略所有其他规则。

这里的重写顺序是:

  1. 客户请求http://example.com
  2. RewriteRule 将客户端重定向到https://example.com
  3. 客户回来了https://example.com
  4. 第二个 RewriteRule 将客户端重定向到https://www.example.com
  5. 客户回来了https://www.example.com
  6. 不适用 Rewriterule,Apache 响应请求。

为什么要这样做?它涵盖了所有情况。如果客户端的第一个请求已经是https://example.com,上面的场景将从第 4 步开始。

示例配置可能如下所示:

Listen *:80
<VirtualHost *:80>
    ServerName example.com
    ServerAlias www.example.com

    RewriteCond %{HTTPS} !=on
    RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

    [... OTHER CONFIGURATION ...]
</VirtualHost>

Listen *:443
<VirtualHost *:443>
    ServerName example.com
    ServerAlias www.example.com

    RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
    RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

    [... OTHER CONFIGURATION ...]
</VirtualHost>

推荐阅读