Siga los redireccionamientos en cURL

S

La utilidad cURL es un programa de línea de comandos que a menudo se incluye con distribuciones Unix / Linux y sistemas operativos Mac OSX. Le permite enviar casi cualquier tipo de solicitud HTTP a través de la línea de comando, lo cual es excelente para muchas cosas, desde la publicación de datos hasta una API REST y la descarga de archivos.

Es muy común que los servidores HTTP devuelvan una redirección 301 o 302 para una URL determinada. Un ejemplo común de esto es redirigir su navegador de una URL HTTP a HTTPS, como http://Pharos.sh.com a https://Pharos.sh.com. Usando cURL, podemos ver cómo se ve realmente esta redirección:

$ curl -i http://Pharos.sh.com
HTTP/1.1 301 Moved Permanently
Date: Thu, 18 Apr 2019 02:11:32 GMT
Transfer-Encoding: chunked
Connection: keep-alive
Cache-Control: max-age=3600
Expires: Thu, 18 Apr 2019 03:11:32 GMT
Location: https://Pharos.sh.com/

Tenga en cuenta que usé el -i flag para que imprima los encabezados de respuesta de la solicitud.

Cuando se usa en scripts Bash o se ejecuta cURL a través de la línea de comando manualmente, no querrá tener que manejar estos redireccionamientos manualmente, de lo contrario podría agregar mucha lógica innecesaria a su script. Debido a esto, cURL ofrece una marca de línea de comando que le dice que siga automáticamente la redirección y devuelva el punto final resuelto y sus datos:

$ curl -L [url]

La ejecución de este comando manejará automáticamente cualquier redireccionamiento 3XX y recuperará los datos devueltos por la URL resultante.

Aquí está la misma solicitud de arriba, pero con el -L (que es un alias para --location) marca para seguir las redirecciones:

$ curl -iL http://Pharos.sh.com
HTTP/1.1 301 Moved Permanently
Date: Thu, 18 Apr 2019 02:17:42 GMT
Transfer-Encoding: chunked
Connection: keep-alive
Cache-Control: max-age=3600
Expires: Thu, 18 Apr 2019 03:17:42 GMT
Location: https://Pharos.sh.com/

HTTP/1.1 200 OK
Date: Thu, 18 Apr 2019 02:17:42 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
domain=.Pharos.sh.com; HttpOnly; Secure
Cache-Control: public, max-age=3600
Vary: Accept-Encoding
P3P: CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"
Expires: Thu, 18 Apr 2019 03:17:42 GMT

<!DOCTYPE html>
<html lang="en">
...
</html>

Tenga en cuenta que dado que mantuvimos el -i flag en su lugar nos mostró los encabezados para cada una de las solicitudes realizadas, además del HTML final devuelto por el servidor, que fue abreviado por brevedad.

Limitación de redireccionamientos

Pero, ¿qué pasa si la URL que solicita se redirecciona a otra URL que devuelve una redirección? No es raro encontrarse con múltiples redireccionamientos secuenciales antes de llegar al destino final.

Por ejemplo, digamos que mi servidor tiene las siguientes reglas:

  • Redirigir de HTTP a HTTPS
  • Redirigir de example.com a www.example.com
  • Redirigir desde / acerca de / acerca de nosotros
  • Redirigir de ninguna barra al final a una barra al final

Dadas estas reglas, si enviamos una solicitud a http://example.com/about llegaríamos a 4 redireccionamientos para finalmente terminar en https://www.example.com/about-us/. Si bien no se trata de muchas redirecciones, puedes imaginar que es posible encontrar muchas más.

¿Y si dos URL se redireccionan continuamente entre sí? Entonces estarías atrapado en un ciclo infinito de redireccionamiento. cURL tiene una forma de manejar esto imponiendo un número máximo de redireccionamientos que seguirá, que por defecto es 50. Usando el --max-redirs opción, puede establecer este número en el que mejor se adapte a su caso de uso.

Entonces, usando nuestro ejemplo ficticio de arriba, si establecemos un número máximo de redirecciones en 1, veríamos un error como este:

$ curl -iL --max-redirs 1 http://example.com
HTTP/1.1 301 Moved Permanently
Date: Thu, 18 Apr 2019 02:39:59 GMT
Transfer-Encoding: chunked
Connection: keep-alive
Location: https://example.com/about

HTTP/1.1 301 Moved Permanently
Date: Thu, 18 Apr 2019 02:39:59 GMT
Transfer-Encoding: chunked
Connection: keep-alive
Location: https://www.example.com/about
P3P: CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"

curl: (47) Maximum (1) redirects followed

Por otro lado, si no desea ningún límite, configúrelo en -1.

 

About the author

Ramiro de la Vega

Bienvenido a Pharos.sh

Soy Ramiro de la Vega, Estadounidense con raíces Españolas. Empecé a programar hace casi 20 años cuando era muy jovencito.

Espero que en mi web encuentres la inspiración y ayuda que necesitas para adentrarte en el fantástico mundo de la programación y conseguir tus objetivos por difíciles que sean.

Add comment

Sobre mi

Últimos Post

Etiquetas

Esta web utiliza cookies propias para su correcto funcionamiento. Al hacer clic en el botón Aceptar, aceptas el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad