HSTS和重定向

时间:2018-09-08 16:25:12

标签: apache .htaccess redirect mod-rewrite hsts

我在https://hstspreload.org这里测试我的网站,但出现此错误:

  

错误:HTTP首先重定向到www

     

http://example(HTTP)应该立即重定向到https://example   (HTTPS),然后再添加www子域。现在,第一个重定向   是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]

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

任何评论/建议/建议/烂番茄:-)

1 个答案:

答案 0 :(得分:0)

评论摘要:

  • 从顶部到底部读取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. 没有重写器适用,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>