htaccess redireccionando a url.php

htaccess redireccionando a url.php

Quería la siguiente URL. www.example.com/userprofile.php?username=username A www.example.com/username
continuación está mi archivo 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]

Cuando escribo www.example.com/usernameel nombre de usuario GET se repite como

username.php

He intentado todo pero no puedo encontrar una solución.
Se agradece cualquier ayuda.

Respuesta1

Cuando escribo www.example.com/usernameel nombre de usuario GET se repite comousername.php

Porque tienes una reescritura anterior en el archivo:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

que reescribe /username(cualquier solicitud que no se asigne a un archivo existente) en/username.php antesreescribiendo esto a userprofile.php?username=username.php. Por eso ve el valor del parámetro GET con un .phpsufijo.

Del mismo modo, las dos RewriteRuledirectivas siguientes no hacen nada actualmente, ya que la regla anterior detecta la solicitud.

RewriteRule ^([^\.]+)$ $1index [NC,L]
RewriteRule ^([^\.]+)$ $1login [NC,L]

Y estos sólo entrarían en conflicto con la reescritura del "nombre de usuario", si modificamos la reescritura anterior para agregar la .phpextensión. Pero además, estas dos reglas entran en conflicto entre sí: estás haciendo coincidir la misma URL con ambas; la primera regla siempre ganaría. (Una entrada con dos salidas diferentes simplemente no es posible en ningún escenario). De hecho, esto probablemente generará un bucle de reescritura.

Estas dos directivas deberían eliminarse.


Para evitar que .phplo agreguen username, puede verificar que el .phparchivo existaantesreescribiéndolo. Por ejemplo:

RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

Sin embargo, también consideraría cambiar la estructura de su URL para que pueda orientar fácilmente las URL que indican específicamente un nombre de usuario. Por ejemplo:

www.example.com/u/username

Entonces su directiva se puede escribir de manera menos ambigua (y no dependería tanto del orden de las directivas en su archivo):

RewriteRule ^u/(.*)$ userprofile.php?username=$1 [QSA,L]

Además, sea más específico en la expresión regular que captura el nombre de usuario. El patrón .*capturacualquier cosa. Por ejemplo, si los nombres de usuario solo pueden contener las letras a..z, utilice una expresión regular como ^u/([a-z]+)$. Y si los nombres de usuario deben tener 4 o más caracteres, entonces: ^u/([a-z]{4,})$.

información relacionada