使用htaccess将Https重定向到http


73

我正在尝试将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}

以上两种尝试均失败。有什么建议?

Answers:


115

尝试2接近完美。只需对其稍作修改:

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

9
R=302如果您不想永久使用,将会很好用。当我的SSL到期时,这给我带来了麻烦,我想http在经历痛苦的​​续订程序之前暂时回到原来的位置。
ProfNandaa'9

痛苦的续约?应该是证书文件的翻转还是简单的脚本执行... 302的问题是客户端每次都必须遵循它,因此您增加了对客户端和服务器端的请求数量。
arkascha

@arkascha只是想了解,RewriteCond会充当if语句写吗?我的意思是,只有找到https的地方,它才会运行下一个重写规则。我要问的是,由于Google在其索引中自动采用了几个https url,而我们没有从任何地方链接它们。因此,为了排除任何错误,我们在上面使用了302个所有https url的代码
Ankur Jain

您基本上是正确的。这当然有一定道理的,你看看到了出色的文件:httpd.apache.org/docs/current/mod/mod_rewrite.html
arkascha

除此之外:谷歌确实更喜欢url的ssl变体,如果可以找到的话。有很好的理由。我看不出您为什么要防止这种情况发生的原因...
arkascha

39

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


2
感谢您的回答。由于我们现有的站点没有SSL证书,因此无论我的.htaccess多么正确,它都无法正常工作。
marknt15

@arkascha我已经尝试过这里共享的各种方法,但是没有一个起作用。是的,我在共享环境中进行了测试。尽管共享的SSL是免费的,但SSL没有处于活动状态。有问题的https链接是历史悠久的/继承自以前启用SSL的环境。我不介意浏览器警告(在开发人员模式下),但我至少需要进行重定向。有谁能够提供更多线索?
Pageii Studio

有效答案。我想将IE9从https重定向到http,因为不兼容的安全协议(不再维护TLS 1.0)。但是无论我做什么,都行不通。由以下事实引起的:安全协议在.htaccess命令之前生效。
Frank Conijn

我发现新的Microsoft Edge甚至可以在共享的主机站点上运行。Firefox和Chrome继续发出警告,但是新的Edge在重定向到警告之前会看到.htaccess信息。带有Chromium引擎的全新Edge浏览器很棒!
DrupalFever

12

您可以使用以下规则从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标志用于进行外部重定向。


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

4

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

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

因此这是不可能的。如果要响应https链接,则需要ssl证书。



0

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

例:

<VirtualHost *:443>
  SSLEnable

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

</VirtualHost>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.