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/username
el 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/username
el 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 .php
sufijo.
Del mismo modo, las dos RewriteRule
directivas 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 .php
extensió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 .php
lo agreguen username
, puede verificar que el .php
archivo 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,})$
.