将http和www都重定向到https://example.com

时间:2019-01-13 00:32:07

标签: .htaccess redirect mod-rewrite

目标是在具有活动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

1 个答案:

答案 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