Seu código parece "OK" e a saída que você está vendo é esperada.
RewriteRule (.+) index.php?p=$1 [QSA]
No seu exemplo, você está solicitando a raiz do documento e, sim, essa linha não corresponderá à raiz do documento em um contexto .htaccess
porque o caminho da URL está vazio . O regex .+
corresponde a 1 ou mais caracteres.
Mas isso provavelmente é OK e intencional, index.php
ainda deve receber a solicitação (por causa de mod_dir e DirectoryIndex
), mas sem o parâmetro p
URL. Eu esperaria que seu código PHP verificasse a presença do parâmetro de URL e lidasse com isso de acordo.
Em vez disso, teste uma solicitação para example.com/foo
, que contém um caminho de URL. Isso será detectado pela sua diretiva RewriteRule
.
Se você quisesse sempre ter um parâmetro p
URL (e talvez rejeitar a solicitação de outra forma), então você poderia alterar o padrão RewriteRule
para (.*)
(0 ou mais caracteres). Isso corresponderá à raiz do documento e você terminará com um parâmetro de p
URL vazio. No entanto, não há realmente nenhuma vantagem em fazer isso.
(Enviei um número de relatórios de bugs para mim no passado.) Por exemplo, o exemplo a seguir resulta na referência incorreta da backreference: link (o URL resultante deve ser /foo
, mas reporta /foobar
, que é o URL do pedido.)