通过htaccess强制使用非www和https

21

我想强制用户重定向到非www网站,并强制使用https。

我有以下代码,它有点起作用,但当输入http时无法强制使用https。

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

有没有关于我做错了什么的想法?

4个回答

51

试试这个规则:

RewriteCond %{HTTP_HOST} ^(www\.)(.+) [OR]
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^(www\.)?(.+)
RewriteRule ^ https://%2%{REQUEST_URI} [R=301,L]

@Jon:TLS/SSL层位于HTTP之上(HTTPS也被称为“HTTP over TLS/SSL”)。因此,在将连接传递给HTTP并进行HTTP重定向之前,必须建立TLS/SSL连接并验证证书。你无法修复这个问题。 - Gumbo
感谢您的更新,只是想确认一下 - 没有任何解决方法吗?(完全没有,或者您不知道有吗?) - Jon
@Jon:不,我不知道有任何解决方案。 - Gumbo
1
这对我来说产生了一个重定向循环。我发现这个答案有用:https://dev59.com/YWEi5IYBdhLWcg3wPKWx#21467534 - bobsoap
当我使用子域名时,也遇到了重定向循环的问题。 - Džuris

5
根据Gumbo的评论:“在TLS/SSL连接建立并验证证书之前,它将被传递给HTTP并进行HTTP重定向”,我尝试了以下方法(看起来很有效):
RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://www.blahblah.com/$1 [R,L]

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

请告诉我,如果这种方法有问题,请指出来。

4
唯一适用于我的规则如下:
# match any URL with www and rewrite it to https without the www
    RewriteCond %{HTTP_HOST} ^(www\.)(.*) [NC]
    RewriteRule (.*) https://%2%{REQUEST_URI} [R=301,L]

# match non https and redirect to https
    RewriteCond %{HTTP:X-Forwarded-Proto} !https
    RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

顺序很重要,它可以防止在某些情况下出现第三次重定向。


0
使用此代码,我将从http和www以及无www重定向到https无www。只需注意在htaccess中插入代码的位置很重要:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

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

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