【问题标题】:Https to http redirect using htaccess使用 htaccess 将 Https 重定向到 http
【发布时间】:2012-10-11 13:59:09
【问题描述】:

我正在尝试将https://www.example.com 重定向到http://www.example.com。我在 .htaccess 文件中尝试了以下代码

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

此代码成功地将https://example.com 重定向到http://www.example.com。但是,当我输入 https://www.example.com 时,它会在浏览器中显示“网页不可用”错误。

我也试过以下2个代码都没有成功

尝试 1

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^/(.*):NOSSL$ http://www.example.com/$1 [R=301,L]

尝试 2

RewriteEngine On
RewriteCond %{HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI}

以上两次尝试都失败了。有什么建议吗?

【问题讨论】:

    标签: apache .htaccess http https


    【解决方案1】:

    尝试 2 接近完美。稍微修改一下:

    RewriteEngine On
    RewriteCond %{HTTPS} on
    RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
    

    【讨论】:

    • 如果您不想永久,最好使用R=302。当我的 SSL 过期时,这给我带来了麻烦,我想在经历痛苦的​​续订程序之前暂时回到 http
    • 痛苦的更新?应该是证书文件的翻转或简单的脚本执行...... 302的问题是客户端每次都必须遵循它,因此您提高了客户端和服务器端的请求数。
    • @arkascha 只是想明白,RewriteCond 会充当 if 语句写入吗?我的意思是只有在它找到 https 的地方才会运行下一个重写规则。我在问,因为谷歌在其索引中自动获取了几个 https url,而我们没有从任何地方链接它们。因此,为了排除任何错误,我们使用上面的代码来 302 all https url
    • 你基本上是对的。看看优秀的文档对您来说确实很有意义:httpd.apache.org/docs/current/mod/mod_rewrite.html
    • 除此之外:谷歌确实更喜欢 url 的 ssl 变体,如果它可以找到它们的话。有很好的理由。我看不出你为什么要阻止这种情况......
    【解决方案2】:

    但是,如果您的网站没有安全证书,它位于共享托管环境中,并且您不想在通过 https 请求您的网站时收到“警告”,则无法使用重定向它访问。原因是警告消息在请求到达 htaccess 文件之前就被触发了,所以你必须在服务器上修复它。转到 /etc/httpd/conf.d/ssl.conf 并注释掉有关虚拟服务器 443 的部分。但很可能您的托管服务提供商不会给您太多控制权。因此,您必须移动到不同的主机或购买 SSL,以便在您的 htaccess 有机会重定向之前不会触发警告。

    【讨论】:

    • 感谢您的回答。由于我们现有的网站没有 SSL 证书,因此无论我的 .htaccess 多么正确,它都无法正常工作。
    • @arkascha 我尝试了这里分享的各种方法,但都没有奏效。是的,我在共享环境中进行了测试。尽管共享 SSL 是免费的,但 SSL 未激活。有问题的 https 链接是历史/继承自以前启用 SSL 的环境。我不介意浏览器警告(在开发模式下),但我至少需要重定向发生。有谁能提供更多潜在客户?
    • 有效答案。由于不兼容的安全协议(不再维护 TLS 1.0),我想将 IE9 从 https 重定向到 http。但无论我做什么,它都没有奏效。由于安全协议在 .htaccess 命令之前生效。
    • 我发现新版 Microsoft Edge 甚至可以在共享主机站点上运行。 Firefox 和 Chrome 继续发出警告,但新 Edge 在重定向到警告之前会看到 .htaccess 信息。带有 Chromium 引擎的新 Edge 浏览器很棒!
    【解决方案3】:

    您可以使用以下规则从 https 重定向到 http

     RewriteEngine On
    
    
    RewriteCond %{HTTPS} ^on$
    RewriteRule ^(.*)$ http://example.com/$1 [NC,L,R]
    

    解释:

    RewriteCond %{HTTPS} ^on$
    

    检查 HTTPS 是否开启(使用 https 发出请求)

    那么

    RewriteRule ^(.*)$ http://example.com/$1 [NC,L,R]
    

    重定向任何请求 (https://example.com/foo) http://example.com/foo .

    • $1 是 RewriteRule 模式中正则表达式的一部分,它包含在 (.+) 中捕获的任何值,在这种情况下,它会捕获完整的 request_uri 域名后面的所有内容。

    • [NC,L,R] 是标志,NC 使 uri 区分大小写,您可以在请求中使用大写或小写字母。

    如果当前规则匹配,L 标志告诉服务器停止处理其他规则,当您在块中有更多规则时,使用 L 标志避免规则冲突很重要。

    R 标志用于进行外部重定向。

    【讨论】:

      【解决方案4】:
      RewriteEngine On
      RewriteCond %{SERVER_PORT} 443
      RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
      

      【讨论】:

        【解决方案5】:

        http 和 https 的区别在于 https 请求是通过 ssl 加密的连接发送的。在浏览器发送http请求之前,浏览器和服务器之间必须建立ssl加密连接。

        Https 请求实际上是通过 ssl 加密连接发送的 http 请求。如果服务器拒绝建立 ssl 加密连接,则浏览器将没有连接来发送请求。浏览器和服务器将无法相互交谈。浏览器将无法发送它想要访问的 url,服务器将无法响应重定向到另一个 url。

        所以这是不可能的。如果你想响应 https 链接,那么你需要一个 ssl 证书。

        【讨论】:

          【解决方案6】:
          RewriteCond %{HTTP:X-Forwarded-Proto} =https
          

          【讨论】:

          • 这对我帮助很大。
          • 当上述其他解决方案导致错误“重定向过多”时,此解决方案在特定服务器托管 (ergonet.it) 中运行良好,谢谢!
          • 如果您的应用程序服务器位于管理安全连接的前端代理后面,则需要检查 X-Forwarded-Proto HTTP 请求标头。
          【解决方案7】:

          您的代码是正确的。只需将它们放入<VirtualHost *:443>

          例子:

          <VirtualHost *:443>
            SSLEnable
          
            RewriteEngine On
            RewriteCond %{HTTPS} on
            RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI}
          
          </VirtualHost>
          

          【讨论】:

            猜你喜欢
            • 2019-03-18
            • 2015-11-10
            • 2018-08-31
            • 2012-11-02
            • 1970-01-01
            • 2015-02-16
            • 1970-01-01
            • 2015-12-06
            • 2018-02-02
            相关资源
            最近更新 更多