Seguir redireccionamientos en cURL

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. Te permite enviar casi cualquier tipo...

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 comandos, lo cual es excelente para muchas cosas, desde publicar datos en una API REST hasta descargar archivos.

Es extremadamente 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 desde una URL HTTP a HTTPS, como https://wikihtp.com a https://wikihtp.com. Usando cURL, podemos ver cómo se ve realmente esta redirección:

1
2
3
4
5
6
7
8
$ curl -i https://wikihtp.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://wikihtp.com/

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

Cuando se usa en secuencias de comandos de 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 secuencia de comandos. Debido a esto, cURL ofrece un indicador de línea de comando que le indica que siga automáticamente la redirección y devuelva el punto final resuelto y sus datos:

1
$ curl -L [url]

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

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ curl -iL https://wikihtp.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://wikihtp.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=.wikihtp.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 indicador -i en su lugar, nos mostró los encabezados de cada una de las solicitudes realizadas, además del HTML final devuelto por el servidor, que se acortó por brevedad.

Limitación de redireccionamientos

Pero, ¿qué sucede si la URL que solicita redirige 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 ejemplo.com a www.ejemplo.com
  • Redirigir de /sobre a /sobre-nosotros
  • Redirigir de sin barra inclinada final a una barra inclinada 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 en realidad no se trata de muchos redireccionamientos, puede imaginar que es posible encontrar muchos más.

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

Entonces, usando nuestro ejemplo ficticio de arriba, si establecemos un número máximo de redireccionamientos en 1, veremos un error como este:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
$ 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, simplemente configúrelo en -1.

Licensed under CC BY-NC-SA 4.0