htaccess redirecionando para url.php

htaccess redirecionando para url.php

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/usernameo 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/usernameo 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 .phpsufixo.

Da mesma forma, as duas RewriteRulediretivas 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 .phpextensã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 .phpser anexado username, você pode verificar se o .phparquivo 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,})$.

informação relacionada