Hacer coincidir el signo de interrogación en la regla de expresión mod_rewrite
-
03-07-2019 - |
Pregunta
Estoy buscando reescribir las URL con múltiples subcadenas. Una subcadena se solicita como un subdirectorio, mientras que las demás se solicitan como parámetros de cadena de consulta normales.
Por ejemplo, me gustaría reescribir las URL de
http://www.mysite.com/mark/friends?page=2
a
http://www.mysite.com/friends.php?user=mark&page=2
Puedo lograr esto con la excepción del carácter de signo de interrogación. Aquí está mi regla de reescritura:
...
RewriteEngine On
RewriteBase /
RewriteRule ^([A-Za-z0-9-_]+)/friends[?]?([^/\.]+)?$ friends.php?user=$1&$2 [L]
Si cambio el signo de interrogación a cualquier otro carácter, funciona muy bien. Parece que el problema es que el '?' el carácter se interpreta incorrectamente como el inicio de una nueva cadena de consulta.
Necesito pasar cualquier parámetro que aparezca después de / user / friends tal como está. ¿Cómo logro esto?
Solución
Debería usar la marca [QSA]
en lugar de intentar volver a escribir la cadena de consulta. [QSA]
pasa la cadena de consulta a la URL reescrita.
Por lo tanto, su regla debe verse como:
...
RewriteEngine On
RewriteBase /
RewriteRule ^([A-Za-z0-9-_]+)/friends/? friends.php?user=$1 [QSA,L]
Su caso es muy similar a el ejemplo dado para usar la marca QSA en el libro de recetas mod_rewrite .
Otros consejos
La consulta no forma parte de la ruta URL y, por lo tanto, no puede ser procesado con la directiva RewriteRule
. Esto solo se puede hacer con RewriteCond
directiva (ver % {QUERY_STRING}
).
Pero como Chad Birch ya lo dijo es suficiente para establecer el QSA
flag para obtener automáticamente la consulta original solicitada adjunta a la nueva URL.
Además de usar el indicador de reescritura QSA, también puede usar la variable de entorno QUERY_STRING como se muestra a continuación:
RewriteEngine On
RewriteBase /
RewriteRule ^([A-Za-z0-9-_]+)/friends$ /friends.php?user=$1&%{QUERY_STRING}
Y la URL en cuestión
http://www.example.com/mark/friends?page=2
se volverá a escribir en (según lo especificado):
http://www.example.com/friends.php?user=mark&page=2