Força SSL para cada URL, exceto um caminho usando .htaccess

2

Estou tentando impor o SSL para cada URL, exceto um com o primeiro segmento /preview .

http://test.example.com/preview/blah/blah

deve ser ignorado pela regra; cada outro URL deve ser forçado a usar o SSL. Estou usando o CentOS 6.4, o Apache e o CodeIgniter.

Meu arquivo .htaccess:

RewriteEngine On
RewriteBase /

RewriteCond %{HTTPS} !=on
RewriteCond %{REQUEST_URI} !^/preview/
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L]

Normalmente, os URLs de IC são assim antes de serem reescritos pela última regra:

http://test.example.com/index.php?/preview/blah/blah

Eu tentei:

RewriteCond %{HTTPS} !=on
RewriteCond %{REQUEST_URI} !^/index.php?/preview/
RewriteCond %{REQUEST_URI} !^/preview/
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Isso também não funciona. O que estou fazendo errado?

    
por Jonathan 21.11.2014 / 14:45

1 resposta

5

Você quase teve. A solução completa é:

RewriteEngine On
RewriteBase /

RewriteCond %{HTTPS} !=on
RewriteCond %{REQUEST_URI} !^/preview
RewriteCond %{QUERY_STRING} !^/preview
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L]

O motivo pelo qual ele falhou foi que http://test.domain.com/preview/blah/blah primeiro foi resolvido para http://test.domain.com/index.php?/preview/blah/blah e que essa URL foi imediatamente reconfigurada novamente (o htaccess faz um loop com o novo URL).

O novo URL ( http://test.domain.com/index.php?/preview/blah/blah não corresponde às suas condições, porque a parte depois do? não é considerada parte do REQUEST_URI, mas do QUERY_STRING. Consulte a descrição do REQUEST_URI em link

    
por 21.11.2014 / 16:16