htaccess substitui o URL completo em vez de REQUEST_URI

2

Estou trabalhando em algo que deveria ser realmente 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 = > %código%

O problema: quando eu peço /utilities/template_handler.php?filename=file.html eu recebo r = 301 para

https://example.com/file.html

Meu https://example.com/utilities/template_handler.php?filename=https://www.example.com/file.html :

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 está 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, primeiro os dois requisitos foram processados corretamente.

O mesmo erro se a solicitação for enviada para não www ou www mas não SSL.

    
por Putnik 05.10.2017 / 19:36

1 resposta

2
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]

Você precisa incluir o sinalizador L ( last ) nas duas diretrizes RewriteRule , caso contrário, o processamento continuará no arquivo e o URL será reescrito novamente pelo RewriteRule que segue (usando a saída da directiva anterior). E como um redirecionamento externo já foi acionado pelas diretivas anteriores, você é redirecionado para o /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 no formato http://example.com/... . (Particularmente com a adição do L flag.)

Por exemplo:

RewriteCond %{HTTP_HOST} !^www\.
RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
RewriteCond %{HTTPS} off
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Observe também que removi o sinalizador NC da condição !^www\. negada. Como esta é uma regex negada , você deseja redirecionar quando não iniciar www - todas em minúsculas. Você ainda deseja que as solicitações "inválidas" do formulário WwW sejam redirecionadas, mas se você incluir o sinal NC aqui, elas não serão.

Você pode incluir o L flag no último RewriteRule , se desejar - embora seja uma boa prática fazê-lo. Está efetivamente implícito, já que é a última regra, mas se você adicionou mais diretivas, pode ser necessário lembrar de adicioná-la.

    
por 05.10.2017 / 21:06