Getting full URL with PHP on Windows doesn't work - php

I am trying to build a language switch for a site of mine, but, as the hosting MUST BE a Windows IIS with PHP, I am not able to get the full URL of the page viewed by the visitor.
Say I am on domain.com/page.php?id=23, what I get using the old fashioned
$url = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
is an empty string.
So I have tried a solution found here on stackoverflow to get the full URL
function getFullUrl() {
$pageURL = 'http';
if ($_SERVER["HTTPS"] == "on") {$pageURL .= "s";}
$pageURL .= "://";
if ($_SERVER["SERVER_PORT"] != "80") {
$pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER['HTTP_X_REWRITE_URL'];
} else {
$pageURL .= $_SERVER["SERVER_NAME"].$_SERVER['HTTP_X_REWRITE_URL'];//$_SERVER["REQUEST_URI"] blank
}
return $pageURL;
}
but still nothing. I get something like: domain.com/page.php? in some cases and doman.com/? in others.
Is there a definitive way to get the full url in that scenario?
Thank you very much.
EDIT
It seems that the thing cannot be done on that server. I solved using a client side work around written in js+jQuery (I used purl plugin)....horrible :) Here it is:
$('.lang').each(function(){
$(this).click(function(e){
e.preventDefault();
var lingua = $(this).find('a').data('lang');
var url = window.location.href;
var urlParts = purl(url);
if (url.indexOf("?") >= 0)
{
var queryString = urlParts.attr('query').split('&');
var langIndex = queryString.indexOf('lang');
if(langIndex > -1)
{
queryString.splice(langIndex,1);
var newUrl = urlParts.attr('protocol')+urlParts.attr('host')+urlParts.attr('path')
window.location = newUrl + '&lang='+lingua;
}
else window.location = url + '&lang='+lingua;
}
else
window.location = url + '?lang='+lingua;
});
});
It seems to work, even if I don't get why if "lang" is already in the query string, the script doesn't recognize it and continues adding &lang every time I click on the links. Sure, it works anyway, but it is horrible to watch a URL like &lang=en&lang=fr&lang=pl&lang=de

This line returns empty
$url = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
because it should be this:
$url = "http://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
You need quotes for the keys....see here in the manual.

Related

Update a paremeter in a url instead of adding a new one

having a bit of trouble. Basically I have created some pagination. The problem is each time I click on a page number url it just adds the parameter to the url even if it already exists.
so for instance I land on the page. My url is now example.com/page?pagenum=1, I click the second page so my url is now example.com/page?pagenum=1&pagenum=2. Now it all works fine but as you can imagine is going to get a bit messy so would rather it update the parameter that's already in the URL. I'm currently using the following to get the current page URL:
<?php
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;
}
?>
and then the Link is something like:
<a href='<?php echo curPageURL(); ?>&pagenum=<?php echo "1"; ?>'> 1 </a>
Update
I have other paremeters in the URL I need to keep, I only need to update 'pagenum'
The problem exists because REQUEST_URI contains both the path and query string, and you're appending a new query string to that every page turn. To extract the path, you could use this code, taken from this answer:
$path = strtok($_SERVER["REQUEST_URI"], '?');
You can then copy existing query string fields, but remove pagenum:
$fields = $_GET;
unset($fields['pagenum']); // remove any existing pagenum value
$path .= '?' . http_build_query($fields); // re-append the query string
You could then use more or less your existing link code:
<a href='<?php echo $path; ?>&pagenum=<?php echo "1"; ?>'> 1 </a>
You can use http_build_query like so:
$all_params = $_GET;
$all_params["page"] = "2";
$link = "page.php?" . http_build_query($all_params); // "page.php?page=2&foo=bar"

Get current page title without loop

