使用htaccess Https到http重定向

时间:2012-10-21 16:44:57

标签: apache .htaccess http https

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

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

7 个答案:

答案 0 :(得分:97)

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

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

答案 1 :(得分:29)

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

答案 2 :(得分:8)

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

答案 3 :(得分:8)

您可以使用以下规则从 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标志告诉服务器在currunt规则匹配时停止处理其他规则,当你在块中有更多的规则时,使用L标志来避免规则冲突是很重要的。

R标志用于进行外部重定向。

答案 4 :(得分:3)

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

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

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

答案 5 :(得分:1)

declare @d datetime = getdate()

select @d=cast(cast(DATEPART(yy,@d) as varchar)+'-'+ cast(datepart(mm,@d) as varchar)+'-01' as datetime) --first day of current month

;with acct as (
select ROW_NUMBER() over(partition by AcctNum order by LoadDate desc) rn,
AcctNum, Name, Balance, Status, LoadDate
from Accts
where status=1 and LoadDate < @d
)
select AcctNum, Name, Balance, Status, LoadDate
from acct
where rn=1

答案 6 :(得分:0)

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

示例:

<VirtualHost *:443>
  SSLEnable

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

</VirtualHost>