How to display real destination URL

I am using curl to verify redirects and display real destination URL and you should try it too.

Command-line

The simplest way to display real destination URL is to use quiet mode, discard output, follow redirects and display the URL that was fetched in the last transfer after executing GET method.

$ curl --silent --location --output /dev/null --write-out "%{url_effective}\n" http://sleeplessbeastie.eu
https://sleeplessbeastie.eu/

This solution can be extended to fetch only headers instead of the whole document.

$ curl --head --silent --location --output /dev/null --write-out "%{url_effective}\n" http://sleeplessbeastie.eu
https://sleeplessbeastie.eu/

You can be more verbose and display number of performed redirects.

$ curl --head --silent --location --output /dev/null --write-out "It took %{num_redirects} redirect/redirects to get %{url_effective}\n" http://sleeplessbeastie.eu
It took 1 redirect/redirects to get https://sleeplessbeastie.eu/

Shell script

Use the following shell script to iterate over every redirection and display it in human readable form.

#!/bin/bash
# Display redirects performed for given URL

if [ "$#" != "1" ]; then
  echo "Display redirects performed for given URL"
  echo "URL is missing"
  exit
fi

# URL from/to
curl_url_from=""
curl_url_to="$1"

# number of performed redirects
curl_num_redirects="0"

# use head instead of get?
curl_use_head=0

# define head or get method
if [ "$curl_use_head" -eq "1" ]; then
  curl_param_head="--head"
else
  curl_param_head=""
fi

# main loop
while true; do
  # execute curl to get from/to URL
  curl_output="$(curl $curl_param_head --silent --output /dev/null --write-out " %{url_effective} %{redirect_url}\n" $curl_url_to)"
  # calculate number of received parameters
  curl_output_n="$(echo $curl_output | awk '{print NF}')"
  if [ "$curl_output_n" -eq "2" ]; then
    # number of received parameters is equal to 2
    # it means that there was redirection

    # set from/to URL
    curl_url_from="$(echo $curl_output | awk '{print $1}')"
    curl_url_to="$(echo $curl_output | awk '{print $2}')"

    # get http code
    curl_http_code="$(curl $curl_param_head --silent --output /dev/null --write-out "%{http_code}\n" $curl_url_to)"
    echo "${curl_url_from} -> ${curl_url_to} (${curl_http_code})"

    # increase number of redirects
    curl_num_redirects=$(expr $curl_num_redirects \+ 1)
  else
    # number of received parameters is equal to 1
    # it means that there was no redirection

    if [ "$curl_num_redirects" -gt "0" ]; then
      echo
    fi
    echo "Number of performed redirects: $curl_num_redirects"
    break
  fi
done

Shell script - examples

Standard http to https redirect:

$ bash display_redirects.sh http://sleeplessbeastie.eu
http://sleeplessbeastie.eu/ -> https://sleeplessbeastie.eu/ (200)

Number of performed redirects: 1

No redirect:

$ bash display_redirects.sh https://sleeplessbeastie.eu
Number of performed redirects: 0

Standard http to https redirect with 404 http code:

$ bash display_redirects.sh http://sleeplessbeastie.eu/non-existent
http://sleeplessbeastie.eu/non-existent -> https://sleeplessbeastie.eu/non-existent (404)

Number of performed redirects: 1

Multiple redirects:

$ bash display_redirects.sh http://clickmeeting.com
http://clickmeeting.com/ -> http://clickmeeting.com/pl (301)
http://clickmeeting.com/pl -> https://clickmeeting.com/pl (200)

Number of performed redirects: 2
Milosz Galazka's Picture

About Milosz Galazka

Milosz is a Linux Foundation Certified Engineer working for a successful Polish company as a system administrator and a long time supporter of Free Software Foundation and Debian operating system.

Gdansk, Poland https://sleeplessbeastie.eu