¿Cómo codificar los parámetros de URL?

2 minutos de lectura

avatar de usuario
Apoorv Saxena

Estoy tratando de pasar parámetros a una URL que se ve así:

http://www.foobar.com/foo?imageurl=

Y quiero pasar los parámetros, como una URL de imagen que otra API genera, y el enlace para la imagen resulta como:

http://www.image.com/?username=unknown&password=unknown

Sin embargo, cuando trato de usar la URL:

http://www.foobar.com/foo?imageurl=http://www.image.com/?username=unknown&password=unknown

no funciona

También he intentado usar encodeURI() y encodeURIComponent() en la imageURL, y eso tampoco funciona.

  • ¿Qué idioma está generando la URL? ¿JavaScript?

    – Phil

    15 de noviembre de 2011 a las 10:53

  • Tenga en cuenta que no debe poner contraseñas en las URL, ni siquiera cuando use https, ya que cada enrutador entre el cliente y el servidor verá la URL completa.

    – fabuloso

    30 de agosto de 2018 a las 5:54

  • ¿Responde esto a tu pregunta? ¿Cómo crear parámetros de consulta en Javascript?

    – Nick Grely

    25 de agosto de 2020 a las 3:16

  • @fabb Eso no parece ser cierto: stackoverflow.com/a/499594/513038

    – Erhannis

    8 dic 2020 a las 17:01

  • La ruta @Erhannis GET y los parámetros están encriptados para HTTPS, pero no para HTTP (que, bueno, nadie debería usar, pero aún así…). Sin embargo, mucho más en serio, los registros del servidor y cualquier herramienta de análisis verán los parámetros GET, por lo que registrará contraseñas de texto sin formato en sus registros de apache y en su Google Analytics. También se envían a través del encabezado de referencia, si está habilitado. Ver seguridad.stackexchange.com/questions/233795/…

    – Dan W.

    3 sep 2021 a las 10:39

Con PHP

echo urlencode("http://www.image.com/?username=unknown&password=unknown");

Resultado

http%3A%2F%2Fwww.image.com%2F%3Fusername%3Dunknown%26password%3Dunknown

Con JavaScript:

var myUrl = "http://www.image.com/?username=unknown&password=unknown";
var encodedURL= "http://www.foobar.com/foo?imageurl=" + encodeURIComponent(myUrl);

MANIFESTACIÓN: http://jsfiddle.net/Lpv53/

  • Esta pregunta no es sobre PHP, sino sobre Javascript.

    – Flamm

    14 oct 2021 a las 13:06

avatar de usuario
Kyle Vander Beek

Usando el nuevo ES6 Object.entries()lo convierte en un divertido poco anidado map/join:

const encodeGetParams = p => 
  Object.entries(p).map(kv => kv.map(encodeURIComponent).join("=")).join("&");

const params = {
  user: "María Rodríguez",
  awesome: true,
  awesomeness: 64,
  "ZOMG+&=*(": "*^%*GMOZ"
};

console.log("https://example.com/endpoint?" + encodeGetParams(params))

  • Esto funciona muy bien en mi caso. Agregué una llamada a decodeURIComponent dentro de la función de mapa para asegurarme de que las entradas ya codificadas no reciban mensajes.

    – Herbert Pimentel

    23 de diciembre de 2021 a las 13:34

avatar de usuario
serv-inc

Con URLSearchParams:

const params = new URLSearchParams()
params.append('imageurl', 'http://www.image.com/?username=unknown&password=unknown')
return `http://www.foobar.com/foo?${params.toString()}`

  • ¿Funcionará esto en todos los navegadores y versiones de navegador?

    – Por favor trabaje

    25 abr a las 11:37

  • @PlsWork: si bien es un estándar, algunos navegadores caniuse.com/urlsearchparams

    – serv-inc

    25 abr a las 13:24

avatar de usuario
HoldOffHunger

Sólo inténtalo encodeURI() y encodeURIComponent() tú mismo…

console.log(encodeURIComponent('@#$%^&*'));

Aporte: @#$%^&*. Producción: %40%23%24%25%5E%26*. Entonces, espera, ¿qué pasó con *? ¿Por qué no se convirtió esto? TLDR: en realidad quieres fixedEncodeURIComponent() y fixedEncodeURI(). Larga historia…

No deberías estar usando encodeURIComponent() o encodeURI(). Deberías usar fixedEncodeURIComponent() y fixedEncodeURI()según la documentación de MDN.

Con respecto a encodeURI()

Si uno desea seguir el RFC3986 más reciente para URL, que hace que los corchetes se reserven (para IPv6) y, por lo tanto, no se codifiquen al formar algo que podría ser parte de una URL (como un host), el siguiente fragmento de código puede ayudar:

function fixedEncodeURI(str) { return encodeURI(str).replace(/%5B/g, '[').replace(/%5D/g, ']'); }

Con respecto a encodeURIComponent()

Para ser más estrictos en el cumplimiento de RFC 3986 (que se reserva !, ‘, (, ) y *), aunque estos caracteres no tienen usos delimitadores de URI formalizados, se puede usar lo siguiente de manera segura:

function fixedEncodeURIComponent(str) { return encodeURIComponent(str).replace(/[!'()*]/g, function(c) { return '%' + c.charCodeAt(0).toString(16); }); }

¿Entonces cuál es la diferencia? fixedEncodeURI() y fixedEncodeURIComponent() convertir el mismo conjunto de valores, pero fixedEncodeURIComponent() también convierte este conjunto: +@?=:*#;,$&. Este conjunto se utiliza en GET parámetros (&, +etc.), etiquetas de anclaje (#), etiquetas comodín (*), partes de correo electrónico/nombre de usuario (@), etc..

Por ejemplo — Si utiliza encodeURI(), user@example.com/?email=me@home no enviará correctamente el segundo @ al servidor, a excepción de que su navegador maneje la compatibilidad (como Chrome, naturalmente, lo hace a menudo).

¿Ha sido útil esta solución?