Apache-2.4

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

  • February 14, 2019

我有這個 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

引用自:https://serverfault.com/questions/868625