Назад | Перейти на главную страницу

mod_rewrite перенаправляет корень сайта и подкаталог с HTTP на SSL

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