使用 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)