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.