我如何使用.htaccess和mod_rewrite页面特定于PHP强制到SSL/https。


当前回答

基于mod重写的解决方案:

在htaccess中使用以下代码自动将所有http请求转发到https。

RewriteEngine on

RewriteCond %{HTTPS}::%{HTTP_HOST} ^off::(?:www\.)?(.+)$
RewriteRule ^ https://www.%1%{REQUEST_URI} [NE,L,R]

这将重定向你的非www和www http请求到https的www版本。

其他解决方案(Apache 2.4*)

RewriteEngine on

RewriteCond %{REQUEST_SCHEME}::%{HTTP_HOST} ^http::(?:www\.)?(.+)$
RewriteRule ^ https://www.%1%{REQUEST_URI} [NE,L,R]

这在低版本的apache上不起作用,因为%{REQUEST_SCHEME}变量从2.4开始被添加到mod-rewrite中。

其他回答

这个代码适用于我

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP:X-HTTPS} !1
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

简单一点:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www\.example\.com)(:80)? [NC]
RewriteRule ^(.*) https://example.com/$1 [R=301,L]
order deny,allow

用example.com替换你的url

我发现了一个mod_rewrite解决方案,它既适用于代理服务器,也适用于未代理服务器。

如果您正在使用CloudFlare、AWS弹性负载平衡、Heroku、OpenShift或任何其他云/PaaS解决方案,并且您正在使用正常的HTTPS重定向循环,请尝试以下代码片段。

RewriteEngine On

# If we receive a forwarded http request from a proxy...
RewriteCond %{HTTP:X-Forwarded-Proto} =http [OR]

# ...or just a plain old http request directly from the client
RewriteCond %{HTTP:X-Forwarded-Proto} =""
RewriteCond %{HTTPS} !=on

# Redirect to https version
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

简单易行,只需添加以下内容

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

基于mod重写的解决方案:

在htaccess中使用以下代码自动将所有http请求转发到https。

RewriteEngine on

RewriteCond %{HTTPS}::%{HTTP_HOST} ^off::(?:www\.)?(.+)$
RewriteRule ^ https://www.%1%{REQUEST_URI} [NE,L,R]

这将重定向你的非www和www http请求到https的www版本。

其他解决方案(Apache 2.4*)

RewriteEngine on

RewriteCond %{REQUEST_SCHEME}::%{HTTP_HOST} ^http::(?:www\.)?(.+)$
RewriteRule ^ https://www.%1%{REQUEST_URI} [NE,L,R]

这在低版本的apache上不起作用,因为%{REQUEST_SCHEME}变量从2.4开始被添加到mod-rewrite中。