Перенаправление 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)

Кто-нибудь может помочь?

0
задан 15 August 2017 в 00:57
2 ответа

Это слишком сложно. Вам нужны только две (или три) директивы для перенаправления всего на HTTPS, например

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

Это перенаправит как с www , так и без него, на канонический сайт HTTPS.

5
ответ дан 4 December 2019 в 11:09

Другой ответ уже дает решение, я решил добавить, почему ваш код может работать не так, как предполагалось.

mod_rewrite включен

Однако, директивы mod_rewrite в контексте директории (или .htaccess) по умолчанию не наследуются. (В этом отношении mod_rewrite ведет себя несколько иначе, чем другие модули.)

Итак, если у вас был .htaccess файл в каталоге /public_html, который использует mod_rewrite (например, установка WordPress по умолчанию), то это полностью переопределит директивы mod_rewrite в родительском контейнере <Каталог> в конфигурационном файле сервера. Таким образом, ваш редирект никогда не произойдет.

Однако, если вы переместили директивы mod_rewrite из контейнера и непосредственно в контейнер , то это может работать нормально. Директивы 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, используйте вместо него решение Эсы Джокинена.

Обратите внимание, что allow from all - это синтаксис Apache 2.2. Это устарело в Apache 2.4 и должно быть заменено эквивалентной директивой Require. Смотрите Apache docs - Upgrade to 2.4 from 2.2

2
ответ дан 4 December 2019 в 11:09

Теги

Похожие вопросы