我试图重定向所有不安全的HTTP请求在我的网站(例如http://www.example.com)到HTTPS (https://www.example.com)。我如何在.htaccess文件中做到这一点?
我用的是PHP。
我试图重定向所有不安全的HTTP请求在我的网站(例如http://www.example.com)到HTTPS (https://www.example.com)。我如何在.htaccess文件中做到这一点?
我用的是PHP。
当前回答
在.htaccess文件中使用以下代码自动将访问者重定向到站点的HTTPS版本:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
如果你有一个现有的。htaccess文件:
不要重复“重写引擎”。
确保以RewriteCond和RewriteRule开头的行立即跟随已经存在的RewriteEngine On。
其他回答
我发现了一种方法,强制我的网站的所有页面从http重定向到https的模拟页面,为我工作。
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
除非你需要mod_rewrite做其他事情,使用Apache核心IF指令更干净更快:
<If "%{HTTPS} == 'off'">
Redirect permanent / https://yoursite.com/
</If>
你可以在IF指令中添加更多的条件,比如确保一个没有www前缀的规范域:
<If "req('Host') != 'myonetruesite.com' || %{HTTPS} == 'off'">
Redirect permanent / https://myonetruesite.com/
</If>
使用mod_rewrite做任何事情都有很多熟悉的惯性,但看看这是否适合你。
更多信息:https://httpd.apache.org/docs/2.4/mod/core.html#if
要看到它的行动(尝试没有www。或https://,或用。net代替。com): https://nohodental.com/(我正在做的一个网站)。
这个问题的另一个优势是当负载均衡器开始发挥作用时。
情况如下: -从浏览器到负载均衡器的流量,以及返回,是(应该)HTTPS —负载均衡器与实际WebServer之间的流量为HTTP协议。
因此,PHP或Apache中的所有服务器请求变量都显示连接只是HTTP。服务器上的HTTP和HTTPS目录是相同的。
已批准答案中的重写条件不工作。 它要么是循环,要么就是不起作用。
问题是:如何让它在负载均衡器上工作。
(或者负载均衡器配置错误。这就是我所希望的,因为这样我就可以把问题转移到网络托管公司:-))
如果您无法直接访问站点的apache配置,许多托管平台仍然以这种方式受到限制,那么我实际上会推荐两步方法。为什么Apache自己的文件,你应该首先使用他们的配置选项mod_rewrite的HTTP到HTTPS。
首先,如上所述,你将设置你的.htaccess mod_rewrite规则:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
然后,在你的PHP文件中(你需要在任何适合你的情况下这样做,一些网站将通过一个PHP文件汇集所有请求,其他网站根据他们的需求和正在发出的请求提供各种页面):
<?php if ($_SERVER['HTTPS'] != 'on') { exit(1); } ?>
需要在任何可能在不安全环境中暴露安全数据的代码之前运行上述代码。因此,您的站点通过HTACCESS和mod_rewrite使用自动重定向,而您的脚本确保不通过HTTPS访问时不提供输出。
我想大多数人都不这么想,因此Apache建议在可能的情况下不要使用这种方法。但是,它只需要在开发端进行额外的检查,以确保用户数据的安全。希望这能帮助那些由于我们的托管服务端的限制而不得不考虑使用非推荐方法的人。
我建议用301重定向:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]