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
如何使用 VirtualHost 将 http://example.com 重定向到 apache2.conf 中的 https://example.com
如何将所有请求重定向到 https)://www.domain name.tld/