IMPORTANT: Per accedir als fitxer de subversion: http://acacha.org/svn (sense password). Poc a poc s'aniran migrant els enllaços. Encara però funciona el subversion de la farga però no se sap fins quan... (usuari: prova i la paraula de pas 123456)

Introducció

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 màquina on és el recurs a què fa referència.
  • El protocol que s'ha d'utilitzar per obtenir aquest recurs.
  • La manera com el servidor web (o un altre) trobarà quin és el recurs.

La sintaxi que s'utilitza és:

protocol://[usuari:contrasenya@]host[:port]/[camí][?query_string[#fragment_id]]

O en anglès:

scheme://[usuari:contrasenya@]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:

  • http: Protocol d'accés al World Wide Web.
  • ftp: Protocol de transmissió de fitxers.
  • file: Protocol d'accés i localització d'arxius dins de sistemes de fitxers.
  • mailto: Etiqueta per afegir una adreça de correu electrònic.
  • news: Protocol d'intercanvi de llistes de notícies.
  • gopher: Protocol per a l'organització jeràrquica de llistes de fitxers.
  • telnet: Protocol que serveix per accedir remotament a una altra màquina, i controlar-la com si s'estigués al davant.

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)

PHP

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:password@hostname: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));
?>

URL query

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, '', '&');

?>

Sobre els fragments

https://blog.httpwatch.com/2011/03/01/6-things-you-should-know-about-fragment-urls/

Els Fragments no s'envien als missatges HTTP Request

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:password@hostname: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é:

  • El protocol és implicit (és HTTP)
  • El SERVER_NAME/IP o PORT no són informació que trobeu al protocol HTTP sinó en tot cas a les capes anteriors TCP/UDP (port) i IP (adreça IP)
  • El FRAGMENT no forma part del protocol HTTP i no el trobareu enlloc. De fet els fragment només s'utilitzen als navegadors i només són informació útil per a HTML no HTTP!

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:password@localhost: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:password@localhost: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);

Laravel

Vegeu els helpers relacionats amb URLs:

https://laravel.com/docs/5.3/helpers#available-methods

Javascript

Javascript i URLs FormData object

Custom URL Schemes

Vegeu Custom URL Schemes

Vegeu també

Enllaços externs