Proccess path_info
<?php
function get_path_info()
{
if( ! array_key_exists('PATH_INFO', $_SERVER) )
{
$pos = strpos($_SERVER['REQUEST_URI'], $_SERVER['QUERY_STRING']);
$asd = substr($_SERVER['REQUEST_URI'], 0, $pos - 2);
$asd = substr($asd, strlen($_SERVER['SCRIPT_NAME']) + 1);
return $asd;
}
else
{
return trim($_SERVER['PATH_INFO'], '/');
}
}
$_SERVER
$HTTP_SERVER_VARS [kullanımdan kalktı]
$_SERVER -- $HTTP_SERVER_VARS [kullanımdan kalktı] — Sunucu ve işletme ortamı bilgisi
Açıklama
$_SERVER başlıklar, yollar ve betiklerin yerleri gibi bilgileri içeren bir dizidir. Bu dizideki girdiler HTTP sunucusu tarafından oluşturulur. Her HTTP sunucusu bunları sunacak diye bir garanti yoktur; sunucular bazıları ile işlem yapmayabilir veya burada listelenmeyen başkalarını sağlayabilirler. Bu değişkenlerden çoğu » CGI 1.1 Belirtimi içinde ele alınırlar; yani bunlar genellikle her HTTP sunucusunda desteklenirler.
$HTTP_SERVER_VARS aynı başlangıç bilgisini içerir, fakat bir süper küresel değildir ($HTTP_SERVER_VARS ve $_SERVER farklı değişkenlerdir ve PHP de bu şekilde ele alır).
İndisler
Aşağıdaki elemanlardan bazılarını $_SERVER içinde belki bulursunuz belki de bulamazsınız. PHP komut satırında çalıştırıldığında bu değişkenlerden bazılarının herhangi bir anlamı varsa komut satırında da kullanılabileceğine dikkat ediniz.
- 'PHP_SELF'
- Çalıştırılmakta olan betiğin, belge kök dizinine göreli dosya adıdır. Örneğin, http://mesela.dom/dnm.php/foo.bar adresindeki bir betik için $_SERVER['PHP_SELF'] değeri /dnm.php/foo.bar olacaktır. __FILE__ sabiti geçerli dosyanın tam yolunu ve dosya adını içerir. PHP 4.3.0 dan beri, eğer PHP komut satırı işlemcisi olarak çalışıyorsa bu değişken betik adını içerir. Önceki sürümlerde bu mevcut değildi.
- 'argv'
- Betiğe aktarılan değiştirge dizisidir. Betik komut satırında çalıştığında, komut satırı değiştirgelerine C gibi erişim imkanı verir. Betik GET yöntemi üzerinden çağrıldığında, bu değişken sorgu dizgesini içerir.
- 'argc'
- Betiğe aktarılan komut satırı değiştirgelerinin sayısını içerir (betik eğer komut satırından çalıştırılıyorsa).
- 'GATEWAY_INTERFACE'
- Sunucunun desteklediği CGI belirtiminin sürümünü içerir; 'CGI/1.1' gibi.
- 'SERVER_ADDR'
- Geçerli betiğin altında çalıştığı sunucunun IP adresidir.
- 'SERVER_NAME'
- Geçerli betiğin altında çalıştığı sunucunun adıdır. Eğer betik bir sanal konak üzerinde çalışıyorsa, o sanal konağın adını içerir.
- 'SERVER_SOFTWARE'
- Sunucu kimlik dizgesi, isteklere verilen cevap başlıklarının içinde verilir.
- 'SERVER_PROTOCOL'
- Sayfa isteğinin yapıldığı protokolün ismi ve sürümüdür; 'HTTP/1.1' gibi;
- 'REQUEST_METHOD'
-
Sayfaya erişim için kullanılan istek yöntemi; 'GET',
'HEAD', 'POST',
'PUT' gibi.
Bilginize:
Eğer istek yöntemi HEAD ise PHP betiği başlıklar gönderildikten sonra (çıktının çıktı tamponu olmadan üretilmesinden sonra anlamında) sonlandırılır.
- 'REQUEST_TIME'
- İsteğin başlangıç zaman etiketidir. PHP 5.1.0'dan beri mevcuttur.
- 'QUERY_STRING'
- Sorgu dizgesi, sayfaya erişirken kullanılabilir.
- 'DOCUMENT_ROOT'
- Sunucunun ayar dosyasında da tanımlandığı gibi, geçerli betiğin altında çalıştığı belge kök dizinidir.
- 'HTTP_ACCEPT'
- Geçerli isteğin Accept: başlığının içeriğidir.
- 'HTTP_ACCEPT_CHARSET'
- Geçerli isteğin Accept-Charset: başlığının içeriğidir. Örnek: 'iso-8859-9,*,utf-8'.
- 'HTTP_ACCEPT_ENCODING'
- Geçerli isteğin Accept-Encoding: başlığının içeriğidir. Örnek: 'gzip'.
- 'HTTP_ACCEPT_LANGUAGE'
- Geçerli isteğin Accept-Language: başlığının içeriğidir. Örnek: 'tr'.
- 'HTTP_CONNECTION'
- Geçerli isteğin Connection: başlığının içeriğidir. Örnek: 'Keep-Alive'.
- 'HTTP_HOST'
- Geçerli isteğin Host: başlığının içeriğidir.
- 'HTTP_REFERER'
- Kullanıcı tarayıcısını geçerli sayfaya gönderen sayfanın (varsa) adresidir. Bu kullanıcı tarayıcısı tarafından belirtilir. Her kullanıcı tarayıcısı bunu belirtmez ve bazıları HTTP_REFERER değiştirmeyi bir özellik olarak sunar. Kısaca, buna güvenilemez.
- 'HTTP_USER_AGENT'
- Geçerli isteğin User-Agent: başlığının içeriğidir. Bu sayfaya erişen kullanıcı tarayıcısını ifade eden bir dizgedir. Örneğin: Mozilla/4.5 [en] (X11; U; Linux 2.2.9 i586) get_browser() işlevi ile elde edebileceğiniz bu değeri sayfanın çıktısını kullanıcının tarayıcısına göre şekillendirmek için kullanabilirsiniz.
- 'HTTPS'
-
Eğer betik HTTPS protokolü ile sorgulanmışsa boş olmayan bir değer
atanır.
Bilginize: IIS ile ISAPI kullanırken, eğer istek HTTPS protokolü ile yapılmamışsa, bu değerin off olacağına dikkat ediniz.
- 'REMOTE_ADDR'
- Geçerli sayfayı görüntüleyen kullanıcının IP adresidir.
- 'REMOTE_HOST'
-
Geçerli sayfayı görüntüleyen kullanıcının sunucu adıdır.
Kullanıcının REMOTE_ADDR değerinden
ters dns sorgusuyla elde edilir.
Bilginize: HTTP sunucunuz bu değişkeni oluşturmak için ayarlanmak zorundadır. Örneğin Apache'de httpd.conf içinde HostnameLookups On olmalıdır. Ayrıca gethostbyaddr() işlevine de bakınız.
- 'REMOTE_PORT'
- Kullanıcının makinesinin HTTP sunucusu ile haberleşmek için kullandığı porttur.
- 'SCRIPT_FILENAME'
-
Geçerli betiğin mutlak yoludur.
Bilginize:
Eğer betik file.php veya ../file.php gibi göreli bir yolla komut satırından çalıştırılırsa, $_SERVER['SCRIPT_FILENAME'] kullanıcı tarafından belirtilen göreli yolu içerir.
- 'SERVER_ADMIN'
- HTTP sunucusu ayar dosyasındaki SERVER_ADMIN (Apache için) yönergesine verilen değerdir. Eğer betik bir sanal konak üzerinde çalışıyorsa, o sanal konak için için tanımlanmış değer olur.
- 'SERVER_PORT'
- Haberleşme için HTTP sunucusu tarafından kullanılan porttur. Öntanımlı kurulumlar için değeri '80'dir; örneğin SSL kullanımında bunu güvenli HTTP portu olarak ne tanımladıysanız ona değiştirebilirsiniz.
- 'SERVER_SIGNATURE'
- Eğer etkinse, sunucu tarafından üretilen sayfalara eklenen, sunucu sürümünü ve sanal konak adını içeren dizgidir.
- 'PATH_TRANSLATED'
-
Sunucu gerekli sanaldan gerçeğe dönüşümleri yaptıktan sonra geçerli
betiğin dosya sistemini (belge kökü değil) temel alan yoludur.
Bilginize: PHP 4.3.2'den itibaren PATH_TRANSLATED değeri Apache 2'de Apache 1'in tersine SAPI altında örtük olarak belirtilmez. Apache 1'de bu değer Apache tarafından yerleştirilmediğinde bu değer SCRIPT_FILENAME sunucu değişkeni ile aynı olurdu. Bu değişiklik, PATH_TRANSLATED değişkeninin sadece PATH_INFO değişkeninin tanımlı olması durumunda var olmasını gerektiren CGI belirtimi ile uyum sağlamak için yapılmıştır. Apache 2 kullanıcıları PATH_INFO tanımlatmak için httpd.conf içinde AcceptPathInfo = On yapılandırmasını kullanabilirler.
- 'SCRIPT_NAME'
- Geçerli betiğin yolunu içerir. Kendi kendilerini göstermesi gereken sayfalar için kullanışlıdırlar. __FILE__ sabiti geçerli (örn. içerilen) dosyanın tam yolunu vedosya adını içerir.
- 'REQUEST_URI'
- Sayfaya erişim için belirtilen URI; örneğin, '/index.html'.
- 'PHP_AUTH_DIGEST'
- Apache altında bir modül olarak Özetli HTTP kimlik doğrulaması yapılırken bu değişken istemci tarafından gönderilen 'Authorization' başlığında belirtilir (böylece siz de uygun geçerlilik denetimini yapmak için bunu kullanabilirsiniz).
- 'PHP_AUTH_USER'
- Apache veya IIS (PHP 5 üzerinde ISAPI) altında modül olarak HTTP kimlik doğrulaması yapılırken bu değişkene kullanıcı tarafından sağlanan kullanıcı adı atanır.
- 'PHP_AUTH_PW'
- Apache veya IIS (PHP 5 üzerinde ISAPI) altında modül olarak HTTP kimlik doğrulaması yapılırken bu değişkene kullanıcı tarafından sağlanan parola atanır.
- 'AUTH_TYPE'
- Apache altında modül olarak HTTP kimlik doğrulaması yapılırken bu değişkene kullanılan kimlik doğrulama türü atanır.
- 'PATH_INFO'
- İstemci tarafından sağlanan dosya yolunu içerir; dosya isminin ardında bir sorgu dizgesi olsa bile bu gösterilmez. Örneğin, betiğe şu URL ile erişiliyor olsun: http://www.example.com/php/path_info.php/some/stuff?foo=bar. Bu durumda $_SERVER['PATH_INFO'], /some/stuff değerini içerecektir.
- 'ORIG_PATH_INFO'
- PHP tarafından işlenmeden önceki özgün 'PATH_INFO'.
Sürüm Bilgisi
| Sürüm: | Açıklama |
|---|---|
| 4.1.0 | $_SERVER ortaya çıkmış ve $HTTP_SERVER_VARS kullanımdan kaldırılmıştır. |
Örnekler
Örnek 1 - $_SERVER örneği
<?php
echo $_SERVER['SERVER_NAME'];
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
www.example.com
Notlar
Bilginize:
Bu bir süper küreseldir. Yani bir betiğin her yerinde geçerlidir. Değişkene işlevler ve yöntemlerin içinden erişmek için global $değişken; deyimine gerek yoktur.
For an hosting that use windows I have used this script to make REQUEST_URI to be correctly setted on IIS
<?php
function request_URI() {
if(!isset($_SERVER['REQUEST_URI'])) {
$_SERVER['REQUEST_URI'] = $_SERVER['SCRIPT_NAME'];
if($_SERVER['QUERY_STRING']) {
$_SERVER['REQUEST_URI'] .= '?' . $_SERVER['QUERY_STRING'];
}
}
return $_SERVER['REQUEST_URI'];
}
$_SERVER['REQUEST_URI'] = request_URI();
?>
$_SERVER['SERVER_ADDR'] contains my LAN IP rather than the public IP. I used the function gethostbyname() to get my public IP rather than the router assigned local IP.
A simple function to detect if the current page address was rewritten by mod_rewrite:
<?php
public function urlWasRewritten() {
$realScriptName=$_SERVER['SCRIPT_NAME'];
$virtualScriptName=reset(explode("?", $_SERVER['REQUEST_URI']));
return !($realScriptName==$virtualScriptName);
}
?>
You have missed 'REDIRECT_STATUS'
Very useful if you point all your error pages to the same file.
File; .htaccess
# .htaccess file.
ErrorDocument 404 /error-msg.php
ErrorDocument 500 /error-msg.php
ErrorDocument 400 /error-msg.php
ErrorDocument 401 /error-msg.php
ErrorDocument 403 /error-msg.php
# End of file.
File; error-msg.php
<?php
$HttpStatus = $_SERVER["REDIRECT_STATUS"] ;
if($HttpStatus==200) {print "Document has been processed and sent to you.";}
if($HttpStatus==400) {print "Bad HTTP request ";}
if($HttpStatus==401) {print "Unauthorized - Iinvalid password";}
if($HttpStatus==403) {print "Forbidden";}
if($HttpStatus==500) {print "Internal Server Error";}
if($HttpStatus==418) {print "I'm a teapot! - This is a real value, defined in 1998";}
?>
Note that on real paths, aliases are not resolved
$_SERVER["DOCUMENT_ROOT"] => /var/services/web/mysite
$_SERVER["SCRIPT_FILENAME"] => /var/services/web/mysite/admin/products.php
(but __FILE__ => /volume1/web/mysite/admin/inc/includeFile.inc.php)
Use realpath to resolve the $_SERVER value.
Virtual paths also have some differences:
$_SERVER["SCRIPT_NAME"] => /admin/products.php (virtual path)
$_SERVER["PHP_SELF"] => /admin/products.php/someExtraStuff (virtual path)
SCRIPT_NAME is defined in the CGI 1.1 specification, PHP_SELF is created by PHP itself. See http://php.about.com/od/learnphp/qt/_SERVER_PHP.htm for tests.
$_SERVER["SCRIPT_FILENAME"] returns the path including the filename, like __DIR__
HTTPS
Set to a non-empty value if the script was queried through the HTTPS protocol.
Note: Note that when using ISAPI with IIS, the value will be off if the request was not made through the HTTPS protocol.
=-=-=
To clarify this, the value is the string "off", so a specific non-empty value rather than an empty value as in Apache.
I needed to get the full base directory of my script local to my webserver, IIS 7 on Windows 2008.
I ended up using this:
<?php
function GetBasePath() {
return substr($_SERVER['SCRIPT_FILENAME'], 0, strlen($_SERVER['SCRIPT_FILENAME']) - strlen(strrchr($_SERVER['SCRIPT_FILENAME'], "\\")));
}
?>
And it returned C:\inetpub\wwwroot\<applicationfolder> as I had hoped.
A way to get the absolute path of your page, independent from the site position (so works both on local machine and on server without setting anything) and from the server OS (works both on Unix systems and Windows systems).
The only parameter it requires is the folder in which you place this script
So, for istance, I'll place this into my SCRIPT folder, and I'll write SCRIPT word length in $conflen
<?php
$conflen=strlen('SCRIPT');
$B=substr(__FILE__,0,strrpos(__FILE__,'/'));
$A=substr($_SERVER['DOCUMENT_ROOT'], strrpos($_SERVER['DOCUMENT_ROOT'], $_SERVER['PHP_SELF']));
$C=substr($B,strlen($A));
$posconf=strlen($C)-$conflen-1;
$D=substr($C,1,$posconf);
$host='http://'.$_SERVER['SERVER_NAME'].'/'.$D;
?>
$host will finally contain the absolute path.
Use Strict-Transport-Security (STS) to force the use of SSL.
<?php
$use_sts = TRUE;
if ($use_sts && isset($_SERVER['HTTPS']) {
header('Strict-Transport-Security: max-age=500');
} elseif ($use_sts && !isset($_SERVER['HTTPS']) {
header('Status-Code: 301');
header('Location: https://'.$_SERVER["HTTP_HOST"].$_SERVER['REQUEST_URI']);
}
?>
To get an associative array of HTTP request headers formatted similarly to get_headers(), this will do the trick:
<?php
/**
* Transforms $_SERVER HTTP headers into a nice associative array. For example:
* array(
* 'Referer' => 'example.com',
* 'X-Requested-With' => 'XMLHttpRequest'
* )
*/
function get_request_headers() {
$headers = array();
foreach($_SERVER as $key => $value) {
if(strpos($key, 'HTTP_') === 0) {
$headers[str_replace(' ', '-', ucwords(str_replace('_', ' ', strtolower(substr($key, 5)))))] = $value;
}
}
return $headers;
}
?>
Don't forget $_SERVER['HTTP_COOKIE']. It contains the raw value of the 'Cookie' header sent by the user agent.
$_SERVER['DOCUMENT_ROOT'] in different environments may has trailing slash or not, so be careful when including files from $_SERVER['DOCUMENT_ROOT']:
<?php
include(dirname($_SERVER['DOCUMENT_ROOT']) . DIRECTORY_SEPARATOR . 'file.php')
?>
Use the apache SetEnv directive to set arbitrary $_SERVER variables in your vhost or apache config.
SetEnv varname "variable value"
There are two different variables that I find very useful in Caching and similar.
$_SERVER['REQUEST_URI'] and $_SERVER['REQUEST_URL']
URI provides the entire request path (/directory/file.ext?query=string)
URL provides the request path, without the query string (/directory/file.ext)
It also differs from __FILE__ in that it's not the file name. So, if you go to /directory/anotherfile.ext and get silently redirected to file.ext, these variables are anotherfile.ext, while __FILE__ is still file.ext.
It makes sense to want to paste the $_SERVER['REQUEST_URI'] on to a page (like on a footer), but be sure to clean it up first with htmlspecialchars() otherwise it poses a cross-site scripting vulnerability.
htmlspecialchars($_SERVER['REQUEST_URI']);
e.g.
http://www.example.com/foo?<script>...
becomes
http://www.example.com/foo?<script>...
I was testing with the $_SERVER variable and some request method, and I found that with apache I can put an arbitrary method.
For example, I have an script called "server.php" in my example webpage with the next code:
<?php
echo $_SERVER['REQUEST_METHOD'];
?>
And I made this request:
c:\>nc -vv www.example.com 80
example.com [x.x.x.x] 80 (http) open
ArbitratyMethod /server.php HTTP/1.1
Host: wow.sinfocol.org
Connection: Close
The response of the server is the next:
HTTP/1.1 200 OK
Date: Fri, 15 Jan 2010 05:14:09 GMT
Server: Apache
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html
ArbitratyMethod
So, be carefully when include the $_SERVER['REQUEST_METHOD'] in any script, this kind of "bug" is old and could be dangerous.
<?php
// RFC 2616 compatible Accept Language Parser
// http://www.ietf.org/rfc/rfc2616.txt, 14.4 Accept-Language, Page 104
// Hypertext Transfer Protocol -- HTTP/1.1
foreach (explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']) as $lang) {
$pattern = '/^(?P<primarytag>[a-zA-Z]{2,8})'.
'(?:-(?P<subtag>[a-zA-Z]{2,8}))?(?:(?:;q=)'.
'(?P<quantifier>\d\.\d))?$/';
$splits = array();
printf("Lang:,,%s''\n", $lang);
if (preg_match($pattern, $lang, $splits)) {
print_r($splits);
} else {
echo "\nno match\n";
}
}
?>
example output:
Google Chrome 3.0.195.27 Windows xp
Lang:,,de-DE''
Array
(
[0] => de-DE
[primarytag] => de
[1] => de
[subtag] => DE
[2] => DE
)
Lang:,,de;q=0.8''
Array
(
[0] => de;q=0.8
[primarytag] => de
[1] => de
[subtag] =>
[2] =>
[quantifier] => 0.8
[3] => 0.8
)
Lang:,,en-US;q=0.6''
Array
(
[0] => en-US;q=0.6
[primarytag] => en
[1] => en
[subtag] => US
[2] => US
[quantifier] => 0.6
[3] => 0.6
)
Lang:,,en;q=0.4''
Array
(
[0] => en;q=0.4
[primarytag] => en
[1] => en
[subtag] =>
[2] =>
[quantifier] => 0.4
[3] => 0.4
)
An even *more* improved version...
<?php
phpinfo(32);
?>
If you are serving from behind a proxy server, you will almost certainly save time by looking at what these $_SERVER variables do on your machine behind the proxy.
$_SERVER['HTTP_X_FORWARDED_FOR'] in place of $_SERVER['REMOTE_ADDR']
$_SERVER['HTTP_X_FORWARDED_HOST'] and
$_SERVER['HTTP_X_FORWARDED_SERVER'] in place of (at least in our case,) $_SERVER['SERVER_NAME']
Tech note:
$_SERVER['argc'] and $_SERVER['argv'][] has some funny behaviour,
used from linux (bash) commandline, when called like
"php ./script_name.php 0x020B"
there is everything correct, but
"./script_name.php 0x020B"
is not correct - "0" is passed instead of "0x020B" as $_SERVER['argv'][1] - see the script below.
Looks like the parameter is not passed well from bash to PHP.
(but, inspected on the level of bash, 0x020B is understood well as $1)
try this example:
------------->8------------------
cat ./script_name.php
#! /usr/bin/php
if( $_SERVER['argc'] == 2)
{
// funny... we have to do this trick to pass e.g. 0x020B from parameters
// ignore this: "PHP Notice: Undefined offset: 2 in ..."
$EID = $_SERVER['argv'][1] + $_SERVER['argv'][2] + $_SERVER['argv'][3];
}
else
{ // default
$EID = 0x0210; // PPS failure
}
$_SERVER['DOCUMENT_ROOT'] is incredibly useful especially when working in your development environment. If you're working on large projects you'll likely be including a large number of files into your pages. For example:
<?php
//Defines constants to use for "include" URLS - helps keep our paths clean
define("REGISTRY_CLASSES", $_SERVER['DOCUMENT_ROOT']."/SOAP/classes/");
define("REGISTRY_CONTROLS", $_SERVER['DOCUMENT_ROOT']."/SOAP/controls/");
define("STRING_BUILDER", REGISTRY_CLASSES. "stringbuilder.php");
define("SESSION_MANAGER", REGISTRY_CLASSES. "sessionmanager.php");
define("STANDARD_CONTROLS", REGISTRY_CONTROLS."standardcontrols.php");
?>
In development environments, you're rarely working with your root folder, especially if you're running PHP locally on your box and using DOCUMENT_ROOT is a great way to maintain URL conformity. This will save you hours of work preparing your application for deployment from your box to a production server (not to mention save you the headache of include path failures).
Not documented here is the fact that $_SERVER is populated with some pretty useful information when accessing PHP via the shell.
["_SERVER"]=>
array(24) {
["MANPATH"]=>
string(48) "/usr/share/man:/usr/local/share/man:/usr/X11/man"
["TERM"]=>
string(11) "xterm-color"
["SHELL"]=>
string(9) "/bin/bash"
["SSH_CLIENT"]=>
string(20) "127.0.0.1 41242 22"
["OLDPWD"]=>
string(60) "/Library/WebServer/Domains/www.example.com/private"
["SSH_TTY"]=>
string(12) "/dev/ttys000"
["USER"]=>
string(5) "username"
["MAIL"]=>
string(15) "/var/mail/username"
["PATH"]=>
string(57) "/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin"
["PWD"]=>
string(56) "/Library/WebServer/Domains/www.example.com/www"
["SHLVL"]=>
string(1) "1"
["HOME"]=>
string(12) "/Users/username"
["LOGNAME"]=>
string(5) "username"
["SSH_CONNECTION"]=>
string(31) "127.0.0.1 41242 10.0.0.1 22"
["_"]=>
string(12) "/usr/bin/php"
["__CF_USER_TEXT_ENCODING"]=>
string(9) "0x1F5:0:0"
["PHP_SELF"]=>
string(10) "Shell.php"
["SCRIPT_NAME"]=>
string(10) "Shell.php"
["SCRIPT_FILENAME"]=>
string(10) "Shell.php"
["PATH_TRANSLATED"]=>
string(10) "Shell.php"
["DOCUMENT_ROOT"]=>
string(0) ""
["REQUEST_TIME"]=>
int(1247162183)
["argv"]=>
array(1) {
[0]=>
string(10) "Shell.php"
}
["argc"]=>
int(1)
}
A table of everything in the $_SERVER array can be found near the bottom of the output of phpinfo();
Here's a simple, quick but effective way to block unwanted external visitors to your local server:
<?php
// only local requests
if ($_SERVER['REMOTE_ADDR'] !== '127.0.0.1') die(header("Location: /"));
?>
This will direct all external traffic to your home page. Of course you could send a 404 or other custom error. Best practice is not to stay on the page with a custom error message as you acknowledge that the page does exist. That's why I redirect unwanted calls to (for example) phpmyadmin.
I've updated the function of my previous poster and putted it into my class.
<?php
/**
* Checking HTTP-Header for language
* needed for various system classes
*
* @return boolean true/false
*/
private function _checkClientLanguage()
{
$langcode = (!empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])) ? $_SERVER['HTTP_ACCEPT_LANGUAGE'] : '';
$langcode = (!empty($langcode)) ? explode(";", $langcode) : $langcode;
$langcode = (!empty($langcode['0'])) ? explode(",", $langcode['0']) : $langcode;
$langcode = (!empty($langcode['0'])) ? explode("-", $langcode['0']) : $langcode;
return $langcode['0'];
}
?>
Please note, you have to check additional the result! Because the header may be missing or another possible thing, it is malformed. So check the result with a list with languages you support and perhaps you have to load a default language.
<?php
// if result isn't one of my defined languages
if(!in_array($lang, $language_list)) {
$lang = $language_default; // load default
?>
My HTTP_ACCEPT_LANGUAGE string:
FF3: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
IE7: de-ch
So, take care of it!
If you want en, sv-SE, da, es etc. to be returned from $_SERVER['HTTP_ACCEPT_LANGUAGE'] you can use this function:
<?php
function detectlanguage() {
$langcode = explode(";", $_SERVER['HTTP_ACCEPT_LANGUAGE']);
$langcode = explode(",", $langcode['0']);
return $langcode['0'];
}
$language = detectlanguage();
echo "You have chosen $language as your language in your web browser.";
?>
1. All elements of the $_SERVER array whose keys begin with 'HTTP_' come from HTTP request headers and are not to be trusted.
2. All HTTP headers sent to the script are made available through the $_SERVER array, with names prefixed by 'HTTP_'.
3. $_SERVER['PHP_SELF'] is dangerous if misused. If login.php/nearly_arbitrary_string is requested, $_SERVER['PHP_SELF'] will contain not just login.php, but the entire login.php/nearly_arbitrary_string. If you've printed $_SERVER['PHP_SELF'] as the value of the action attribute of your form tag without performing HTML encoding, an attacker can perform XSS attacks by offering users a link to your site such as this:
<a href='http://www.example.com/login.php/"><script type="text/javascript">...</script><span a="'>Example.com</a>
The javascript block would define an event handler function and bind it to the form's submit event. This event handler would load via an <img> tag an external file, with the submitted username and password as parameters.
Use $_SERVER['SCRIPT_NAME'] instead of $_SERVER['PHP_SELF']. HTML encode every string sent to the browser that should not be interpreted as HTML, unless you are absolutely certain that it cannot contain anything that the browser can interpret as HTML.
On Windows IIS 7 you must use $_SERVER['LOCAL_ADDR'] rather than $_SERVER['SERVER_ADDR'] to get the server's IP address.
It's worth noting that $_SERVER variables get created for any HTTP request headers, including those you might invent:
If the browser sends an HTTP request header of:
X-Debug-Custom: some string
Then:
<?php
$_SERVER['HTTP_X_DEBUG_CUSTOM']; // "some string"
?>
There are better ways to identify the HTTP request headers sent by the browser, but this is convenient if you know what to expect from, for example, an AJAX script with custom headers.
Works in PHP5 on Apache with mod_php. Don't know if this is true from other environments.
Windows running IIS v6 does not include $_SERVER['SERVER_ADDR']
If you need to get the IP addresse, use this instead:
<?php
$ipAddress = gethostbyname($_SERVER['SERVER_NAME']);
?>
If you are looking at $_SERVER['HTTP_USER_AGENT'] to determine whether your user is on a mobile device, you may want to visit these resources:
http://wurfl.sourceforge.net/
http://www.zytrax.com/tech/web/mobile_ids.html
Maybe you're missing information on $_SERVER['CONTENT_TYPE'] or $_SERVER['CONTENT_LENGTH'] as I did. On POST-requests these are available in addition to those listed above.
'HTTPS'
Set to a non-empty value if the script was queried through the HTTPS protocol. Note that when using ISAPI with IIS, the value will be off if the request was not made through the HTTPS protocol.
Does the same for IIS7 running PHP as a Fast-CGI application.
When using the $_SERVER['SERVER_NAME'] variable in an apache virtual host setup with a ServerAlias directive, be sure to check the UseCanonicalName apache directive. If it is On, this variable will always have the apache ServerName value. If it is Off, it will have the value given by the headers sent by the browser.
Depending on what you want to do the content of this variable, put in On or Off.
Please note on Windows/IIS - the variable 'USER_AUTH' will return the username/identity of the user accessing the page, i.e. if anonymous access is off, you would normally get back "$domain\$username".
Note that, in Apache 2, the server settings will affect the variables available in $_SERVER. For example, if you are using SSL, the following directive will dump SSL-related status information, along with the server certificate and client certificate (if present) into the $_SERVER variables:
SSLOptions +StdEnvVars +ExportCertData
I think the HTTPS element will only be present under Apache 2.x. It's not in the list of "special" variables here:
http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html#RewriteCond
But it is here:
http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritecond
It is worth noting here that if you use $_SERVER['REQUEST_URI'] with a rewrite rule, the original, not rewritten URI will be presented.
REQUEST_URI is useful, but if you want to get just the file name use:
<?php
$this_page = basename($_SERVER['REQUEST_URI']);
if (strpos($this_page, "?") !== false) $this_page = reset(explode("?", $this_page));
?>
