使用 htaccess 重定向 http

我尝试将 https://www.example.com重定向到 http://www.example.com

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,然后它给我一个“网页不可用”的错误在浏览器中。

我还尝试了以下两个代码,但没有成功

第一次尝试

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

第二次尝试

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

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

295469 次浏览

第二次尝试接近完美,只需稍作修改:

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

更新:

以上解决方案从技术角度来看是可行的:

从几年前开始,用户将收到一个巨大的警告,表明该连接不是私有的。这是意料之中的: 由于显而易见的原因,今天的浏览器都不会悄悄地从加密连接切换到非加密连接... ... 您无法避开标准浏览器的这种行为。然而,这与重定向本身没有任何关系。这就是今天网络的运作方式,用户如何免受犯罪意图的侵害。

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

然而,如果你的网站没有安全证书,它是在一个共享的托管环境,你不想得到“警告”当你的网站被请求通过 https,你不能重定向它使用 htaccess。原因是警告消息在请求进入 htaccess 文件之前就被触发了,因此您必须在服务器上修复它。转到/etc/httpd/conf/ssl.conf 并注释掉关于虚拟服务器443的部分。但是很可能你的托管服务提供商不会给你那么多的控制权。所以你要么转移到另一个主机,要么购买 SSL,这样在你的 htaccess 有机会重定向之前,这个警告就不会被触发。

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

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

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

您可以使用以下规则将 Https重定向到 译注::

 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 标志用于进行外部重定向。

RewriteCond %{HTTP:X-Forwarded-Proto} =https

你的代码是正确的,只要把它们放在 <VirtualHost *:443>里面

例如:

<VirtualHost *:443>
SSLEnable


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


</VirtualHost>