This question already has answers here:
PHP - Getting Current URL
(3 answers)
Closed 7 years ago.
I'm working on this page: http://localhost/projectname/custom.php
Both <?php echo $_SERVER['REQUEST_URI']; ?> and <?php echo $PHP_SELF; ?> don't give full location. What should I use to grab the full url location?
function selfURL()
{
$s = empty($_SERVER["HTTPS"]) ? '' : ($_SERVER["HTTPS"] == "on") ? "s" : "";
$protocol = strleft(strtolower($_SERVER["SERVER_PROTOCOL"]), "/").$s;
$port = ($_SERVER["SERVER_PORT"] == "80") ? "" : (":".$_SERVER["SERVER_PORT"]);
return $protocol."://".$_SERVER['SERVER_NAME'].$port.$_SERVER['REQUEST_URI'];
}
function strleft($s1, $s2) { return substr($s1, 0, strpos($s1, $s2)); }
There isn't a native method as far as I know, but you could use this:
function curPageURL() {
$pageURL = 'http';
if ($_SERVER["HTTPS"] == "on") {$pageURL .= "s";}
$pageURL .= "://";
if ($_SERVER["SERVER_PORT"] != "80") {
$pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
} else {
$pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
}
return $pageURL;
}
If you are trying to add variables back onto the end of an URL that you are passing through a link tracking script, for example, you could try this:
$URI = array();
foreach($_GET as $key=>$val)
{
if ($key!="link"&&$key!="id"&&$key!="type") $URI[] = "$key=".urlencode($val);
}
if (sizeof($URI)>0) $link.="&".join("&",$URI);
In this case, "link", "id" and "type" were the variables I needed for the tracking, but the URL I wanted to track had a variable on the end of it that got stripped off by my script as if it was part of the query being sent to it; I needed the add it back to the link URL before passing it to header("Location:".$link).
If this is what you are trying to achieve this works great and is shorter than above example.
check this one... a bit long and dirty but works good...
function absolutizeUrl ( $u, $p )
{
$url = parse_url( $u );
$page = parse_url( $p );
if ( strpos( $u , '/' ) === 0 )
{
//already absolute
} else {
$basePath = '';
if (
isset( $page[ 'path' ] )
&& strpos( ltrim( $page[ 'path' ], '/' ), '/' )
)
{
$baseTokens = explode( '/', $page[ 'path' ] );
array_pop( $baseTokens ); // strip basename
$baseTokens[] = $u;
$u = join( '/', $baseTokens );
}
}
if ( ! isset( $url[ 'host' ]))
{
$u = 'http://'.$page[ 'host' ].'/'.ltrim( $u, '/' );
}
return $u;
}
I found this code very helpful
$protocol = strpos(strtolower($_SERVER['SERVER_PROTOCOL']),'https') ===
FALSE ? 'http' : 'https'; // Get protocol HTTP/HTTPS
$host = $_SERVER['HTTP_HOST']; // Get www.domain.com
$script = $_SERVER['SCRIPT_NAME']; // Get folder/file.php
$params = $_SERVER['QUERY_STRING'];// Get Parameters occupation=odesk&name=ashik
$currentUrl = $protocol . '://' . $host . $script . '?' . $params; // Adding all
echo $currentUrl;
Related
I'm trying to get the full url together with all the query strings of this url
http://localhost/test/searchprocess.php?categ=vessel&keyword=ves&search-btn=Search&page=5
I tried to use this function but it doesn't give me all of the query strings. It only saves the first query string.
function getCurrentURL() {
$currentURL = (#$_SERVER["HTTPS"] == "on") ? "https://" : "http://";
$currentURL .= $_SERVER["SERVER_NAME"];
if($_SERVER["SERVER_PORT"] != "80" && $_SERVER["SERVER_PORT"] != "443") {
$currentURL .= ":".$_SERVER["SERVER_PORT"];
}
$currentURL .= $_SERVER["REQUEST_URI"];
return $currentURL;
}
When I echo getcurrentURL(); it only gives me http://localhost/test/searchprocess.php?categ=vessel
How can I be able to get the full url?
I think your code is almost right. Try this:
$base_url = ( isset($_SERVER['HTTPS']) && $_SERVER['HTTPS']=='on' ? 'https' : 'http' ) . '://' . $_SERVER['HTTP_HOST'];
$url = $base_url . $_SERVER["REQUEST_URI"];
You want the parse_url() function:
http://php.net/manual/en/function.parse-url.php
$url = 'http://username:password#hostname:9090/path?arg=value#anchor';
var_dump(parse_url($url, PHP_URL_QUERY));
which returns
string(9) "arg=value"
I have a small bug in the construction of my URL, I've setup a test for when I am not using port:80 and for some reason if I use say port:8080 it is applying the port number twice for some reason in the code cant explain it.
public function get_full_url()
{
/** get $_SERVER **/
$server = self::get('SERVER');
$page_url = 'http';
if(isset($server['HTTPS']) and $server['HTTPS'] == 'on')
{
$page_url .= 's';
}
$site_domain = (isset($server['HTTP_HOST']) and trim($server['HTTP_HOST']) != '') ? $server['HTTP_HOST'] : $server['SERVER_NAME'];
$page_url .= '://';
if($server['SERVER_PORT'] != '80')
{
$page_url .= $site_domain.':'.$server['SERVER_PORT'].$server['REQUEST_URI'];
}
else
{
$page_url .= $site_domain.$server['REQUEST_URI'];
}
return $page_url;
}
$_SERVER['HTTP_HOST'] would contain port number as it is set in the Host: header
I have any Url with php extension eg:
http://localhost/test/admin/users.php
http://localhost/test/admin/list.php
http://localhost/test/admin/dates.php
Now For print menu ( navigation ) I Have This :
$pagename = basename($_SERVER['PHP_SELF'], '.php') . '';
if ($pagename = "users") {echo "true";} else {}
My Methods Not Work! How To Get PHP page name ?
Thanks
You have to use == (or ===), not = in your if statement.
You are currently assigning the string "users" to the variable $pagename, so that always evaluates to true.
incorrect IF:
if ($pagename == "users") {echo "true";} else {}
Hi you can use $_SERVER['REQUEST_URI'] and get the file name like this
$self = pathinfo($_SERVER['REQUEST_URI'],PATHINFO_BASENAME);
$self=explode('.',$self);
if( $self[0]=="users"){
do...
}
else{}
You can use $_SERVER['REQUEST_URI'] and parse that value:
$self = pathinfo($_SERVER['REQUEST_URI'], PATHINFO_BASENAME);
if($self == "users")
//do something
else
//do something else
function current_page_name()
{
$url = explode('/',$_SERVER['PHP_SELF']);
$current_url = $url[count($url)-1];
return $current_url;
}
current_page_name();
Hope this will help you?
function currentPageNameByURL()
{
$pageURL = 'http';
if ($_SERVER["HTTPS"] == "on")
{
$pageURL .= "s";
}
$pageURL .= "://";
if ($_SERVER["SERVER_PORT"] != "80")
{
$pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
}
else
{
$pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
}
return $pageURL;
}
I use the "Current url" function to get the current link when user changing page language
$uri = explode('&', $_SERVER['REQUEST_URI']);
$uri = $uri[0];
$url = (!empty($_SERVER['HTTPS'])) ? "https://".$_SERVER['SERVER_NAME'].$uri : "http://".$_SERVER['SERVER_NAME'].$uri;
Problem is, when I have a link like this:
http://127.0.0.1/index.php?id=shop&id2=13&lang=lt
id2, of course, disappears. What can I do about this? It is possible if id2 is set to use explode with a second & or something like this?
You can use the parse_url function, here is an example:
$uri = parse_url( $_SERVER['REQUEST_URI']);
$protocol = !empty($_SERVER['HTTPS']) ? 'https://' : 'http://';
$url = $protocol . $_SERVER['SERVER_NAME'] . $_SERVER['SCRIPT_NAME'] . '?' . ( isset( $uri['query']) ? $uri['query'] : '');
I did not see in your code where you get the script's filename, so I used $_SERVER['SCRIPT_NAME'].
Edit: My mistake, I did not see that you need to manipulate / remove the last $_GET parameter. Here is an example on how to do that using a method similar to the above in conjunction with parse_str. Note that this method will work regardless of the location of the lang parameter, it does not have to be the last one in the query string.
$protocol = !empty($_SERVER['HTTPS']) ? 'https://' : 'http://';
$params = array();
if( isset( $_SERVER['QUERY_STRING']) && !empty( $_SERVER['QUERY_STRING']))
{
parse_str( $_SERVER['QUERY_STRING'], $params);
$params['lang'] = 'anything';
// unset( $params['lang']); // This will clear it from the parameters
}
// Now rebuild the new URL
$url = $protocol . $_SERVER['SERVER_NAME'] . $_SERVER['SCRIPT_NAME'] . ( !empty( $params) ? ( '?' . http_build_query( $params)) : '');
Thanks to #Yzmir Ramirez for an improvement in the second version that eliminates the extraneous call to parse_url.
$uri = explode('&', '/index.php?id=shop&id2=13&lang=lt');
$uri = $uri[0];
echo $uri; //echos /index.php?id=shop
You'll want to use
$_SERVER['QUERY_STRING']
to get just the query string. And if you want to keep all the variables, then just keep $uri set to the explode then cycle through them with a foreach.
$uri = explode('&', $_SERVER['QUERY_STRING'];
foreach ($uri as $var_val) {
$var_val = explode('=', $var_val);
$var = $var_val[0];
$val = $var_val[1];
}
Try this: http://codepad.org/cEKYTAp8
$uri = "http://127.0.0.1/index.php?id=shop&id2=13&lang=lt";
$uri = substr($uri, 0, strrpos($uri, '&'));
var_dump($uri); // output: string(41) "http://127.0.0.1/index.php?id=shop&id2=13"
Here is the code I have always used, it also supports ports.
$protocol = (!isset($_SERVER["HTTPS"]) || strtolower($_SERVER["HTTPS"]) == "off") ? "http://" : "https://";
$port = ((isset($_SERVER["SERVER_PORT"]) &&
// http:// protocol defaults to port 80
(($_SERVER["SERVER_PORT"] != "80" && $protocol == "http://") ||
// https:// protocol defaults to port 443
($_SERVER["SERVER_PORT"] != "443" && $protocol == "https://")) &&
// Port is not in http host (port is followed by : at end of address)
strpos($_SERVER["HTTP_HOST"], ":") === false) ? ":" . $_SERVER["SERVER_PORT"] : '');
return $protocol . $_SERVER["HTTP_HOST"] . $port . $_SERVER["REQUEST_URI"];
function getUrlCurrently() {
$pageURL = (#$_SERVER["HTTPS"] == "on") ? "https://" : "http://";
if ($_SERVER["SERVER_PORT"] != "80") {
$pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
} else {
$pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
}
return $pageURL;
}
I'm using this function to determine the current URL of the page. I want to know if it is possible to extend this function to unset a pre-determined $_GET parameter.
All of my $_GET values are stored in an array. So I can access the specific values by using
$my_array[0]
Is it expensive and not realistic to use my suggested logic to accomplish this task?
EDIT: I only want to print the URL to use it as a link.
My url has GET parameters in it.
Not sure what you really want to do with this, but $_GET (and other super-globals) are not read-only :
You can add values into them,
You can overide values,
And, of course, you can unset() values.
Note, though, that modifying $_GET is often not considered as good-practice : when one reads some code, he expects what's in $_GET to come from the parameters in the URL -- and not from your code.
For instance, you can absolutely do something like this :
unset($_GET['my_item']);
Update to your function:
function getUrlCurrently($filter = array()) {
$pageURL = isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == "on" ? "https://" : "http://";
$pageURL .= $_SERVER["SERVER_NAME"];
if ($_SERVER["SERVER_PORT"] != "80") {
$pageURL .= ":".$_SERVER["SERVER_PORT"];
}
$pageURL .= $_SERVER["REQUEST_URI"];
if (strlen($_SERVER["QUERY_STRING"]) > 0) {
$pageURL = rtrim(substr($pageURL, 0, -strlen($_SERVER["QUERY_STRING"])), '?');
}
$query = $_GET;
foreach ($filter as $key) {
unset($query[$key]);
}
if (sizeof($query) > 0) {
$pageURL .= '?' . http_build_query($query);
}
return $pageURL;
}
// gives the url as it is
echo getUrlCurrently();
// will remove 'foo' and 'bar' from the query if existent
echo getUrlCurrently(array('foo', 'bar'));
To assemble a link with GET parameters in an array try:
unset($my_array['key']);
$url = getUrlCurrently() . '?' . http_build_query($my_array);
See http://www.php.net/manual/en/function.http-build-query.php
This has nthg to do with $_GET. You can just use the existing global data $_SERVER, or getenv, like this :
function GetCurrentUrl($debug=FALSE) {
$pageURL = (strtolower($_SERVER["HTTPS"]) == "on") ? "https://" : "http://";
if ($_SERVER["SERVER_PORT"] != "80") {
$pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
}
else {
$pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
}
// DEBUG
if ($debug) {
$msg = "DEBUG MODE: current URL= ".$pageURL ;
if (function_exists('debug_msg')) {
debug_msg($msg , $debug) ;
}else {
echo $msg ;
}
}
return $pageURL;
}
EDIT: but I see where you are coming from with your $_GET statement. You mean the URI contents some parameters. You'll get them by $_SERVER['REQUEST_URI'], or as better suggested, using http_build_query
EDIT2:
On top of that, with regards to one point of your question, you can also add a work around to setup a "rewriting"-like function as described in this php manual interesting example.
Wouldn't it be easier to user $_SERVER['SCRIPT_URI']?
It returns the full url without query parameters.
//your query string is ?a=1&b=2&c=3
function unset_get($param){
//sets string to (array) $query_string
parse_str($_SERVER['QUERY_STRING'],$query_string);
//removes array element defined by param
unset($query_string[$param]);
//returns modified array as a string
return http_build_query($query_string);
}
print unset_get( 'b');
//returns "a=1&c=3"