使用 .htaccess 强制 SSL/https 和 mod_rewrite

2022-08-30 06:11:34

我如何使用.htaccess强制SSL / https,并在PHP中特定于mod_rewrite页面。


答案 1

对于 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();
    }
}

答案 2

我找到了一个适用于代理和未代理服务器的解决方案。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]

推荐