9 mod-rewrite .htaccess redirect hsts
我在共享主机 LAMP 环境中管理一个小网站:这基本上意味着我唯一可以编辑的是 htaccess 文件。
我想添加 HSTS 支持(我做到了),但是,当我在这里测试我的网站是否符合 HSTS 预加载资格时,出现以下错误:
错误:HTTP 首先重定向到 www
http://example
(HTTP)https://example
在添加 www 子域之前应立即重定向到(HTTPS)。现在,第一个重定向是到https://www.example.
需要额外的重定向以确保任何支持 HSTS 的浏览器都会记录顶级域的 HSTS 条目,而不仅仅是子域。
所以,我想我应该这样重定向用户:
http://example
(这是用户在浏览器地址栏中输入的内容)https://example
(我们将他重定向到该网站的 HTTPS 版本)https://www.example
(我们再次将他重定向到子域 www)我目前的重定向是这样完成的:
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]
Run Code Online (Sandbox Code Playgroud)
我试图在最后一行之前添加一个重定向,这样:
RewriteRule ^(.*)$ https://example.com/$1 [R,L]
Run Code Online (Sandbox Code Playgroud)
但我从浏览器收到“页面未正确重定向”错误。
那么,将用户从网站的 http 版本重定向到 https 并最终重定向到带有 www 的 https 的正确方法是什么?以及:有任何风险吗?
MrW*_*ite 10
- 如果您正在侦听端口 80,则在同一主机上从 HTTP 重定向到 HTTPS。
您需要重定向到同一主机(即HTTP_HOST
),而不仅仅是example.com
首先。example.com
如果用户www.example.com
直接请求,则不需要重定向到。(测试将涉及对 的请求example.com
。)之后,如果需要,您可以重定向到规范的 www 子域。
我试图在最后一行之前添加一个重定向,这样:
Run Code Online (Sandbox Code Playgroud)RewriteRule ^(.*)$ https://example.com/$1 [R,L]
这将创建一个重定向循环,因为前面的RewriteCond
指令仅适用于第一个RewriteRule
,因此第二个RewriteRule
将无条件运行。
请尝试以下操作:
# HTTP to HTTPS redirect
RewriteCond %{SERVER_PORT} 80
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R,L]
# Canonical www redirect
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule (.*) https://www.%{HTTP_HOST}/$1 [R,L]
Run Code Online (Sandbox Code Playgroud)
所述HTTP_HOST
服务器变量包含的值Host
的HTTP请求报头(即,正被请求的任何主机)。
第二个重定向状态...对于所有请求,其中请求的主机未启动,www.
然后www.
是主机的前缀。但是,如果您有多个子域(解析到同一位置)想要保持分开,这可能是不可接受的,因为它们自然会被重定向到 www 子域。
请注意,这些是 302(临时)重定向。仅当您确定它工作正常时才更改为 301。
以及:有任何风险吗?
没有风险。是的,可能有两个重定向,而以前可能只有一个(可以说效率较低)。但是仍然只有两个重定向,这对于 SEO 来说是完全可以的。此外,使用 HSTS,用户代理最多只会经历一次双重重定向。
Run Code Online (Sandbox Code Playgroud)RewriteCond %{SERVER_PORT} 80 RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]
旁白:(暂时忽略 HSTS...)这本身并不完整,因为它没有规范化https://example.com/...
(即 HTTPS 和域顶点)的请求。
进一步阅读:
.htaccess
以下位置实施 HSTS :https : //webmasters.stackexchange.com/a/112264/52912 归档时间: |
|
查看次数: |
2054 次 |
最近记录: |