URL són les sigles de Uniform Resource Locator o «localitzador uniforme de recursos»
Les URL són molt utilitzades pel protocol HTTP i el seu ús més famós és el que es fa durant la navegació per Internet ( WWW) amb navegadors web com Firefox.
L'URL (de l'anglès, Uniform Resource Locator, «localitzador uniforme de recursos») és una cadena de caràcters que informa al navegador de:
La sintaxi que s'utilitza és:
protocol://[usuari:[email protected]]host[:port]/[camí][?query_string[#fragment_id]]
O en anglès:
scheme://[usuari:[email protected]]domain:port/path?query_string#fragment_id
On el que s'indica entre "[" és opcional.
Els protocols que entenen la majoria de navegadors són:
El host identifica la màquina on està el recurs. Pot ser un nom simbòlic o DNS (www.wikipedia.org) o una adreça IP (192.12.34.11). El port és el número de port TCP del servidor, on es connectarà el navegador.
Exemples comuns d'utilització són:
http://www.wikipedia.org ftp://ftp.debian.org
Tot i així cal indicar que les URL tenen molta més funcionalitat que la de la navegació web i es poden utilitzar amb objectiu similar en altres aplicacions i/o protocols. Per exemple el navegador de fitxers Nautilus de Gnome pot obrir un fitxer local utilitzant URLs:
$ nautilus file:///home/sergi
Les URL són un subconjunt de les URI (Uniform Resource Identificator) ja que una URL compleix tant la funció d'indicar la localització d'un recurs (URL) com la funció d'identificar un recurs (URI)
La llista completa de funcions relacionades amb URLs a PHP la podeu trobar a:
http://php.net/manual/es/ref.url.php
Veiem alguns exemples:
$uri = urldecode( parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH) );
Exemple on es veuen les parts d'una URL amb parse_url:
<?php $url = 'http://username:[email protected]:9090/path?arg=value#anchor'; var_dump(parse_url($url)); var_dump(parse_url($url, PHP_URL_SCHEME)); var_dump(parse_url($url, PHP_URL_USER)); var_dump(parse_url($url, PHP_URL_PASS)); var_dump(parse_url($url, PHP_URL_HOST)); var_dump(parse_url($url, PHP_URL_PORT)); var_dump(parse_url($url, PHP_URL_PATH)); var_dump(parse_url($url, PHP_URL_QUERY)); var_dump(parse_url($url, PHP_URL_FRAGMENT)); ?>
Tenim una funció per construir querys URL anomenada http_build_query :
<?php $data = array('foo'=>'bar', 'baz'=>'boom', 'cow'=>'milk', 'php'=>'hypertext processor'); echo http_build_query($data) . "\n"; echo http_build_query($data, '', '&'); ?>
https://blog.httpwatch.com/2011/03/01/6-things-you-should-know-about-fragment-urls/
Es pot comprovar per exemple amb Chrome Developer Tools demaneu qualsevol URL amb un FRAGMENT:
http://www.google.com/#FRAGMENT
Si inspeccioneu a la pestanya Network la petició HTTP Request de tipus GET no trobareu el fragment enlloc. És a dir els fragments serveixen per als navegadors no pas per als servidors. En Javascript podem utilitzar window.location.hash:
if(window.location.hash) { // Fragment exists } else { // Fragment doesn't exist }
Per comprovar si hem entès bé les implicacions observeu que a:
http://php.net/manual/en/function.parse-url.php
Si vegeu l'exemple:
<?php $url = 'http://username:[email protected]:9090/path?arg=value#anchor'; var_dump(parse_url($url)); var_dump(parse_url($url, PHP_URL_SCHEME)); var_dump(parse_url($url, PHP_URL_USER)); var_dump(parse_url($url, PHP_URL_PASS)); var_dump(parse_url($url, PHP_URL_HOST)); var_dump(parse_url($url, PHP_URL_PORT)); var_dump(parse_url($url, PHP_URL_PATH)); var_dump(parse_url($url, PHP_URL_QUERY)); var_dump(parse_url($url, PHP_URL_FRAGMENT)); ?>
Sembla que ens digui que podem obtenir el Fragment d'una URl però a l'exemple observeu que la URL és un String a on si hem posat el fragment. El que estem dient és que mai trobareu un fragment si la URL s'obté d'una petició HTTP Request. De fet és important entendre com s'obté la URL al servidor (de fet seria més correcta dir com s'obté la URI) ja que la URL té les següents parts:
PROTOCOL://[SERVER_NAME/IP]:PORT+URI (amb / inclòs) + FRAGMENT
En el cas de HTTP observeu qué:
Vegem alguns exemples:
Com obtenim la URL de petició amb codi PHP? Observareu que no hi ha cap mètode el més habitual és utilitzar la variable superglobal $_SERVER per obtenir les parts:
URI: $_SERVER['REQUEST_URI']
El següent codi (fitxer fragments.php):
<?php var_dump($_SERVER); var_dump($_REQUEST); var_dump($_GET); var_dump($_POST); var_dump($_FILES);
i executeu el codi:
$ php -S localhost:8000
Si crideu una URL amb totes les parts d'una URL:
http://username:[email protected]:8000/fragments.php?arg=value#anchor
A la sortida no trobareu cap informació sobre els fragments (no s'han enviat) i en canvi si apareix user i password a les variables PHP_AUTH_USER i PHP_AUTH_PW:
/home/sergi/Code/fragments/fragments.php:3: array (size=23) 'DOCUMENT_ROOT' => string '/home/sergi/Code/fragments' (length=26) 'REMOTE_ADDR' => string '127.0.0.1' (length=9) 'REMOTE_PORT' => string '44480' (length=5) 'SERVER_SOFTWARE' => string 'PHP 7.0.9-1+deb.sury.org~wily+1 Development Server' (length=50) 'SERVER_PROTOCOL' => string 'HTTP/1.1' (length=8) 'SERVER_NAME' => string 'localhost' (length=9) 'SERVER_PORT' => string '8000' (length=4) 'REQUEST_URI' => string '/fragments.php?arg=value' (length=24) 'REQUEST_METHOD' => string 'GET' (length=3) 'SCRIPT_NAME' => string '/fragments.php' (length=14) 'SCRIPT_FILENAME' => string '/home/sergi/Code/fragments/fragments.php' (length=40) 'PHP_SELF' => string '/fragments.php' (length=14) 'QUERY_STRING' => string 'arg=value' (length=9) 'HTTP_HOST' => string 'localhost:8000' (length=14) 'HTTP_CONNECTION' => string 'keep-alive' (length=10) 'HTTP_ACCEPT' => string 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' (length=74) 'HTTP_UPGRADE_INSECURE_REQUESTS' => string '1' (length=1) 'HTTP_USER_AGENT' => string 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.109 Safari/537.36' (length=105) 'HTTP_ACCEPT_ENCODING' => string 'gzip, deflate, sdch' (length=19) 'HTTP_ACCEPT_LANGUAGE' => string 'es,ca;q=0.8' (length=11) 'HTTP_COOKIE' => string '_ga=GA1.1.97498955.1454060872; __atuvc=51%7C11; __utma=111872281.97498955.1454060872.1457981702.1459871201.4; admin_auth=eyJpdiI6Ikc2dDhDaHM0OWExdVJwdm9LUjA0U2c9PSIsInZhbHVlIjoiaWFxRXVnU2VxdkRUa3d0ekpOVGNYR2FUUWhZRXA0OGk5QzVIT1NYNlkwVnRySUd2SzIrUXF3UzZiMFVURE5Hc3RJNUJxY3hEOXhLOHdQenBZWXVCd0l1OE9PQmIrQlwvZ0VldHVtXC9EbUkwcW03SSt4V1l5cG9iK2N4V3J0anFWayIsIm1hYyI6IjE4ZTk1MzViNTExNDI5ZTMzOGYxYWZkZDAxODEzMGIxNGY0MmYzZjEyNmJhNzZkYzQ0YTBhOTEzMWYyOWVmNDQifQ%3D%3D; Phpstorm-c6df7e79=0e933081-5bb4-4de1-8beb-d18bdeef282'... (length=624) 'REQUEST_TIME_FLOAT' => float 1476534270.0783 'REQUEST_TIME' => int 1476534270 /home/sergi/Code/fragments/fragments.php:5: array (size=1) 'arg' => string 'value' (length=5) /home/sergi/Code/fragments/fragments.php:7: array (size=1) 'arg' => string 'value' (length=5) /home/sergi/Code/fragments/fragments.php:9: array (size=0)
Fixeu-vos amb httpie quin és el resultat:
$ http -v http://username:[email protected]:8000/fragments.php?arg=value#anchor GET /fragments.php?arg=value HTTP/1.1 Accept: */* Accept-Encoding: gzip, deflate Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ= Connection: keep-alive Host: localhost:8000 User-Agent: HTTPie/0.9.2 HTTP/1.1 200 OK Connection: close Content-type: text/html; charset=UTF-8 Host: localhost:8000 X-Powered-By: PHP/7.0.9-1+deb.sury.org~wily+1 <small>/home/sergi/Code/fragments/fragments.php:3:</small> <b>array</b> <i>(size=23)</i> 'DOCUMENT_ROOT' <font color='#888a85'>=></font> <small>string</small> <font color='#cc0000'>'/home/sergi/Code/fragments'</font> <i>(length=26)</i> 'REMOTE_ADDR' <font color='#888a85'>=></font> <small>string</small> <font color='#cc0000'>'127.0.0.1'</font> <i>(length=9)</i> 'REMOTE_PORT' <font color='#888a85'>=></font> <small>string</small> <font color='#cc0000'>'45716'</font> <i>(length=5)</i> 'SERVER_SOFTWARE' <font color='#888a85'>=></font> <small>string</small> <font color='#cc0000'>'PHP 7.0.9-1+deb.sury.org~wily+1 Development Server'</font> <i>(length=50)</i> 'SERVER_PROTOCOL' <font color='#888a85'>=></font> <small>string</small> <font color='#cc0000'>'HTTP/1.1'</font> <i>(length=8)</i> 'SERVER_NAME' <font color='#888a85'>=></font> <small>string</small> <font color='#cc0000'>'localhost'</font> <i>(length=9)</i> 'SERVER_PORT' <font color='#888a85'>=></font> <small>string</small> <font color='#cc0000'>'8000'</font> <i>(length=4)</i> 'REQUEST_URI' <font color='#888a85'>=></font> <small>string</small> <font color='#cc0000'>'/fragments.php?arg=value'</font> <i>(length=24)</i> 'REQUEST_METHOD' <font color='#888a85'>=></font> <small>string</small> <font color='#cc0000'>'GET'</font> <i>(length=3)</i> 'SCRIPT_NAME' <font color='#888a85'>=></font> <small>string</small> <font color='#cc0000'>'/fragments.php'</font> <i>(length=14)</i> 'SCRIPT_FILENAME' <font color='#888a85'>=></font> <small>string</small> <font color='#cc0000'>'/home/sergi/Code/fragments/fragments.php'</font> <i>(length=40)</i> 'PHP_SELF' <font color='#888a85'>=></font> <small>string</small> <font color='#cc0000'>'/fragments.php'</font> <i>(length=14)</i> 'QUERY_STRING' <font color='#888a85'>=></font> <small>string</small> <font color='#cc0000'>'arg=value'</font> <i>(length=9)</i> 'HTTP_HOST' <font color='#888a85'>=></font> <small>string</small> <font color='#cc0000'>'localhost:8000'</font> <i>(length=14)</i> 'HTTP_CONNECTION' <font color='#888a85'>=></font> <small>string</small> <font color='#cc0000'>'keep-alive'</font> <i>(length=10)</i> 'HTTP_ACCEPT' <font color='#888a85'>=></font> <small>string</small> <font color='#cc0000'>'*/*'</font> <i>(length=3)</i> 'HTTP_ACCEPT_ENCODING' <font color='#888a85'>=></font> <small>string</small> <font color='#cc0000'>'gzip, deflate'</font> <i>(length=13)</i> 'HTTP_AUTHORIZATION' <font color='#888a85'>=></font> <small>string</small> <font color='#cc0000'>'Basic dXNlcm5hbWU6cGFzc3dvcmQ='</font> <i>(length=30)</i> 'HTTP_USER_AGENT' <font color='#888a85'>=></font> <small>string</small> <font color='#cc0000'>'HTTPie/0.9.2'</font> <i>(length=12)</i> 'PHP_AUTH_USER' <font color='#888a85'>=></font> <small>string</small> <font color='#cc0000'>'username'</font> <i>(length=8)</i> 'PHP_AUTH_PW' <font color='#888a85'>=></font> <small>string</small> <font color='#cc0000'>'password'</font> <i>(length=8)</i> 'REQUEST_TIME_FLOAT' <font color='#888a85'>=></font> <small>float</small> <font color='#f57900'>1476536311.349</font> 'REQUEST_TIME' <font color='#888a85'>=></font> <small>int</small> <font color='#4e9a06'>1476536311</font> <small>/home/sergi/Code/fragments/fragments.php:5:</small> <b>array</b> <i>(size=1)</i> 'arg' <font color='#888a85'>=></font> <small>string</small> <font color='#cc0000'>'value'</font> <i>(length=5)</i> <small>/home/sergi/Code/fragments/fragments.php:7:</small> <b>array</b> <i>(size=1)</i> 'arg' <font color='#888a85'>=></font> <small>string</small> <font color='#cc0000'>'value'</font> <i>(length=5)</i> <small>/home/sergi/Code/fragments/fragments.php:9:</small> <b>array</b> <i>(size=0)</i> <i><font color='#888a85'>empty</font></i> <small>/home/sergi/Code/fragments/fragments.php:11:</small> <b>array</b> <i>(size=0)</i> <i><font color='#888a85'>empty</font></i>
Observeu que l'usuari i la paraula de pas es codifiquen a la capçalera Authorization:
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
NOTA: Estan codificats en base64:
$header = "Authorization: Basic " . base64_encode($username . ':' . $password);
Vegeu els helpers relacionats amb URLs:
https://laravel.com/docs/5.3/helpers#available-methods
Javascript i URLs FormData object
Vegeu Custom URL Schemes