使用.htaccess强制SSL和WWW

34

我想知道这段用于在URL中强制使用SSL和WWW的.htaccess代码是否正确,因为我通常会遇到重定向循环的问题(例如RewriteCond %{HTTPS} !=on),但现在它运行得非常好。另外,有没有可能将其写得更好/更简单?

# Force to SSL
RewriteCond %{HTTP:HTTPS} !1
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

# Force to WWW
RewriteCond %{HTTP_HOST} !^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]  

1
可能是Force SSL/https using .htaccess and mod_rewrite的重复问题。您也可以尝试Code Review Stack Exchange - jww
那不是我特别寻找的。我会尝试使用Code Review Stack Exchange,谢谢。 - user2406937
7个回答

64

那就简单多了。

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

请问您能否解释一下条件吗?我在这方面有点新手。 - Sam
1
第2行检查HTTPS是否关闭,然后与第3行有一个OR条件。第3行检查主机名是否与www.domain.com不同。如果其中一个为真,则最后一行采取行动并重定向“R = 301”,使用HTTP代码301重定向到https://www.domain.com/。 - Aley
1
通过这种方式,所有的子域名也会被重定向。例如,api.domain.com 会变成 www.domain.com。有没有办法只将 www 添加到根域名 domain.com,而不是任何子域名? - Sam
1
这将不会将 https://example.com 重定向到 https://www.example.com - Ramesh-X
不要以为这对子文件夹有效,如果你在它们上面有另一个 .htaccess。 - Bruno Simoes
显示剩余2条评论

37

使用此代码:

RewriteEngine on

# Force www: from https://dev59.com/xW445IYBdhLWcg3wUoxe#4958847
RewriteCond %{HTTP_HOST} !^$
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# Force SSL: From http://stackoverflow.com/q/24322035/
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=302,L,NE]

将SSL重定向设置为临时的而不是永久的,有什么原因吗? - Jabari
2
@Jabari 看起来我可能已经粘贴了这两个代码片段(请参见URL)。但是通常情况下,在测试时建议使用302,然后当您确定重定向有效时,请转到301。 - zx81

13

我认为这是一个很棒的代码片段。不需要输入域名。这将在任何情况下都强制使用WWWHTTPS。这也适用于子文件夹。

RewriteEngine On

RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]

RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

2
我认为我更喜欢这个。 - warmwhisky
完美可靠地工作。 - Callum Kerr

3
抱歉打扰了这个话题,但我想为搜索引擎访问者添加一个简单的解决方案。
RewriteEngine on
# Force WWW & SSL
RewriteCond %{HTTP_HOST} !^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://www.stackoverflow.com/$1 [L,R=301] 

2

我找到了一个mod_rewrite的解决方案,适用于代理和非代理服务器。

如果你正在使用CloudFlare、AWS Elastic Load Balancing、Heroku、OpenShift或任何其他云/ PaaS解决方案,并且在正常的HTTPS重定向中遇到重定向循环问题,请尝试使用以下代码片段。

RewriteEngine On

# If we receive a forwarded http request from a proxy...
RewriteCond %{HTTP:X-Forwarded-Proto} =http [OR]

# ...or just a plain old http request directly from the client
RewriteCond %{HTTP:X-Forwarded-Proto} =""
RewriteCond %{HTTPS} !=on

# Redirect to https version
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

我已经折磨自己一个星期,试图让 CloudFlare 后面的主机正确地工作 SSL。你的代码运行得非常好... - Woody

1

9力www:非常完美,谢谢。

我的服务器是Heart Internet,Heart的强制SSL是:

# All calls go to SSL
RewriteEngine On
RewriteCond %{ENV:HTTPS} !=on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

0

我曾经遇到过同样的问题,我使用了这个方法来解决它。效果最好。

RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L,NE]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接