将Apache重定向HTTP到HTTPS和www到非www

24
基本上我想要的是将所有请求重定向到使用HTTPS而不是HTTP。
我已经在我的htaccess文件中添加了以下代码,它工作得很好: 代码:
<IfModule mod_rewrite.c> 
RewriteEngine On 
RewriteCond %{HTTPS} off 
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} 
</ifModule> 

今天有人发现,当访问:http://www.example.com时,它会重定向到并显示一个不安全的连接提示。

我的SSL设置是针对非WWW域名:mydomain.com的。

因此,我需要确保所有站点请求都发送到非WWW和HTTPS:

如果我输入example.com就可以正常工作,它会重定向到https://example.com

但是使用www.example.com,则会转到htts://www.example.com并显示错误信息。

我需要在代码中添加什么来将WWW重定向到非WWW,然后再重定向到SSL?


你的证书中有哪些常见名称?大多数CA在颁发证书时会将www和非www放入通用名称中,以避免出现这种问题。 - Pierre-Olivier
证书是为domain.com (非www)而制作的。 基本上,我希望所有流量都转到非www和https。 - misulicus
7个回答

25
你需要重新发行包括www和不包括www的证书。
如果有人通过未包含在你的通用名称中的域名连接到你的站点,他们将收到一个警告。
SSL协商过程发生在服务器响应之前(在你的情况下,是重定向),所以在所有情况下,当使用未包含在你的通用名称中的域名时,你的访问者将收到一个警告。

您的答案应被标记为正确,但我也必须指出,当前Chrome在证书验证之前处理301重定向而不会向用户发出任何警告,而Safari则不会。通用的方法是按照您所解释的方式进行。 - ezwrighter

19

你可以从HTTP_HOST获取你需要的内容。

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

这样它就总是获取主机名而不包括子域名。


1
+1 但你应该真正更改RewriteRule行为:RewriteRule ^ https://%1%{REQUEST_URI} [L,R=301] - anubhava
2
我认为这个答案不会解决原帖作者关于访问者收到警告的问题。 - Pierre-Olivier
13
这段代码只会重定向非 SSL 连接。这无法解决您需要将 https://www.mysite.com 重定向到 https://mysite.com,或者访问者在访问 https://www.mysite.com 时收到警告的问题。 - Pierre-Olivier
1
@Pierre-OlivierBourgeois 确实如此,但没有人会键入 https://www. 大多数人只会输入 www.domain.com,现在已经重定向到 https://。 - misulicus
7
无法解决将 https://www.mysite.com 重定向到 https://mysite.com 的问题。 - Francis P
2
我已经搜索了几个小时,这是唯一有效的答案。但请记住上面的评论是正确的。这将适用于几乎所有情况,除非它们以“https://www。”而不是“http://www”开头。 - bryan

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

2
虽然这段代码可能回答了问题,但是提供关于为什么和/或如何回答问题的额外上下文可以提高其长期价值。 - Donald Duck

2
如果您正在使用CloudFlare的免费账户,则会出现问题。 CloudFlare的免费账户不支持SSL证书。要继续使用CloudFlare的免费账户并使用SSL证书,只需进入CloudFlare中的DNS设置,并将域名和cname WWW上的橙色云去掉即可。这将解决您的问题,并导致www和非www都被重定向到https。
还要确保将此代码添加到您的.htaccess文件中:
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

然后,一切应该正常工作!

1
这将把你所有的www网站重定向到非www,并在完成每个域配置文件的CERTBOT后对它们进行保护。将其放置于 /etc/apache2/apache2.conf 的 /www 部分中:
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [L,NE,R=301]

插入此代码后,无需对www域名进行CERTBOT。只需选择domain.com即可。您不需要htaccess文件。它们可以通过选择AllowOverride None进行限制。

记得重新启动Apache。


0

看看这个:

RewriteEngine On
RewriteCond %{HTTP_HOST}#%{HTTPS}s ^www\.([^#]+)#(?:off|on(s)) [NC]
RewriteRule ^ http%2://%1%{REQUEST_URI} [R=301,L]
RewriteCond %{HTTPS} !=on
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]

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

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