I have a small script which should get the meta title of the current page the script is added into. The problem is, that its working fine on several test pages, but not into my CMS. It loops until death there and I cant reach any page on my server until I restart apache completely and by taking the script off.
May someone take a look at it? This would be really awesome since I used google for hours and sure, I found X threads and pages, but never a solution for this special loop-effect.
<?php
function curPageURL() {
$pageURL = 'http';
$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;
}
?>
<?php
if (!isset($_GET['ignore']))
{
$url = curPageURL();
$data = implode("", file("$url?ignore=this"));
preg_match ("/<title>([^`]*?)<\/title>/", $data, $match);
$urltitle = $match[1];
}
?>
<?echo $urltitle;?>
The $_SERVER["REQUEST_URI"] can also include GET params like this:
mysite.com?param1=1&param2=2
Then you try to append a string ?ignore=this so you get
mysite.com?param1=1&param2=2?ignore=this
which is translated by PHP into variables like
param1 = '1'
param2 = '2?ignore=this'
You must check for ? symbol in the $url variable
I'm using this function to get the current page url :
function currentURL() {
$protocol = stripos($_SERVER['SERVER_PROTOCOL'], 'https') === FALSE ? 'http' : 'https';
$host = $_SERVER['SERVER_NAME'];
$port = $_SERVER["SERVER_PORT"];
$query = $_SERVER['REQUEST_URI'];
return $protocol.'://'.$host.($port != 80 ? ':'.$port : '').$query;
}
But your problem comes from here :
if (!isset($_GET['ignore']))
{
$url = curPageURL();
$data = implode("", file("$url?ignore=this"));
/* ... */
}
This will work with "test pages", but you CMS propably use url-rewriting, which can cause the lost of your $_GET['ignore'] variable : if you've already other GET variable for example.
You should have a look into your .htaccess files, or read your CMS documentation to know what can change you url.
Anyway, it seems you're building some unstable code, and this only to get the page title. I'm pretty sure you've got another way to get it easily with your CMS.

How to trim current filename of page from URL?

I have a method, it looks like this:
private function setURL()
{
$pageURL = 'http';
if(isset($_SERVER["HTTPS"]) && $_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"];
}
if(substr($pageURL, -4) == ".php")
{
// damn. this is harder to recover from.
$len = strlen(basename(__FILE__, '.php'));
$len = strlen($pageURL) - $len;
$pageURL = substr($pageURL, 0, $len);
}
if(substr($pageURL, -1) != "/")
{
$pageURL .= "/";
}
$this->url = $pageURL;
}
If a user doesn't enter a filename, the URL returned is as expected, http://localhost/zenbb2. If the user does, however, the URL returned is wrong in some way, no matter what permutation I try to perform. For instance, this code returns http://localhost when visiting http://localhost/zenbb2/index.php, but http://localhost/zenbb2 when visiting that URL.
Edit The contents of my .htaccess file are:
Options -indexes
RewriteEngine on
Also, I mean the current URL as in, if I were visiting http://localhost/zenbb2/index.php, it would trim the index.php from the URL so I can use it in various places in my code. Ideally, in the end, I could use it like this:
$url = 'http://localhost/zenbb2';
echo "<link rel=\"{$url}/sample.css\" />"; // http://localhost/zenbb2/sample.css
You can use dirname to achieve this:
$ php -a
> $url = 'http://localhost/zenbb2/index.php';
> echo dirname($url);
http://localhost/zenbb2
Edit:
dirname always strips the last part of the string so use care to ensure you don't strip too much off but it can be useful when traversing URL or directory paths.
A better solution is to create a php file config.php then specify constants within it, after that, include the file everytime you want to use the URL. This solution is also implemented in well-known frameworks such as Codeigniter.
This approach is better, and frankly, more stable. For example, if you have a php file in a sub-directory (/zenbb2/sub/file.php) the URL directory would be zenbb2/sub, which, obviously, isn't what you're looking for, and your static files will return 404, since they don't exist there.
Try this one
$url = $_SERVER['REQUEST_URI'];
echo basename($url);
This should give index.php from http://localhost/zenbb2/index.php

ampersand not passing in a string variable via url

