URI info and full manipulation

The League\Uri\BaseUri class is build to ease gathering information regarding a specific URI. The class makes it easier to transform and crawl pages containing URIs (ie: a web page, or an HTTP client for instance).

While the class does manipulate URI it does not implement any URI related interface.

If a PSR-7 UriInterface implementing instance is given then the return value will also be a PSR-7 UriInterface implementing instance.


Instantiation is done via the BaseUri::from named constructor which accepts string and stringable objects alike. Once instantiated you can get access to its underlying URI as a string via the BaseUri::getUriString() method .


use League\Uri\BaseUri;

$baseUri = BaseUri::from('http://www.ExaMPle.com');
$baseUri->getUriString(); // return 'http://www.example.com';
echo $baseUri; // display 'http://www.example.com'

The instance also implements PHP’s Stringable and JsonSerializable interface.

URI resolution

The BaseUri::resolve resolves a URI as a browser would for a relative URI while the BaseUri::relativize does the opposite.


use League\Uri\BaseUri;

$baseUri = BaseUri::from('http://www.ExaMPle.com');
$uri = 'http://www.example.com/?foo=toto#~typo';

$relativeUri = $baseUri->relativize($uri);
echo $relativeUri; // display "/?foo=toto#~typo
echo $baseUri->resolve($relativeUri);
echo $baseUri; // display 'http://www.example.com'
// display 'http://www.example.com/?foo=toto#~typo'
echo $baseUri->getUri()::class; //display \League\Uri\Uri

Out of the box when submitting an object other than a PSR-7 UriInterface the returned URI object will be a League\Uri\Uri instance. You can control this behaviour by registering a PSR-7 UriFactoryInterface on BaseUri instantiation


use League\Uri\BaseUri;
use GuzzleHttp\Psr7\HttpFactory;

$baseUri = BaseUri::from('http://www.ExaMPle.com', new HttpFactory());
$uri = 'http://www.example.com/?foo=toto#~typo';

$relativeUri = $baseUri->relativize($uri);
echo $relativeUri;               // display "/?foo=toto#~typo"
echo $relativeUri::class;        // display '\Leage\Uri\BaseUri'
echo $relativeUri->getUri()::class; //display \GuzzleHttp\Psr7\Uri

$resolvedUri = $baseUri->withoutUriFactory()->resolve("/?foo=toto#~typo");
echo $resolvedUri;               // display 'http://www.example.com/?foo=toto#~typo'
echo $resolvedUri::class;        // display '\Leage\Uri\BaseUri'
echo $resolvedUri->getUri()::class; // display \League\Uri\Uri

You can always switch back to using the Uri object by unregistering the factory using BaseUri::withoutUriFactory.

URI information

The class also exposes a list of public methods which returns the URI state.


Tells whether the URI represents an absolute URI.


use League\Uri\Uri;
use League\Uri\BaseUri;

BaseUri::from(Uri::fromServer($_SERVER))->isAbsoulte(); //returns true
BaseUri::from("/🍣🍺")->isAbsolute(); //returns false


Tells whether the URI represents an absolute URI path.

BaseUri::from(Uri::fromServer($_SERVER))->isAbsolutePath(); //returns false
BaseUri::from(Http::new("/🍣🍺"))->isAbsolutePath(); //returns true


Tells whether the URI represents a network path URI.

BaseUri::from("//example.com/toto")->isNetworkPath(); //returns true
BaseUri::from("/🍣🍺")->isNetworkPath(); //returns false


Tells whether the given URI object represents a relative path.

BaseUri::from("🏳️‍🌈")->isRelativePath(); //returns true
BaseUri::from("/🍣🍺")->isRelativePath(); //returns false


Tells whether the given URI object represents the same document.

BaseUri::from(Http::new("example.com?foo=bar#🏳️‍🌈"))->isSameDocument("exAMpLE.com?foo=bar#🍣🍺"); //returns true


since version 7.2.0

Tells whether the given URI object contains a IDN host.

BaseUri::from(Http::new("https://bébé.be"))->hasIdn(); //returns true


Tells whether the given URI object represents different origins. According to RFC9110 The “origin” for a given URI is the triple of scheme, host, and port after normalizing the scheme and host to lowercase and normalizing the port to remove any leading zeros.


use GuzzleHttp\Psr7\Utils;
use League\Uri\BaseUri;
use Nyholm\Psr7\Uri;

    ->isCrossOrigin(new Uri('http://Bébé.BE./path')); // returns false

    ->isCrossOrigin(new Uri('https://www.example.com/')); // returns true

The method takes into account i18n while comparing both URI if the PHP’s idn_* functions can be used.


Returns the URI origin used for comparison when calling the isCrossOrigin method. The algorithm used is defined by the WHATWG URL Living standard


use League\Uri\Http;
use League\Uri\Uri;
use League\Uri\BaseUri;

echo BaseUri::from(Http::new('https://uri.thephpleague.com/uri/6.0/info/'))->origin(); //display 'https://uri.thephpleague.com';
echo BaseUri::from('blob:https://mozilla.org:443')->origin();       //display 'https://mozilla.org'
BaseUri::from(Uri::new('file:///usr/bin/php'))->origin();           //returns null
BaseUri::from('data:text/plain,Bonjour%20le%20monde%21')->origin(); //returns null

For absolute URI with the file scheme the method will return null (as this is left to the implementation decision)

Because the origin property does not exist in the RFC3986 specification this additional steps is implemented:


use League\Uri\Http;
use League\Uri\BaseUri;

BaseUri::from((Http::new('/path/to/endpoint'))->origin(); //returns null