证书必须涵盖 www 和非 www https。一些提供商的证书涵盖 www.xxxx.yyy 两者,但仅涵盖 xxxx.yyy 一个。
开启重写:
RewriteEngine On
让所有http使用https:
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://xxx.yyy/$1 [L,R=301]
只让 www https 使用非 www https:
RewriteCond %{SERVER_PORT} 443
RewriteCond %{HTTP_HOST} ^www[.].+$
RewriteRule ^(.*)$ https://xxxx.yyy/$1 [L,R=301]
不能处理非www https,否则会出现循环。
在 [L,R=301]:
- L = 如果规则已处理,则不再处理。
- R=301 = 告诉浏览器/机器人进行永久重定向。
更通用
一种更通用的方法——不依赖于端口——是:
RewriteCond %{HTTP_HOST} ^www\.
RewriteRule ^(.*)$ https://xxxx.yyy/$1 [R=301,QSA]
使用www 制作任何网址。
RewriteCond %{HTTPS} !on
RewriteCond %{HTTPS} !1
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTP:X-Forwarded-SSL} !on
RewriteRule ^(.*)$ https://xxxx.yyy/$1 [R=301,QSA]
要强制使用任何非 https 的 URL,即使对于那些从丢弃 https 的负载平衡器下游的系统,请使用 https。
请注意,我还没有测试过forwarded 选项,因此如果您遇到任何问题,我们将不胜感激。如果您的系统不在负载均衡器后面,则可以省略这些行。
是否到 HTTP_HOST
您可以使用${HTTP_HOST} 作为RewriteRule 中URL 的一部分,也可以使用明确的规范域名文本(上面的xxxx.yyy)。
明确指定域名可确保不会在用户提供的 URL 中使用任何不恰当的字符弯曲手段来欺骗您的网站做一些它可能没有准备好的事情,或者至少确保正确的无论打开页面的是哪个 URL 字符串,地址栏中都会显示域名。
它甚至可能有助于将 punycode 编码的域转换为在地址栏中显示正确的 unicode 字符。