Je ziet dit bericht omdat de EU dat een goed idee vindt. Deze website maakt gebruik van cookies van Google voor het tonen van advertenties en het bijhouden van bezoekersstatistieken. Google kan hiermee je surfgedrag volgen. Zie voor meer informatie het privacybeleid van Google. Via Your Online Choices kun tracking cookies van advertentiebedrijven blokkeren. Deze melding verbergen.

16 Server-variabelen

PHP heeft een ingebouwde variabele met daarin allerlei informatie over die vanuit de webserver beschikbaar is. De server-variabelen bevatten informatie die soms handig kan zijn, zo kunnen de URL van de pagina en het IP-adres van de bezoeker achterhaald worden.

Theorie

De server-variabelen zijn opgeslagen in de array $_SERVER en zijn overal in een script beschikbaar. Via phpinfo() (zie hoofstuk 1) kan een beeld worden gekregen van de informatie die zoal beschikbaar is; deze wordt bijna onderaan vermeld onder het kopje PHP Variables. In onderstaande tabel worden de meest gebruikte server-variabelen vermeld. Zie de PHP handleiding voor een compleet overzicht.

Tabel 16.1: Server-variabelen
Variabele Omschrijving Voorbeeld
$_SERVER['SERVER_NAME'] De domeinnaam van de webserver. www.phpboek.net
$_SERVER['SCRIPT_NAME'] Het relatieve pad van het uitvoerende script. /phpboek-16-server-variabelen.php
$_SERVER['QUERY_STRING'] De query-string (het gedeelte achter het vraagteken in een URL).
$_SERVER['REQUEST_URI'] De URI die gebruikt is om het script op te vragen, zonder domeinnaam, met query string. /phpboek-16-server-variabelen.php
$_SERVER['REQUEST_METHOD'] De manier waarop het script is aangevraagd: GET, POST, HEAD of PUT. GET
$_SERVER['DOCUMENT_ROOT'] De wortelmap van de server. /var/www/html
$_SERVER['SCRIPT_FILENAME'] Het volledige pad van het uitgevoerde script. /var/www/html/phpboek-16-server-variabelen.php
$_SERVER['HTTP_REFERER'] De pagina waar de bezoeker vandaan komt. Deze informatie wordt doorgegeven door de browser en is niet altijd (correct) ingevuld.
$_SERVER['HTTP_USER_AGENT'] Informatie over de webbrowser van de bezoeker. CCBot/2.0 (http://commoncrawl.org/faq/)
$_SERVER['REMOTE_ADDR'] Het IP-adres van de bezoeker. 54.163.209.109
$_SERVER['REMOTE_USER'] De gebruikersnaam van de bezoeker wanneer is ingelogd via HTTP Basic Authentication (.htaccess/.htpasswd).

Praktijkvoorbeeld: Header-redirect

Middels de Location-header kan de browser worden doorgestuurd naar een andere pagina. Dit kan soms praktisch zijn als na het verwerken van een verzonden formulier een andere pagina moet worden geopend dan het verwerkende script. Hiervoor wordt de functie header() gebruikt:

void header ( string $string [, bool $replace = true [, int $http_response_code ]] )

Belangrijk is dat een header moet worden ingesteld voordat enige output naar de browser wordt gestuurd. Anders zal deze, net zoals bij cookies, niet werken. In PHP-code ziet de location-header er als volgt uit:

<?php
header
('Location:http://example.com/map/pagina.php');
?>

De specificatie schrijft voor dat een volledige URL moet worden gebruikt. Alleen is het onhandig om hardcoded in het script te zetten, want dat geeft onherroepelijk problemen bij het lokaal testen of verplaatsen van het script naar een andere server. Gelukkig kunnen we de server-variabelen gebruiken om het gedeelte example.com/map/ van de URL dynamisch te maken. Alleen is het jammer dat er geen server-variabele is die precies dit bevat, dus dat zullen we zelf moeten samenstellen uit $_SERVER['SERVER_NAME'] en $_SERVER['SCRIPT_NAME']. $_SERVER['SERVER_NAME'] kunnen we volledig gebruiken. $_SERVER['SCRIPT_NAME'] bevat ook nog de bestandsnaam van het huidige script. Met behulp van de functie substr() kunnen we deze er af halen.

string substr ( string $string , int $start [, int $length ] )

substr() geeft het gedeelte van een $string, beginnend bij het teken opgegeven door $start en optioneel tot de gegeven maximumlengte $length. Het eerste teken heeft index 0. In dit geval willen we het eerste deel van $_SERVER['SCRIPT_NAME'] tot de laatste slash (/). We starten dus bij teken 0 en de string moet net zo lang worden als de index van de laatste slash. Alleen weten we niet waar die precies staat. Hiervoor kunnen we dan weer de functie strrpos() gebruiken.

int strrpos ( string $haystack , string $needle [, int $offset = 0 ] )

strrpos() geeft de index van het laatste voorkomen van $needle in $haystack. We willen de positie van de laatste slash in $_SERVER['SCRIPT_NAME'] weten, dus dat kan als volgt:

<?php
$length
= strrpos($_SERVER['SCRIPT_NAME'], '/');
?>

Deze informatie gebruiken we weer in substr() om het gedeelte van teken 0 tot de laatste slash te krijgen:

<?php
$length
= strrpos($_SERVER['SCRIPT_NAME'], '/');
$pad = substr($_SERVER['SCRIPT_NAME'], 0, $length);
?>

Nu hebben we genoeg om de header dynamisch te maken, rest nog alle losse onderdelen aan elkaar te plakken:

<?php
//bepaal lengte van pad
$length = strrpos($_SERVER['SCRIPT_NAME'], '/');
//bepaal pad
$pad = substr($_SERVER['SCRIPT_NAME'], 0, $length);
//location-header
header('Location:http://' . $_SERVER['SERVER_NAME'] . $pad . '/pagina.php');
?>

Eventueel is dit nog korte te schrijven door geen gebruik te maken van hulpvariabelen:

<?php
header('Location:http://' . $_SERVER['SERVER_NAME'] . substr($_SERVER['SCRIPT_NAME'], 0, strrpos($_SERVER['SCRIPT_NAME'], '/')) . '/pagina.php');
?>

Zelftest

  1. Welke server-variabele geeft de domeinnaam van de webserver?
    1. $_SERVER['SERVER_NAME']
    2. $_SERVER['SCRIPT_NAME']
    3. $_SERVER['REQUEST_URI']
    4. $_SERVER['REMOTE_ADDR']
  2. Welke server-variabele geeft het IP-adres van de bezoeker?
    1. $_SERVER['HTTP_REFERER']
    2. $_SERVER['HTTP_USER_AGENT']
    3. $_SERVER['REMOTE_ADDR']
    4. $_SERVER['REMOTE_USER']
  3. Welke van onderstaande stellingen is/zijn waar?
    I             $_SERVER['HTTP_REFERER'] is altijd betrouwbaar;
    II            header() moet worden gebruikt voor enige andere output naar de browser.
    1. Beide stellingen zijn onwaar.
    2. Alleen stelling I is waar.
    3. Alleen stelling II is waar.
    4. Beide stellingen zijn waar.
  4. In substr(), wat is de index van het eerste teken van de string?
    1. -1
    2. 0
    3. 1
    4. Afhankelijk van de lengte van de string
  5. In strrpos(), wat is de index van het eerste teken van de string?
    1. -1
    2. 0
    3. 1
    4. Afhankelijk van de lengte van de string

Antwoorden zelftest

Antwoorden

  1. a
  2. c
  3. c
  4. b
  5. b