htaccess使用SSL / HTTPS将非www重定向到www


10

我想要一个重写规则,将所有内容重定向到https:// AND www

例如http://example.com应该去https://www.example.com

这就是我所拥有的:

RewriteEngine On
RewriteCond %{SERVER_PORT} !=443
RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$ [NC]
RewriteRule ^(.*)$ "https\:\/\/www\.example\.com\/$1" [R=301,L]

Answers:


11

我找到了解决方案。

没有HSTS(单个重定向):

RewriteCond %{HTTP_HOST} !^www\.
RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTPS} off
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

使用HSTS(双重重定向):

RewriteCond %{HTTPS} off
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

1
请注意,这将在请求时导致双重重定向http://example.com(即HTTP和非www),因为它将首先重定向到同一主机上的HTTPS (即不带www),然后重定向到www第二个重定向。您可以通过简单地逆转这两个规则来纠正此问题。
MrWhite

@MrWhite @您实际上是否希望在适当的https://重定向上进行双重重定向,尤其是在使用HSTS的情况下。这样,浏览器可以为您的域存储HSTS首选项,并且后续请求始终默认为https://
xsrf

@xsrf拥有单个www HTTPS重定向仍然“适当”(而且效率更高)。它只需要当你实现HSTS保持分离。
怀特先生'18

xsrf和MrWhite都很好。我已经更新了答案。
威尔

@xsrf我用htaccess.madewithlove.be检查了两次重定向,看来它只重定向http://> https://而不是www
威尔

6

您的条件是隐式AND,并且第二个条件将始终为true(除非您具有其他域),因此您当前的规则将仅重定向非SSL流量。

您需要OR条件并否定www(第二个)条件:

RewriteEngine On
RewriteCond %{SERVER_PORT} !=443 [OR]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]

如果SERVER_PORT不是443(即不是HTTPS)主机不以www.(例如,您正在访问裸域)开头,则重定向到规范URL。

但是,这是否重定向https://example.comhttps://www.example.com将取决于您的安全证书。(您的网站需要通过SSL的www和非www都可以访问,以触发.htaccess重定向。)


1

这将同时用于www或非www如果您尝试打开带有www的链接,则将网址重定向到带有www的https

示例:http://domain.com重定向到https://domain.com

或如果您尝试打开非www的链接,则将网址重定向到非www的https

示例:http://www.domain.com重定向到https://www.domain.com

RewriteEngine on

RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

如问题所述,这不能处理非www到www重定向。
怀特先生,

您可以在htaccess RewriteCond%{HTTP_HOST}!^ www \中添加此行。RewriteRule ^(。*)$ {HTTP_HOST} / $ 1 [R = 301,L]
Ajay Patidar

更换RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]RewriteCond %{HTTP_HOST} !^www\. RewriteRule ^(.*)$ %{HTTP_HOST}/$1 [R=301,L]
阿贾伊Patidar

您可以编辑答案。
先生怀特17'Sep
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.