php mod-rewrite query-string

mod_rewrite con signos de interrogación y símbolos(con PHP)



mod-rewrite query-string (1)

Tengo una aplicación web basada en PHP a la que intento aplicar mod_rewrite de Apache.

Las URL originales son de la forma:
http://example.com/index.php?page=home&x=5

Y me gustaría transformar esto en:
http://example.com/home?x=5

Tenga en cuenta que, al reescribir el nombre de la página, también estoy "moviendo" efectivamente el signo de interrogación. Cuando trato de hacer esto, Apache felizmente realiza esta traducción:

RewriteRule ^/([a-z]+)/?(.+)$ /index.php?page=$1&$2 [NC,L]

Pero arruina las variables $_GET en PHP. Por ejemplo, una llamada a http://example.com/home?x=88 produce solo una variable $_GET ( page => home ). ¿A dónde se fue x => 88 ? Sin embargo, cuando cambio mi regla para usar un ampersand en lugar de un signo de interrogación:

RewriteRule ^/([a-z]+)&(.+)$ /index.php?page=$1&$2 [NC,L]

una llamada como http://example.com/home&x=88 funcionará tal como yo esperaba (es decir, tanto la page como las variables x $ _GET están configuradas de forma adecuada).

La diferencia es mínima, lo sé, pero me gustaría que mis variables de URL "comiencen" con un signo de interrogación, si es posible. Estoy seguro de que esto refleja mi propia incomprensión de cómo los redireccionamientos mod_rewrite interactúan con PHP, pero parece que debería poder hacer esto (de una forma u otra).

¡Gracias por adelantado!
Aclamaciones,
-Chris


Prueba esto:.

RewriteCond %{REQUEST_URI} !^/index.php RewriteRule ^/([a-z]+)(?:$|/?(?:.+)) /index.php?page=$1 [NC,L,B,QSA,NE]

B escapa de la retro-referencia (no debería ser necesario ya que coincide con [az] +, pero en caso de que desee extenderlo más tarde, podría ser útil).

EDITAR: agregó RewriteCond. EDIT 2: QSA se encarga de agregar el ampersand.