使用 htaccess 将 Https 重定向到 http

Posted

技术标签:

【中文标题】使用 htaccess 将 Https 重定向到 http【英文标题】:Https to http redirect using htaccess 【发布时间】: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

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

【问题讨论】:

【参考方案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>

【讨论】:

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

Htaccess 将 https 重定向到另一个 https

使用 .htaccess 将 HTTP 重定向到 HTTPS

.htaccess 使用 SSL/HTTPS 将 www 重定向到非 www

.htaccess:将主域重定向到https:// www,子域重定向到https://(不带www)

将 https ip 重定向到共享主机中 htaccess 中的域

使用 .htaccess 将 http 重定向到 https 时,某些 url 出现奇怪的 401 错误