# Prevent /sns from using https but this DOES need codeigniter rewriting (see below) RewriteCond %{REQUEST_URI} !^/(sns)/
Se o URL de solicitação não terminar com uma barra final (conforme indicado), a regra acima (que inclui a barra no CondPattern ) sempre será bem-sucedida (é um condição negada ), para que o redirecionamento para HTTPS sempre ocorra.
Idealmente, você deve canonizar a barra anterior no pedido. Inclua ou não a barra à direita (caso contrário, é essencialmente conteúdo duplicado e pode causar problemas em outros scripts que analisam a URL).
No entanto, para lidar com as duas URLs /sns
e /sns/
, você precisará tornar a barra final opcional e incluir a âncora de fim de string ( ^
). Por exemplo:
RewriteCond %{REQUEST_URI} !^/sns/?$
Observe que isso corresponde apenas aos dois URLs indicados. Não corresponderá a um URL do formulário /sns/<something>
.
Eu removi os parênteses ao redor do segmento de caminho (você também deve remover outros parênteses em seu regex). Isso cria um grupo capturado e é supérfluo nas diretivas que você publicou.
UPDATE: você também precisará de uma verificação adicional para garantir que a URL reescrita (por exemplo, /index.php/sns
) não seja redirecionada. Você pode fazer isso de uma forma mais geral, aplicando apenas o redirecionamento HTTPS na solicitação inicial, não a solicitação reescrita, incluindo uma condição adicional:
# Only applies to direct requests (not rewritten requests)
RewriteCond {%ENV:REDIRECT_STATUS} ^$
A variável de ambiente REDIRECT_STATUS
é definida como "200" após a primeira reescrita bem-sucedida (isto é, o roteamento do CodeIgniter). Não é definido na solicitação inicial (por exemplo, ^$
- string vazia).
Se isso ainda resultar em um redirecionamento, é possível que o próprio CodeIgniter esteja acionando o redirecionamento (após .htaccess
ter sido processado).
RewriteRule ^(.*)$ ./index.php/$1 [L,QSA]
Como: E, como observado em meu comentário, você deve remover o prefixo ./
na RewriteRule
susbtitution . Veja o fim da minha resposta em esta pergunta do StackOverflow para 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 que você confirmar que está funcionando OK. O sinalizador R
por si próprio é padronizado para um redirecionamento 302 (temporário).
(Você não precisa do invólucro <IfModule>
, a menos que o site pretenda funcionar sem o mod_rewrite?)