!/usr/bin/env perl use strict; use warnings; use URI; # a relative url: my $rel_url = '../../../../../abc.html'; # the base url, where I stand now: my @base_uris = ('http://server.com/123/xyz', 'http://server.com/1/2/3/4/5', 'http://server.com/1/2/3/4/5/'); # URI's absolute url: foreach my $abase (@base_uris){ my $uri = URI->new_abs( $rel_url, $abase ); print "absolute for base: $abase is\n\t".$uri."\n"; } #### absolute for base: http://server.com/123/xyz is http://server.com/../../../../abc.html absolute for base: http://server.com/1/2/3/4/5 is http://server.com/../abc.html absolute for base: http://server.com/1/2/3/4/5/ is http://server.com/abc.html #### # Some servers erroneously return a relative URL for redirects, # so make it absolute if it not already is. local $URI::ABS_ALLOW_RELATIVE_SCHEME = 1; my $base = $response->base; $referral_uri = "" unless defined $referral_uri; $referral_uri = $HTTP::URI_CLASS->new($referral_uri, $base)->abs($base);