我试图重定向所有不安全的HTTP请求在我的网站(例如http://www.example.com)到HTTPS (https://www.example.com)。我如何在.htaccess文件中做到这一点?
我用的是PHP。
我试图重定向所有不安全的HTTP请求在我的网站(例如http://www.example.com)到HTTPS (https://www.example.com)。我如何在.htaccess文件中做到这一点?
我用的是PHP。
当前回答
Redirect 301 / https://example.com/
(当上面的答案都没用的时候,对我来说是有效的)
奖金:
ServerAlias www.example.com example.com
(固定https://www.example.com未找到)
其他回答
如果你正在使用亚马逊Web服务弹性负载均衡器,它接受https流量并通过http将其路由到你的服务器,这里描述了将所有http流量重定向到https的正确方法:https://aws.amazon.com/premiumsupport/knowledge-center/redirect-http-https-elb
使用X-Forwarded-Proto报头(包含http或https),它总是包含在来自负载均衡器的http请求中,如下所述:https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/x-forwarded-headers.html
在httpd.conf文件中:
<VirtualHost *:80>
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
</VirtualHost>
或者在你的根文件。htaccess中:
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
好处:它不会尝试重定向本地开发机器上的http流量。
最佳解决方案取决于您的需求。这是对之前发布的答案的总结,并添加了一些上下文。
如果你使用Apache web服务器并且可以更改其配置,请参考Apache文档:
<VirtualHost *:80>
ServerName www.example.com
Redirect "/" "https://www.example.com/"
</VirtualHost>
<VirtualHost *:443>
ServerName www.example.com
# ... SSL configuration goes here
</VirtualHost>
但你还问是否可以在.htaccess文件中进行。在这种情况下,你可以使用Apache的RewriteEngine:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L]
如果一切正常,你想让浏览器记住这个重定向,你可以将最后一行更改为:
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
但如果你在这个方向上改变了主意,要小心。浏览器会记住它很长一段时间,不会检查它是否改变了。
根据web服务器配置,您可能不需要第一行RewriteEngine On。
如果你在寻找一个PHP解决方案,看看$_SERVER数组和header函数:
if (!$_SERVER['HTTPS']) {
header("Location: https://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
}
我实际上试图让它在没有负载均衡器的EC2实例上工作,因为这需要花钱。我到处都读到。htaccess不是“正确”的方式。很明显,这是可行的,但我只是想按规矩办事。我按照所有示例更新httpd.conf文件,并添加了许多不必要的东西。事实证明,你真正需要的唯一一行是:
Redirect permanent / https://www.yourdomain.com
我的问题是,最初我已经在httpd.conf中的VirtualHost标签中添加了这个,这是很多帖子告诉你要做的,但它不起作用。原来有一个单独的conf文件存储在/etc/httpd/conf中。d调用yourdomain.conf,它已经有了VirtualHost标签,并且覆盖了我的httpd.conf设置。我只是添加了上面的行里面,瞧,它立即重定向到https。端口443不需要单独的VirtualHost。
它现在正在工作,VirtualHost标签看起来是这样的:
<VirtualHost *:80>
ServerName yourdomain.com
DocumentRoot /var/www/html
ServerAlias www.yourdomain.com
ErrorLog /var/www/error.log
CustomLog /var/www/requests.log combined
Redirect permanent / https://www.yourdomain.com
</VirtualHost>
注意:我已经从certbot(爱那些家伙)的免费证书设置了TLS,只是试图将常规http调用重定向到工作的https站点。
要将所有http请求重定向到https,您可以使用:
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [NE,L,R]
如果mod-rewrite没有启用,并且你在apache 2.4上,你也可以在If指令中使用Redirect将http请求重定向到https。
Apache 2.4。
<if "%{HTTPS} !~ /on/">
Redirect / https://www.example.com/
</if>
这个问题的另一个优势是当负载均衡器开始发挥作用时。
情况如下: -从浏览器到负载均衡器的流量,以及返回,是(应该)HTTPS —负载均衡器与实际WebServer之间的流量为HTTP协议。
因此,PHP或Apache中的所有服务器请求变量都显示连接只是HTTP。服务器上的HTTP和HTTPS目录是相同的。
已批准答案中的重写条件不工作。 它要么是循环,要么就是不起作用。
问题是:如何让它在负载均衡器上工作。
(或者负载均衡器配置错误。这就是我所希望的,因为这样我就可以把问题转移到网络托管公司:-))