mod_rewrite redireciona a raiz e o subdiretório do site de HTTP para SSL

1

Ok, então eu tenho dois sites dentro da mesma webroot - o site principal (na raiz) e um grupo não relacionado de arquivos em um subdiretório. Gostaríamos que esses dois sites forçassem a renderização em SSL.

No momento, as partes relevantes do meu httpd.conf são as seguintes:

<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>

mas se um usuário navegar diretamente para http://www.domain.com/subdir , ele será redirecionado para a raiz do site ( https://www.domain.com/ ), descartando o restante do caminho da solicitação. Esse é o caso mesmo se eu remover a seção <IfModule mod_rewrite.c> inteira da seção <Directory> do subdiretório e também for o caso se eu remover o primeiro par RewriteCond / RewriteRule em cada seção de configuração (que só adicionamos para tentar para corrigir este problema).

Não consigo ver por que a primeira regra (na seção <Directory> ) não está em vigor primeiro, para que o usuário seja redirecionado imediatamente para https://www.domain.com/subdir (com SSL e subdir ) antes de mod_rewrite chega até a segunda regra (em qualquer seção).

Eu presumo que estou fazendo algo obviamente errado (até porque a configuração do Apache não é minha principal habilidade), mas eu simplesmente não consigo ver. Analisando os mod_rewrite docs e os documentos em Como as seções de configuração são mescladas também não parecem responder à minha pergunta, a menos que eu esteja lendo errado, então estou em uma perda completa.

Alguém pode ver o (provavelmente óbvio) erro que estou cometendo?

    
por Owen Blacker 01.02.2012 / 19:17

1 resposta

3

A intenção é com o segundo RewriteRule sob o subdir para enviar o usuário para a raiz, descartando o subdiretório?

O contexto da string passada para sua regex de origem depende do contexto <Directory> - portanto, uma solicitação para /subdir/something.html fornecerá às regras /var/www/html uma sequência de subdir/something.html para corresponder, enquanto as regras dentro de /var/www/html/subdir será correspondente a something.html .

Você pode usar RewriteBase para substituir o contexto, para que a configuração possa ser corrigida para funcionar como pretendido de duas maneiras; usando um RewriteBase :

<Directory "/var/www/html/subdir">
  <IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteBase /
    # ... etc etc, no other changes needed

.. ou, alterando o URL de destino para levar o contexto em consideração (a primeira regra nunca corresponderá, pois subdir não está na string):

<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>
    
por 01.02.2012 / 19:31