【问题标题】:apache redirect http to https and www to non wwwapache将http重定向到https,将www重定向到非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

标签: apache .htaccess redirect ssl


【解决方案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}#%{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]
      

      【讨论】:

        【解决方案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。

        【讨论】:

          猜你喜欢
          • 2017-02-02
          • 2017-11-24
          • 2017-03-24
          • 1970-01-01
          • 2016-01-07
          • 2019-12-13
          • 2014-12-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多