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.