URL relativi nelle richieste AJAX

Perché JavaScript tratta gli URL relativi in ​​modo diverso rispetto all’HTML standard? Pensa al seguente URL (o semplicemente naviga ad esso): http://en.wikipedia.org/wiki/Rome . Apri una console Firebug (o un’altra console JavaScript) e inserisci quanto segue:

var x = new XMLHttpRequest(); x.open("GET", "foo", true); x.send("bar"); 

Sotto il mio sistema la richiesta viene inviata a ” http://it.wikipedia.org/wiki/foo “. La “Roma” nell’URL è semplicemente ignorata. La stessa richiesta con una barra finale nell’URL (” http://en.wikipedia.org/wiki/Rome/ “) aggiunge il “pippo” all’URL completo.

Questo sembra rendere piuttosto difficile codificare gli URL corretti in Javascript. Esistono librerie Javascript che aiutano a superare questo problema?

(Ho già fatto una domanda simile, ma più specifica su jQuery, dove succede anche questo. Spero di ottenere una risposta migliore con questa domanda un po ‘più indipendente dalla libreria.)

(aggiornato per renderlo più leggibile)

Questo è il modo in cui i percorsi relativi dovrebbero funzionare.

Fai finta che l’indirizzo corrente sia questo:

Absolute: protocol://some.domain.name/dir1/dir2/filename


Se si specifica solo un nuovo nome file “foo”, si ottiene lo stesso protocollo, host e dirs, viene modificato solo il nome del file:

Parente: foo

Absolute: protocol://some.domain.name/dir1/dir2/foo


Se si specifica un intero percorso “/ dir3 / filename2” si ottiene lo stesso protocollo e il nome host ma con un altro percorso:

Relativo: /dir3/filename2

Absolute: protocol://some.domain.name/dir3/filename2


Puoi anche specificare il nome host “//another.domain.name/dir5/filename3” e ottenere lo stesso protocollo ma un altro host, dir e nomefile:

Relativo: //another.domain.name/dir5/filename3

Assoluto: protocol://another.domain.name/dir5/filename3


Ciò che potrebbe creare confusione è che un server web internamente può aggiungere un / alla fine dell’URL se l’URL specificato punta a una directory e non a un file.

protocol://some.domain.name/somename

Se “somename” è una directory che il webserver potrebbe tradurre (ansible con un reindirizzamento)

protocol://some.domain.name/somename/


AGGIORNARE

Come ha detto Cameron in un commento: Per riferimento, vedere il passaggio 6 nella sezione 4 di RFC 1808

Sembra che http://code.google.com/p/js-uri/ sia la libreria preferita per la manipolazione degli URL in generale e questo tipo di calcolo da assoluto a relativo in particolare:

 new URI(potentiallyRelativeLink).resolve(new URI(window.location.href)).toString()