apache将http重定向到https,将www重定向到非www

Posted

技术标签:

【中文标题】apache将http重定向到https,将www重定向到非www【英文标题】:apache redirect http to https and www to non www 【发布时间】:2012-04-14 07:07:28 【问题描述】:

基本上我想要的是重定向 al 请求以使用 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 放在通用名称中,以避免此类问题。 证书是为 domain.com(非 www)制作的,基本上我希望所有流量都转到非 www 和 https 【参考方案1】:

您必须重新颁发有 www 和没有 www 的证书。

如果有人通过您常用名称中未包含的域名连接到您的网站,他们将收到警告。

ssl 协商过程发生在来自服务器的任何响应(在您的情况下为重定向)之前,因此在所有情况下,您的访问者在使用不在您的域中的域时都会收到警告通用名。

【讨论】:

您的答案应该被标记为正确的答案,但我还必须注意,目前,Chrome 确实会在验证证书之前处理 301 重定向,而不会向用户发出警告,而 Safari 则不会。通用方法是按照您的说明进行操作。【参考方案2】:

你可以从 HTTP_HOST 得到你需要的东西

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

这样,它总是会得到没有子域的主机。

【讨论】:

+1 但你真的应该将 RewriteRule 行更改为:RewriteRule ^ https://%1%REQUEST_URI [L,R=301] 不过,我认为这个答案不会解决 OP 关于访问者收到警告的问题。 @baynezy 代码只会重定向非 ssl 连接。这不能解决您将https://www.mysite.com 重定向到https://mysite.com 或访问者在访问https://www.mysite.com 时收到警告的问题 不能解决https://www.mysite.com重定向到https://mysite.com的问题 我已经搜索了几个小时,这是唯一有效的答案。请记住,上述 cmets 是正确的。这几乎适用于所有实例,除非它们以 https://www. 开头而不是 http://www【参考方案3】:
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]

【讨论】:

虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。【参考方案4】:

如果您使用的是 CloudFlare 的免费帐户,那就是问题所在。 CloudFlare 的免费帐户不支持 SSL 证书。要继续使用具有 SSL 证书的 CloudFlare 的免费帐户,只需转到 CloudFlare 中的 DNS 设置,然后将橙色云从您的域和 cname WWW 中删除。这将解决您的问题并导致 www 和非 www 都被重定向到 https。

还要确保将此代码添加到您的 .htaccess 文件中:

RewriteEngine On
RewriteCond %HTTPS !=on
RewriteRule ^ https://%HTTP_HOST%REQUEST_URI [L,R=301]

那么,一切都应该正常了!

【讨论】:

【参考方案5】:
RewriteEngine On 
RewriteCond %HTTPS off 
RewriteCond %HTTP_HOST ^(?:www\.)?(.*)$ [NC]
RewriteRule (.*) https://www.%1%REQUEST_URI [L,R=301]

【讨论】:

【参考方案6】:

看看这个:

RewriteEngine On
RewriteCond %HTTP_HOST#%HTTPSs ^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]

【讨论】:

【参考方案7】:

如果您已为每个域配置文件完成 CERTBOT,这会将您的所有 www 网站重定向到非 www 并保护它们。把它放在目录 /www 部分的 /etc/apache2/apache2.conf 中:

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。

【讨论】:

以上是关于apache将http重定向到https,将www重定向到非www的主要内容,如果未能解决你的问题,请参考以下文章

从 Apache VirtualHost 将 HTTPS 永久重定向到 HTTP

将http非www重定向到https非www

如何使用 VirtualHost 将 http://example.com 重定向到 apache2.conf 中的 https://example.com

如何将所有请求重定向到 https)://www.domain name.tld/

在 apache red hat 中将 http 重定向到 https

Apache 2.4 将本地虚拟主机重定向到 https 而不是 http