htaccess redirecionando para url.php [duplicado]

1

Eu queria o seguinte url www.example.com/userprofile.php?username=username Codificar%
Abaixo está o 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 é ecoado como

username.php

Eu tentei de tudo mas não consegui uma solução | Qualquer ajuda é apreciada

    
por testuser 25.02.2018 / 18:58

1 resposta

0

When I type www.example.com/username the GET username is echoed as username.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,})$ .

    
por 26.02.2018 / 12:47