tester rewriterule rewritebase mod_rewrite htaccess ejemplos regex apache mod-rewrite

rewriterule - Hacer coincidir el signo de interrogación en la regla mod_rewrite regex



rewritebase (3)

Estoy buscando reescribir urls con múltiples subcadenas. Se solicita una subcadena como subdirectorio, mientras que cualquier otra se solicita como parámetros de cadena de consulta normales.

Por ejemplo, me gustaría volver a escribir urls 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 del 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 personaje, 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 los parámetros que aparecen después / usuario / amigos como están. ¿Cómo logro esto?


Además de usar la bandera 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 reescribirá a (como se especifica):

http://www.example.com/friends.php?user=mark&page=2


Debería utilizar el indicador [QSA] lugar de intentar reescribir la cadena de consulta. [QSA] la cadena de consulta a la URL reescrita.

Entonces su regla debería verse así:

... RewriteEngine On RewriteBase / RewriteRule ^([A-Za-z0-9-_]+)/friends/? friends.php?user=$1 [QSA,L]

Su caso es muy similar al ejemplo dado para usar la bandera QSA en el libro de cocina mod_rewrite .