76

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

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

4

7 回答 7

125

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

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

更新:

从技术角度来看,上述解决方案有效。但是

几年后,用户将收到一个巨大的警告,表明连接不是私有的。这是意料之中的:今天的浏览器都不会默默地从加密连接切换到未加密连接,原因很明显......你无法绕过标准浏览器的这种行为。然而,这与重定向本身无关。这就是当今网络的运作方式,保护用户免受犯罪意图侵害的方式。

于 2012-10-21T17:02:48.620 回答
39

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

于 2014-07-29T17:45:50.070 回答
13

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

于 2016-01-08T10:15:48.137 回答
10
RewriteEngine On
RewriteCond %{SERVER_PORT} 443
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
于 2014-07-20T11:18:51.907 回答
4

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

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

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

于 2015-07-23T07:10:30.583 回答
1
RewriteCond %{HTTP:X-Forwarded-Proto} =https
于 2016-05-10T16:47:56.720 回答
0

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

例子:

<VirtualHost *:443>
  SSLEnable

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

</VirtualHost>
于 2016-05-18T12:11:59.520 回答