Estou trabalhando em algo que deveria ser muito simples, mas batendo a cabeça contra a parede no segundo dia. Os requisitos de redirecionamento de URLs são:
- não www => www
- não https => https
/file.html
=>/utilities/template_handler.php?filename=file.html
O problema: quando eu solicito https://example.com/file.html
recebo r=301 para
https://example.com/utilities/template_handler.php?filename=https://www.example.com/file.html
Meu .htaccess
:
RewriteEngine On
RewriteBase /
RewriteCond %{HTTPS} off
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301]
RewriteRule ^(.*)\.html$ /utilities/template_handler.php?filename=$1.html [NC]
Estou usando o litespeed webserver, mas para fins de solução de problemas, configure o Apache também, o mesmo resultado. Depois que a depuração é ativada, vejo:
strip base: '/' from URI: '/file.html'
Rule: Match 'file.html' with pattern '.*', result: 1
Cond: Match 'on' with pattern 'off', result: -1
Rule: Match 'file.html' with pattern '.*', result: 1
Cond: Match 'domain.com' with pattern '^www\.', result: -1
Source URI: 'file.html' => Result URI: 'https://www.example.com/file.html'
Rule: Match 'https://www.example.com/file.html' with pattern '^(.*)\.html$', result: 2
Source URI: 'https://www.example.com/file.html' => Result URI: '/utilities/template_handler.php?filename=https://www.example.com/file.html'
replace current query string with 'filename=https://www.example.com/file.html'
Se eu comentar a última regra, tenho os dois primeiros requisitos processados corretamente.
O mesmo erro se a solicitação for enviada para não www ou para www mas não SSL.
Você precisa incluir o sinalizador
L
(last
) em ambas asRewriteRule
diretivas, caso contrário, o processamento continuará pelo arquivo e a URL será reescrita peloRewriteRule
seguinte (usando a saída da diretiva anterior). E como um redirecionamento externo já foi acionado pelas diretivas anteriores, você é redirecionado externamente para/utilities/template_handler.php?filename=....
, em vez de reescrito internamente .Essas diretivas também devem ser revertidas para evitar um redirecionamento duplo desnecessário ao solicitar uma URL do formulário
http://example.com/...
. (Particularmente com a adição daL
bandeira.)Por exemplo:
Observe também que removi o
NC
sinalizador da condição negada!^www\.
. Como este é um regex negado , você deseja redirecionar quando não iniciarwww
- tudo em minúsculas. Você ainda deseja que solicitações "ruins" do formulárioWwW
sejam redirecionadas - mas se você incluir oNC
sinalizador aqui, elas não serão.Você pode incluir a
L
bandeira no últimoRewriteRule
, se desejar - embora seja uma boa prática fazê-lo. Está efetivamente implícito, já que é a última regra de qualquer maneira, mas se você adicionou mais diretivas, talvez seja necessário lembrar de adicioná-la.