RewriteCond ignorado no httpd.conf

3

Coloque simplesmente isso funciona no htaccess:

RewriteEngine on

RewriteCond %{SCRIPT_FILENAME} !-f 
RewriteCond %{SCRIPT_FILENAME} !-d 

RewriteRule ^([^/]+)/?$ https://example.net?u=$1 [L,NC,R=301] 

Mas quando eu o movo para o httpd.conf, ele não faz nada. Eu tentei na diretiva directory e isso também não faz diferença.

Como um teste abaixo no httpd.conf tem um efeito, ele redireciona, mas faz isso para todas as páginas, ou seja, a condição é ignorada.

RewriteEngine on

RewriteCond %{SCRIPT_FILENAME} !-f 
RewriteCond %{SCRIPT_FILENAME} !-d 

RewriteRule ^(.*)$ https://example.net?u=$1 [L,NC,R=301] 
    
por Guesser 29.10.2018 / 13:25

1 resposta

3
RewriteRule ^([^/]+)/?$ https://example.net?u=$1 [L,NC,R=301] 

But when I move it to httpd.conf it does nothing.

Porque em um contexto servidor , o padrão RewriteRule nunca será igual. Em um contexto de servidor, o caminho da URL é relativo à raiz, começando com uma barra. Em .htaccess , o caminho da URL é menos o prefixo do diretório, portanto, nunca começa com uma barra.

I have tried in the directory directive and that also makes no difference.

Isso deveria ter funcionado, desde que você incluísse o caminho correto do diretório. (E reiniciei o Apache.) No entanto, se você ainda tivesse um arquivo .htaccess que ativasse o mecanismo de reescrita, isso teria substituído as diretivas do servidor no contêiner <Directory> , portanto as diretivas <Directory> não teriam feito nada ainda .

As a test the below in httpd.conf does have an affect, it re-directs, but does so to all pages i.e the condition is ignored.

RewriteEngine on

RewriteCond %{SCRIPT_FILENAME} !-f 
:

Como em um contexto servidor , a solicitação ainda não foi mapeada para o sistema de arquivos, portanto SCRIPT_FILENAME (ou REQUEST_FILENAME ) ainda não contém o caminho completo do sistema de arquivos (ele simplesmente contém o URL -path), então esta condição sempre é avaliada como verdadeira (o "caminho da URL" que está sendo testado não é um arquivo físico - o que é provavelmente correto).

Você precisa usar um look-ahead para determinar o valor final. ie. %{LA-U:REQUEST_FILENAME} .

Assim, em um contexto servidor (ou virtualhost ), você precisará usar o seguinte:

RewriteEngine on

RewriteCond %{LA-U:REQUEST_FILENAME} !-f 
RewriteCond %{LA-U:REQUEST_FILENAME} !-d 

RewriteRule ^/([^/]+)/?$ https://example.net?u=$1 [L,R=301] 

Observe o prefixo da barra no padrão RewriteRule .

A NC bandeira é supérflua aqui.

    
por 29.10.2018 / 14:17