Eu queria o seguinte URL. www.example.com/userprofile.php?username=username
Abaixo www.example.com/username
está meu arquivo htaccess
Options All -Indexes
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
RewriteRule ^([^\.]+)$ $1index [NC,L]
RewriteRule ^([^\.]+)$ $1login [NC,L]
RewriteRule ^(.*)$ userprofile.php?username=$1 [QSA]
Quando digito, www.example.com/username
o nome de usuário GET é repetido como
username.php
Já tentei de tudo mas não consigo solução
Qualquer ajuda será apreciada
Responder1
Quando digito,
www.example.com/username
o nome de usuário GET é repetido comousername.php
Porque você reescreveu 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
antesreescrevendo isso para userprofile.php?username=username.php
. É por isso que você vê o valor do parâmetro GET com um .php
sufixo.
Da mesma forma, as duas RewriteRule
diretivas a seguir não estão fazendo nada atualmente, já que a regra anterior está capturando a solicitação.
RewriteRule ^([^\.]+)$ $1index [NC,L] RewriteRule ^([^\.]+)$ $1login [NC,L]
E isso só entraria em conflito com a reescrita do "nome de usuário", se modificarmos a reescrita anterior para acrescentar a .php
extensão. Mas também, essas duas regras entram em conflito entre si - você está combinando o mesmo URL com ambas - a primeira regra sempre venceria. (Uma entrada com duas saídas diferentes simplesmente não é possível em nenhum cenário.) Na verdade, isso provavelmente gerará um loop de reescrita.
Estas duas directivas deveriam ser eliminadas.
Para evitar .php
ser anexado username
, você pode verificar se o .php
arquivo existeantesreescrevendo para ele. 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 indiquem especificamente um nome de usuário. Por exemplo:
www.example.com/u/username
Então sua diretiva pode ser escrita de forma menos ambígua (e não seria tão dependente da ordem das diretivas em seu arquivo):
RewriteRule ^u/(.*)$ userprofile.php?username=$1 [QSA,L]
Além disso, seja mais específico na regex que captura o nome de usuário. O padrão .*
capturaqualquer coisa. Por exemplo, se os nomes de usuário só puderem conter as letras a..z, use uma regex como ^u/([a-z]+)$
. E se os nomes de usuário precisarem ter 4 ou mais caracteres, então: ^u/([a-z]{4,})$
.