У меня есть эта конфигурация 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 ведет себя несколько иначе, чем другие модули.)
Итак, если у вас был .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