2011-01-24 12 views
6

El mod_rewrite parece convertir el símbolo de más antes de que consiga en $ _REQUEST, y yo no sé qué solucionarlo ...PHP Mod_rewrite y símbolos con codificación URL: solo puede usar cualquiera de ellos, pero no ambos.

RewriteRule ^invite/([a-zA-Z0-9\-\+\/]+)/?$ invite.php?key=$1 [L,QSA] 

Por ejemplo, yo de entrada esta en mi URL,

http://mywebsite/invite/xPo8lUEXpqg8bKL%2B32o6yIOK 

me sale esto,

xPo8lUEXpqg8bKL 32o6yIOK 

pero si esta petición de entrada sin pasar por el mod_rewrite,

http://mywebsite/invite.php?key=xPo8lUEXpqg8bKL%2B32o6yIOK 

consigo esto lo que quiero,

xPo8lUEXpqg8bKL+32o6yIOK 

¿Qué puede hacer? ¿O es que solo puedo usarlos, pero no los dos?

Gracias.

+0

¿Puede aclarar qué ingresa y qué obtiene? –

+0

@Pekka: lo siento, acabo de corregir mis errores en mi escrito anterior y he aclarado mis comentarios. Gracias. – laukok

+0

+1 pregunta interesante: nunca me he encontrado con esto antes. –

Respuesta

3

Trate de añadir la [B] bandera (escapar de referencias hacia atrás):

RewriteRule ^invite/([a-zA-Z0-9\-\+\/]+)/?$ invite.php?key=$1 [L,B,QSA] 
+1

sí, lo intenté, pero aún así ... :( – laukok

1

El carácter "+" está reservado en la parte cadena de consulta de una URL como un espacio. En realidad, el estado "+" como un carácter reservado está documentado en rfc3986 y su uso (ahora heredado) como un reemplazo espacial está documentado en rfc1630.

Dado que Apache intenta evitar cualquier conflicto, automáticamente escapa "+" como una cadena antes de pasarlo de nuevo.


Usando la bandera [NE] (NoEscape) en su reescritura debe impedir que el comportamiento ocurra.

RewriteRule ^invite/([a-zA-Z0-9\-\+\/]+)/?$ invite.php?key=$1 [L,NE,QSA] 

Sin embargo, mediante el uso de esto, sin escape "+" será reemplazado por un espacio si el usuario escribe la URL manualmente. Para estar seguro, simplemente reemplace todos los espacios en su entrada por signos "+".


Francamente, ya que no acepta espacios en su entrada, basta con sustituir todos los espacios con un símbolo "+". Usar la bandera [NE] puede traer a colación problemas mayores que una simple sustitución de caracteres. Un simple $_GET['key'] = str_replace($_GET['key'], ' ', '+'); debería ser suficiente.

+0

gracias por esto. Lo intenté, pero todavía no tuve suerte ... ¿alguna otra opción, por favor ...? – laukok

+0

@lauthiamkok: ya que no acepta espacios en su entrada , un simple '$ _GET ['key'] = str_replace ($ _GET ['key'], '', '+');' debería ser suficiente. Será la única fuente de espacios de todos modos. –

+0

gracias por la solución de str_replace :-) – laukok

Cuestiones relacionadas