目标是在具有活动SSL的共享托管服务上将HTTP和www永久重定向到https://example.com
。
几次尝试;有些涉及到类似
的规则RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://example.com/$1 [R,L]
以及其他涉及例如Rahil Wazir的StackOverflow帖子之类的规则的尝试:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.example.com$
RewriteCond %{SERVER_PORT} !^443
RewriteRule ^(.*)$ http://example.com/$1 [L, R=301]
RewriteCond %{HTTP_HOST} ^www.example.com$
RewriteCond %{SERVER_PORT} ^443
RewriteRule ^(.*)$ https://example.com/$1 [L, R=301]
到目前为止,还没有尝试完全达到目标。你能帮我吗?
请注意,https://www.example.com
也应永久重定向到https://example.com
。
答案 0 :(得分:1)
假设您没有实现HSTS(在这种情况下,您应该实现两个单独的重定向,第一个是在同一主机上从HTTP到HTTPS ),那么您可以执行以下操作在.htaccess
文件的顶部:
RewriteEngine On
# Redirect HTTP to HTTPS (and www to non-www)
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule (.*) https://example.com/$1 [R=302,L]
HTTPS
服务器变量是一种替代方法(并且更具可读性),它可以检查是否已启用HTTPS,而不是显式地检查SERVER_PORT
。
请注意,这是302(临时)重定向。仅当您测试它可以正常工作时,才将其更改为301(永久)重定向。
在测试之前,您需要清除浏览器缓存。
您发布的指令存在问题:
RewriteCond %{SERVER_PORT} 80 RewriteRule ^(.*)$ https://example.com/$1 [R,L]
这仅将HTTP重定向到HTTPS。它不会规范化对https://www.example.com/
的请求。这也是临时(302)重定向。
RewriteCond %{HTTP_HOST} ^www.example.com$ RewriteCond %{SERVER_PORT} !^443 RewriteRule ^(.*)$ http://example.com/$1 [L, R=301]
除了语法上无效(RewriteRule
标志之间有一个空格-这将导致500 Internal Server Error)之外,这仅重定向www
和 HTTP。但是它重定向到HTTP,而不是HTTPS!因此,它将无法规范化/重定向http://example.com/
或https://www.example.com
。
RewriteCond %{HTTP_HOST} ^www.example.com$ RewriteCond %{SERVER_PORT} ^443 RewriteRule ^(.*)$ https://example.com/$1 [L, R=301]
同样,由于上述原因,RewriteRule
指令在语法上无效。这仅重定向www
和 HTTPS。因此,它无法规范化http://example.com/
或http://www.example.com
。