HTTP 到 HTTPS 重定向在 Apache 2.4 上不起作用

HTTP 到 HTTPS 重定向在 Apache 2.4 上不起作用

我有这个 Apache 配置:

<VirtualHost *:80>
DocumentRoot "/home/example/public_html/"
ServerName www.example.com

<Directory "/home/example/public_html/">
  allow from all

  RewriteEngine on
  RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]
</Directory>
</VirtualHost>

重定向似乎从未触发,只是从 http 提供文件。我尝试了各种组合,但似乎都没有用。

mod_rewrite 已启用(使用 LoadModule rewrite_module modules/mod_rewrite.so)

有人可以帮忙吗?

答案1

这太复杂了。你只需要两个(或三个)指令就可以将所有内容重定向到 HTTPS,例如

<VirtualHost *:80>
    ServerName www.example.com
    ServerAlias example.com
    Redirect permanent "/" "https://www.example.com/"
</VirtualHost>

这会将有和没有重定向www到规范的 HTTPS 站点。

答案2

另一个答案已经给出了解决方案,我想我应该补充一下为什么你的代码可能无法按预期工作。

mod_rewrite 已启用

然而,mod_rewrite 指令目录(或.htaccess)上下文默认不会被继承。(在这方面,mod_rewrite 的行为与其他模块略有不同。)

因此,如果您的目录.htaccess中有一个/public_html使用 mod_rewrite 的文件(例如,可能是默认的 WordPress 安装),那么这将完全覆盖<Directory>服务器配置中父容器中的 mod_rewrite 指令。因此,您的重定向永远不会发生。

但是,如果你将 mod_rewrite 指令移出容器<Directory>并直接移入<VirtualHost>容器,那么这可能会正常工作。虚拟主机(或服务器配置)上下文中的 mod_rewrite 指令将执行 .htaccess。 例如:

<VirtualHost *:80>
DocumentRoot "/home/example/public_html/"
ServerName www.example.com

RewriteEngine on
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]

<Directory "/home/example/public_html/">
    Require all granted   
</Directory>
</VirtualHost>

注意,这纯属理论。这里根本不需要 mod_rewrite,而是使用 Esa Jokinen 的解决方案。

还请注意,这allow from all是 Apache 2.2 语法。这在 Apache 2.4 上已弃用,应使用等效指令替换Require。请参阅Apache 文档 - 从 2.2 升级到 2.4

相关内容