证书必须同时包含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网址,即使对于那些丢弃https的负载均衡器下游的系统,也请使用https。
请注意,我尚未测试过这些forwarded
选项,因此希望您对任何有关这些问题的反馈感到满意。如果您的系统不在负载均衡器后面,则这些行可能会被忽略。
是否为HTTP_HOST
您可以使用${HTTP_HOST}
,作为URL中的一部分RewriteRule
,也可以使用明确的规范域名文本(xxxx.yyy
如上)。
明确指定域名可确保在用户提供的URL中不使用任何轻微的字符弯曲方式,以诱骗您的网站执行可能不准备的操作,或至少确保显示正确的域名在地址栏中,无论打开哪个URL字符串。
它甚至可以帮助转换经punycode编码的域,以在地址栏中显示正确的unicode字符。