我有这个 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