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

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?

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 .

La consulta no es parte de la ruta de la URL y, por lo tanto, no se puede procesar con la directiva RewriteRule . Esto solo se puede hacer con la directiva RewriteCond (ver %{QUERY_STRING} ).

Pero como Chad Birch ya dijo que es suficiente, establezca la bandera de QSA para obtener automáticamente la consulta solicitada original adjuntada a la nueva URL.

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