arquivo htaccess para fazer reescritas específicas em diferentes uri

1

Eu tenho o seguinte no meu arquivo .htaccess :

<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 pela parte /sns . Não consigo fazer isso parar de redirecionar para https.

Gostaria que http://sub.example.com/sns e http://sub.example.com/health_check.php não redirecionassem para https.

    
por Tom 22.02.2018 / 09:37

1 resposta

0

# 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?)

    
por 22.02.2018 / 14:46