Eu tenho o seguinte em meu .htaccess
arquivo:
<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 /sns
parte. Não consigo fazer com que isso pare de redirecionar para https.
Gostaria http://sub.example.com/sns
de http://sub.example.com/health_check.php
nã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_STATUS
variá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 .htaccess
processado).
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 R
sinalizador 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?)