Итак, у меня есть два сайта в одном корневом каталоге - основной сайт (в корне) и несвязанная группа файлов в подкаталоге. Мы бы хотели, чтобы на обоих этих сайтах принудительно выполнялся рендеринг по SSL.
На данный момент соответствующие фрагменты моих httpd.conf
читать следующим образом:
<Directory "/var/www/html">
<IfModule mod_rewrite.c>
RewriteEngine on
<IfModule mod_ssl.c>
RewriteCond %{HTTPS} !=on
RewriteRule ^subdir(.*)$ https://%{HTTP_HOST}/subdir$1 [R=301,L]
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
</IfModule>
</IfModule>
</Directory>
<Directory "/var/www/html/subdir">
<IfModule mod_rewrite.c>
RewriteEngine on
<IfModule mod_ssl.c>
RewriteCond %{HTTPS} !=on
RewriteRule ^subdir(.*)$ https://%{HTTP_HOST}/subdir$1 [R=301,L]
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
</IfModule>
</IfModule>
</Directory>
но если пользователь переходит прямо к http://www.domain.com/subdir
, они перенаправляются в корень сайта (https://www.domain.com/
), отбрасывая остальную часть пути запроса. Это так, даже если я удалю весь <IfModule mod_rewrite.c>
раздел из подкаталога <Directory>
раздел, а также если я удалю первый RewriteCond
/RewriteRule
пара в каждом разделе конфигурации (который мы добавили только для того, чтобы попытаться решить эту проблему).
Я не понимаю, почему первое правило (ни в одном <Directory>
раздел) не вступает в силу сначала, поэтому пользователь сразу перенаправляется на https://www.domain.com/subdir
(с SSL и subdir
) перед mod_rewrite
даже доходит до второго правила (в любом разделе).
Я предполагаю, что делаю что-то явно неправильно (не в последнюю очередь потому, что конфигурация Apache не является моим основным набором навыков), но я просто не вижу этого. Глядя на mod_rewrite
документы и документы на Как объединяются разделы конфигурации похоже, тоже не отвечает на мой вопрос, если только я не неправильно их читаю, так что я в полной растерянности.
Может ли кто-нибудь увидеть (вероятно, очевидную) ошибку, которую я делаю?
Есть намерение со вторым RewriteRule
под подкаталогом, чтобы отправить пользователя в корень, отбросив путь к подкаталогу?
Контекст строки, передаваемой в исходное регулярное выражение, зависит от <Directory>
контекст - поэтому просьба /subdir/something.html
даст /var/www/html
управляет цепочкой subdir/something.html
чтобы соответствовать, в то время как правила внутри /var/www/html/subdir
будет соответствовать something.html
.
Ты можешь использовать RewriteBase
для переопределения контекста, чтобы конфигурация могла работать должным образом одним из двух способов; используя RewriteBase
:
<Directory "/var/www/html/subdir">
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
# ... etc etc, no other changes needed
..или, изменив целевой URL-адрес с учетом контекста (первое правило никогда не будет совпадать, поскольку subdir
нет в строке):
<Directory "/var/www/html/subdir">
<IfModule mod_rewrite.c>
RewriteEngine on
<IfModule mod_ssl.c>
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}/subdir/$1 [R=301,L]
</IfModule>
</IfModule>
</Directory>