使用 .htaccess 强制 SSL/https 和 mod_rewrite
2022-08-30 06:11:34
我如何使用.htaccess强制SSL / https,并在PHP中特定于mod_rewrite页面。
我如何使用.htaccess强制SSL / https,并在PHP中特定于mod_rewrite页面。
对于 Apache,您可以使用 mod_ssl
通过 SSLRequireSSL 指令强制 SSL
:
此指令禁止访问,除非为当前连接启用了 HTTP over SSL(即 HTTPS)。这在启用了 SSL 的虚拟主机或目录中非常方便,可以防止出现暴露应受保护内容的配置错误。当此指令存在时,所有未使用 SSL 的请求都将被拒绝。
不过,这不会重定向到https。要重定向,请尝试在 .htaccess 文件中mod_rewrite
执行以下操作
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
或
如果您的提供商禁用了.htaccess,您也可以从PHP中解决此问题(这不太可能,因为您要求它,但无论如何)
if (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] !== 'on') {
if(!headers_sent()) {
header("Status: 301 Moved Permanently");
header(sprintf(
'Location: https://%s%s',
$_SERVER['HTTP_HOST'],
$_SERVER['REQUEST_URI']
));
exit();
}
}
我找到了一个适用于代理和未代理服务器的解决方案。mod_rewrite
如果您使用的是 CloudFlare、AWS Elastic Load Balancing、Heroku、OpenShift 或任何其他 Cloud/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]