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)
任何人都可以幫忙嗎?
這太複雜了。您只需要兩個(或三個)指令即可將所有內容重定向到 HTTPS,例如
<VirtualHost *:80> ServerName www.example.com ServerAlias example.com Redirect permanent "/" "https://www.example.com/" </VirtualHost>
這將在有和沒有的情況下都重定向
www
到規範的 HTTPS 站點。
另一個答案已經給出了解決方案,我想我會添加為什麼您的程式碼可能無法按預期工作。
mod_rewrite 已啟用
但是,預設情況下不會繼承目錄(或)上下文中的 mod_rewrite 指令。
.htaccess
(在這方面,mod_rewrite 的行為與其他模組有些不同。)因此,如果您在使用 mod_rewrite
.htaccess
的目錄中有一個文件/public_html
(例如,可能是預設的 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