I am trying to pass a big url as a string to another php page and fetch it there via $_REQUEST[]
but it's not working.
Here is the code (JavaScript) from first page:
var url="index.php?module=Contacts&return_module=Campaigns&action=UD_DetailView&popuptype=detailview&select=enable&form=EditView&form_submit=false";
var intermediate_url="choose_template.php?variable_url="+url;
window.location=intermediate_url;
The code on other page is:
<?php
echo "url = ".$_REQUEST['variable_url'];
?>
The echo I get on page choose_template.php is this :
url = index.php?module=Contacts
I don't understand. Why does it break at the occurance of first & ?
What should I do to bypass it ?
Try using in js:
url = encodeURIComponent(url);
Than in php:
echo "url = ". urldecode($_REQUEST['variable_url']);
When manipulating url, you should use urlencode and urldecode functions
http://php.net/manual/en/function.urlencode.php
http://php.net/manual/en/function.urldecode.php
In javascript:
url = encodeURIComponent(url)
Try using urlencode():
var url="<?php echo urlencode('index.php?module=Contacts&return_module=Campaigns&action=UD_DetailView&popuptype=detailview&select=enable&form=EditView&form_submit=false')?>";
var intermediate_url="choose_template.php??variable_url="+url;
window.location=intermediate_url;
If i understand correctly you what to echo out the full name of the current page: Use this to get it:
function curpage() {
$pu = 'http';
if ($_SERVER["HTTPS"] == "on") {$pu .= "s";}
$pu .= "://";
if ($_SERVER["SERVER_PORT"] != "80") {
$pu .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
} else {$pu .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];}
return $pu;
}
<?php echo "url = ".curpage(); ?>
This will alway work fine!

Display current URL of webpage (dynamic) in HTML

I have this code in my HTML:
<h3 id="left">Lorem Ipsum </h3>
<h3 id="right">[Current URL Here]</h3>
I want to display (dynamicly) the current URL inside the <h3> tags. I've been trying to figure it out for a few days, but I'm really a mobile developer, not an HTML developer, so it's proven difficult. I need this for an app I'm working on, so Please go easy on me :)
Thanks in advance.
document.getElementById('right').innerHTML = window.location.href;
If you wanted to do it in PHP, it's a little more involved:
$url = !empty($_SERVER['HTTPS']) ? 'https://' : 'http://';
$url .= $_SERVER['HTTP_HOST'] . htmlspecialchars($_SERVER['REQUEST_URI']);
As aronasterling points out, you need to sanitize $_SERVER['REQUEST_URI'] to prevent XSS.
Well, you simply cannot do it in pure HTML.
With javascript, you can go with
<h3 id="right">
<script type="text/javascript">
document.write(location.href);
</script>
</h3>
Otherwise, if you are requesting a page on the server, you should rather have it done in there.
the php code for getting complete url of current page is as follows
<?php
$protocol = $_SERVER['HTTPS'] == 'on' ? 'https' : 'http';
echo $protocol.'://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
?>
Reference
if you want to use javascript use the method suggested by #MooGoo
full usage of that script is as follows
<SCRIPT LANGUAGE="JavaScript">
document.getElementById('right').innerHTML = window.location.href;
</SCRIPT>
use this after you declared/defined <h3 id="right">[Current URL Here]</h3>
Hope helpful
<script type="text/javascript">
var segments = window.location.pathname.split('/');
var toDelete = [];
for (var i = 0; i < segments.length; i++) {
if (segments[i].length < 1) {
toDelete.push(i);
}
}
for (var i = 0; i < toDelete.length; i++) {
segments.splice(i, 1);
}
var filename = segments[segments.length - 1];
console.log(filename);
document.write(filename);
</script>
While the JavaScript are what is more common, you could also use Server-Side Includes:
<h3 id="right">
<!--#echo var="SERVER_NAME" -->/<!--#echo var="DOCUMENT_URI" -->
</h3>
instead of SERVER_NAME you can try HTTP_HOST
instead of DOCUMENT_URI you can try REQUEST_URI; one includes the query string, the other doesn't
Php Code:
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;
}
<h3 id="right">echo curPageURL();</h3>

Categories