arquivo htaccess para fazer reescritas específicas em uri diferentes

arquivo htaccess para fazer reescritas específicas em uri diferentes

Eu tenho o seguinte em meu .htaccessarquivo:

<IfModule mod_rewrite.c>
    Options +FollowSymlinks
    RewriteEngine On

    # Block hidden directories
    RewriteRule "(^|/)\." - [F]

    # Prevent /health_check.php from using https
    RewriteCond %{REQUEST_URI} !(health_check\.php)$

    # Prevent /sns from using https but this DOES need codeigniter rewriting (see below)
    RewriteCond %{REQUEST_URI} !^/(sns)/

    # Reroute http to https
    RewriteCond %{HTTP:X-Forwarded-Proto} =http
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

    # Prevent rewriting of domain for codeigniter
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ ./index.php/$1 [L,QSA]

</IfModule>

Tudo parece estar funcionando bem, exceto a /snsparte. Não consigo fazer com que isso pare de redirecionar para https.

Gostaria http://sub.example.com/snsde http://sub.example.com/health_check.phpnão redirecionar para https.

Responder1

# Prevent /sns from using https but this DOES need codeigniter rewriting (see below)
RewriteCond %{REQUEST_URI} !^/(sns)/

Se o URL da solicitação não terminar com uma barra final (conforme indicado), então a regra acima (que inclui a barra final noCondPadrão) sempre terá sucesso (é umnegadocondição), portanto o redirecionamento para HTTPS sempre ocorrerá.

Idealmente, você deve canonizar a barra final no início da solicitação. Inclua a barra final ou não (caso contrário, é essencialmenteconteúdo duplicadoe pode causar problemas com outros scripts que analisam o URL).

No entanto, para lidar com os dois URLs /sns, /sns/você precisa tornar a barra final opcional e incluir a âncora de final de string ( ^). Por exemplo:

RewriteCond %{REQUEST_URI} !^/sns/?$

Observe que isso corresponde apenas aos dois URLs indicados. Não corresponderá a um URL no formato /sns/<something>.

Removi os parênteses ao redor do segmento do caminho (você também deve remover outros parênteses do seu regex). Isso cria um grupo capturado e é supérfluo nas diretivas que você postou.

ATUALIZAR:Você também precisará de uma verificação adicional para garantir que o URL reescrito (ou seja, /index.php/sns) não seja redirecionado. Você pode fazer isso de uma forma mais geral, aplicando apenas o redirecionamento HTTPS na solicitação inicial, e não na solicitação reescrita, incluindo uma condição adicional:

# Only applies to direct requests (not rewritten requests)
RewriteCond {%ENV:REDIRECT_STATUS} ^$

A REDIRECT_STATUSvariável de ambiente é definida como "200" após a primeira reescrita bem-sucedida (ou seja, o roteamento do CodeIgniter). Não está definido na solicitação inicial (ou seja, ^$- string vazia).

Se isso ainda resultar em um redirecionamento, é possível que o próprio CodeIgniter esteja acionando o redirecionamento (depois de .htaccessprocessado).

RewriteRule ^(.*)$ ./index.php/$1 [L,QSA]

Aparte:E conforme observado em meu comentário, você deve remover o ./prefixo noRewriteRule substituição. Veja ofim da minha respostasobreesta pergunta StackOverflowpara uma explicação.

Resumo

Options +FollowSymlinks
RewriteEngine On

# Block hidden directories
RewriteRule ^\. - [F]

# Only applies to direct requests (not rewritten requests)
RewriteCond {%ENV:REDIRECT_STATUS} ^$

# Prevent /health_check.php from using https
RewriteCond %{REQUEST_URI} !health_check\.php$

# Prevent /sns from using https but this DOES need codeigniter rewriting (see below)
RewriteCond %{REQUEST_URI} !^/sns/?$

# Reroute http to https
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# Prevent rewriting of domain for codeigniter
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L,QSA]

O redirecionamento HTTP para HTTPS deve ser um redirecionamento 301 (permanente), mas somente depois de você confirmar que está funcionando bem. O Rsinalizador por si só é padronizado como um redirecionamento 302 (temporário).

(Você também não precisa do <IfModule>wrapper, a menos que seu site pretenda funcionar sem mod_rewrite?)

informação relacionada