When I type
www.example.com/username
the GET username is echoed asusername.php
Porque você tem que reescrever anteriormente no arquivo:
RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([^\.]+)$ $1.php [NC,L]
que reescreve /username
(qualquer solicitação que não mapeia para um arquivo existente) para /username.php
antes reescrevendo isso em userprofile.php?username=username.php
. Portanto, você vê o valor do parâmetro GET com um sufixo .php
.
Da mesma forma, as duas diretivas RewriteRule
a seguir não estão fazendo nada atualmente, pois a regra anterior está capturando a solicitação.
RewriteRule ^([^\.]+)$ $1index [NC,L] RewriteRule ^([^\.]+)$ $1login [NC,L]
E estes só entrariam em conflito com a reescrita do "nome de usuário", se modificarmos a reescrita precedente para anexar a extensão .php
. Mas também, estas duas regras entram em conflito umas com as outras - você está combinando a mesma URL com ambas - a primeira regra sempre ganharia. (Uma entrada, com duas saídas diferentes, simplesmente não é possível em nenhum cenário.) De fato, isso provavelmente gerará um loop de reescrita.
Essas duas diretivas devem ser removidas.
Para evitar que .php
seja anexado a username
, você pode verificar se o arquivo .php
existe antes reescrevê-lo. Por exemplo:
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
No entanto, eu também consideraria alterar sua estrutura de URL para que você possa segmentar facilmente URLs que declarem especificamente um nome de usuário. Por exemplo:
www.example.com/u/username
Em seguida, sua diretiva pode ser escrita de forma menos ambígua (e não seria tão dependente da ordenação de diretivas em seu arquivo):
RewriteRule ^u/(.*)$ userprofile.php?username=$1 [QSA,L]
Além disso, seja mais específico no regex que capture o nome de usuário. O padrão .*
captura qualquer coisa . Por exemplo, se os nomes de usuários puderem conter apenas as letras a..z, use uma expressão regular como ^u/([a-z]+)$
. E se nomes de usuários devem ter 4 ou mais caracteres, então: ^u/([a-z]{4,})$
.