PHP 7.1.0 Release Candidate 4 Released


(PECL pecl_http >= 0.21.0)

http_build_urlBuild a URL


string http_build_url ([ mixed $url [, mixed $parts [, int $flags = HTTP_URL_REPLACE [, array &$new_url ]]]] )

Build a URL.

The parts of the second URL will be merged into the first according to the flags argument.



(part(s) of) an URL in form of a string or associative array like parse_url() returns


same as the first argument


a bitmask of binary or'ed HTTP_URL constants; HTTP_URL_REPLACE is the default


if set, it will be filled with the parts of the composed url like parse_url() would return

Return Values

Returns the new URL as string on success or FALSE on failure.


Example #1 A http_build_url() example

echo http_build_url("",
"scheme" => "ftp",
"host" => "",
"path" => "files/current/",
"query" => "a=c"

The above example will output:

See Also

add a note add a note

User Contributed Notes 8 notes

zlatko dot zlatev at gmail dot com
1 year ago
pecl_http 2+ won't provide http_ functions any more. They moved to Http namespace, sadly no backwards compat.

To sum it up - As of pecl_http >=2.0.0 this is no longed available. Also pecl_http 1.7.6 will work only for PHP <=5.5. For PHP 5.6 we are forced to use version pecl_http 2.0.6+
anon at example dot com
2 years ago
If you need to access the url to the current script you should examine $_SERVER['REQUEST_URI'].

Using an undocumented feature that gives the same functionality as existing PHP library calls is reckless.
Ant P.
6 years ago
This function has a useful undocumented feature - the defaults are set in such a way that calling it with no parameters returns the full URL of the page being accessed.
pasafama at gmail dot com
2 years ago
It seems to me that the return value must always have a protocol, a host and a path. If they are not provided in the input, default values are added.

From what I saw, the default value for the protocol is 'http://', for the host is the hostname (if running from cli) or the variable $_SERVER['HTTP_HOST'], for the path is the variable $_SERVER['SCRIPT_NAME']
randyg at ernieball dot com
4 years ago
Although I've never used this function, based on the documentation it seems that the above code should also include the following:

if ( ! is_array( $url ) ) // Added - Randy
    // Parse the original URL
$parse_url = parse_url($url);
// allow parts to be a url Added - Randy
if ( ! is_array( $parts ) )
$parts = parse_url( $parts );
Yzmir Ramirez
3 years ago
So you used parse_url(...) and looking to put it back together and seeing if this function will do? 

You may have seen some glue* functions that will rebuild the url with the parts that you have.  Try this:


= parse_url($uri);
/* do your magic here on $parts */
$uri = http_build_url('', $parts);

Notice the first param is empty string.  It also works with NULL and array() as well.
michael at REMOVE-THIS-PART dot muryn dot name
2 years ago
To those that want to use http_build_url() without parameters to get the canonical page URL, be aware that this function seem to consider the equivalent of SCRIPT_NAME for the path instead of REQUEST_URI.

For example, if /example serve info.php (you can do this with mod_rewrite in Apache for example), while accessing this function will return instead of the URL the user see.  This could lead to obvious problems if you build other URL from this.

So like another comment say, it is reckless to use that undocumented feature.  Instead here is what I suggest:

function get_request_url()
get_request_scheme() . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];

    return (isset(
$_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
mtinsley at dallasairmotive dot com
1 year ago
To see new interface:

= new http\Url('', ['query' => http_build_query(['q' => 'test'])]);


// Output:
To Top