如何将 HTTPS 重定向到 HTTP?
题
如何将 HTTPS 重定向到 HTTP?也就是说,与(看似)每个人所教的相反。
我有一个 HTTPS 服务器,我为此支付了 SSL 认证,还有一个镜像,但我没有购买,只是为了紧急情况而保留,所以不值得获得认证。
在我客户的桌面上,我有一些指向的快捷方式 http://production_server
和 https://production_server
(两者都有效)。但是,我知道如果我的生产服务器出现故障,那么 DNS 转发就会启动,而那些快捷方式上有“https”的客户端将盯着 https://mirror_server
(这不起作用)和一个又大又肥的 Internet Explorer 7 红屏,让我的公司感到不安。
不幸的是,我不能只在客户端级别进行切换。这些用户非常不懂计算机:并且很可能会因看到 HTTPS“不安全”错误而惊慌失措(尤其是 Firefox 3 和 Internet Explorer 7 现在处理它的方式:句号,有点谢天谢地,但没有帮助我,哈哈)。
它是 好简单 找到 阿帕奇解决方案 为了 http->https 重定向, ,但为了我的一生,我不能做相反的事情。
有想法吗?
解决方案
这还没有经过测试,但我认为这应该使用 mod_rewrite 工作
RewriteEngine On
RewriteCond %{HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI}
其他提示
请记住,重写引擎仅在收到 HTTP 请求后才会启动 - 这意味着您仍然需要证书,以便客户端建立连接来发送请求!
但是,如果备份计算机看起来具有相同的主机名(就客户端而言),那么您没有理由不能使用与主生产计算机相同的证书。
根据ejunker的回答,这是适合我的解决方案,不是在单个服务器上而是在一个服务器上 云 环境
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{ENV:HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
对于那些正在使用 .conf
文件。
<VirtualHost *:443>
ServerName domain.com
RewriteEngine On
RewriteCond %{HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI}
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/domain.crt
SSLCertificateKeyFile /etc/apache2/ssl/domain.key
SSLCACertificateFile /etc/apache2/ssl/domain.crt
</VirtualHost>
如果上述解决方案都不适合您(它们不适合我),那么以下是在我的服务器上有效的解决方案:
RewriteCond %{HTTPS} =on
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [L,R=301]
当我使用 cloudflare 时,上述所有内容都不起作用,这对我有用:
RewriteCond %{HTTP:X-Forwarded-Proto} =https
RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
这绝对可以在没有代理的情况下工作:
RewriteCond %{HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
最好尽可能避免使用 mod_rewrite。
在你的情况下,我将用以下内容替换重写:
<If "%{HTTPS} == 'on'" >
Redirect permanent / http://production_server/
</If>
这 <If>
根据此指令仅在 Apache 2.4+ 中可用 在这里写博客.
在 WordPress 网站上,没有一个答案对我有用,但以下有效(它与其他答案类似,但有一点变化)
RewriteEngine On
RewriteCond %{HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
这对我有用。
<VirtualHost *:443>
ServerName www.example.com
# ... SSL configuration goes here
Redirect "https://www.example.com/" "http://www.example.com/"
</VirtualHost>
<VirtualHost *:80>
ServerName www.example.com
# ...
</VirtualHost>
请务必监听端口 80 和 443。
据我所知,简单的元刷新也可以正常工作而不会导致错误:
<meta http-equiv="refresh" content="0;URL='http://www.yourdomain.com/path'">