Cómo abrir un Popup con una URL "escapada" en el GET (js)
A ver si alguien me echa una mano porque yo ya no encuentro explicación posible.
Vía js llamo a una página con una serie de variables GET, y una de ellos es una url, e.g.
<code>
http://url/script/?url=...
</code>
Uso encodeURIComponent() para escapar los caracteres problemáticos de la url.
Pero, por mucho que los caracteres conflictivos estén correctamente escapados, si aparece un ámpersand (&) en la url, luego en el servidor se me corta ahí. O sea:
<code>
url=encodeURIComponent("http://www.blabla.com/index.php?pubid=101852&pag=5");
</code>
Con lo que:
<code>
url=http%3A%2F%2Fwww.blabla.com%2Findex.php%3Fpubid%3D101852%26pag%3D5
</code>
En servidor sólo veo:
<code>
$_GET['url'] = http%3A%2F%2Fwww.blabla.com%2Findex.php%3Fpubid%3D101852
</code>
Hasta el primer "&" que aparece.
Qué se me está pasando? Debo sustituir los '&' a mané? No se supone que encodeURIComponent() está precisamente para eso?
Thanks!
kr0n
Pues sí, que no sabía en que invertir la tarde yo...
Lo mismo, pero con un poco de mejor formato, en el blog:
Cómo evitar que window.open te joda los ámpersands
orange
Ahí te he visto bien Juan Palomo
kr0n
Bueno, actualizo con la solución definitiva, por si alguien se encuentra alguna vez en la misma situación que no pierda una bonita tarde como yo.
Después de un buen rato dándole vueltas al flag [QSA] del mod_rewrite y de incluso encontrar bugs en Apache relativos a mi mismo problema, me dí cuenta de que los tiros no iban por ahi.
Los tiros iban por el dichoso window.open() para abrir el popup, que es muy listo él y te hace un unescape de la url que le pases. Así que sí tu url tiene cosas escapadas, como en mi caso una de las variables que se le pasaban a la página vía GET, pues cogía y me la devolvía a su estado original, es decir sin escapar. Y ya la teníamos liada.
ejemplo en vivo y en directo
¿Solución?
Como he leído por ahí ([1] y [2]), la solución es tan sencilla como doble-escapar los ámpersand, de %26 (su representación HEX normal) a %2526. Esto el browser lo procesa la primera vez y se queda en %26, que es lo que nos interesa, nuestro ámpersand escapado.
Así que al final he acabado haciendo lo siguiente:
<code>//encodeURL with ampersand support
function encodeURL(url) {
return encodeURIComponent(url).replace(/%26/g, "%2526");
}
</code>
*suspiro*
kr0n
Vale, me autocontesto:
No es problema del js, es problema de un rewrite que hay por medio que me está jodiendo los caracteres escapados.
Sorry ;)