location.host vs location.hostname e compatibilità cross-browser?


365

Quale di questi è il più efficace rispetto al controllo se l'agente utente accede tramite il dominio corretto.

Vorremmo mostrare un piccolo avviso in stile "barra superiore" basato su js se stanno accedendo al dominio usando una sorta di proxy web (poiché tende a spezzare js).

Stavamo pensando di utilizzare quanto segue:

var r = /.*domain\.com$/;
if (r.test(location.hostname)) {
    // showMessage ...
}

Ciò si prenderebbe cura di tutti i sottodomini che useremo mai.

Quale dovremmo usare host o hostname?

In Firefox 5 e Chrome 12:

console.log(location.host);
console.log(location.hostname);

.. mostra lo stesso per entrambi.

È perché la porta non è effettivamente nella barra degli indirizzi?

W3Schools afferma che l'host contiene la porta.

Location.host/hostname deve essere convalidato o possiamo essere abbastanza certi in IE6 + e in tutti gli altri che esisterà?


6
Una cosa da notare è che Google Chrome ha una location.origin, dove MSIE e Firefox no. developer.mozilla.org/En/Window.location - msdn.microsoft.com/en-us/library/ms952653.aspx
Keyo


Risposte:


1064

anatomia del collegamento interattivo

Come un piccolo appunto: l' anatomia del collegamento interattivo

-

In breve (assumendo una posizione di http://example.org:8888/foo/bar#bang):

  • hostname ti dà example.org
  • host ti dà example.org:8888

87
Un'immagine vale più di mille parole.
Jack Giffin,

4
@lolzerywowzery ... ma solo quelle migliaia di parole richieste per descrivere l'immagine
Agi Hammerthief,

1
Secondo en.wikipedia.org/wiki/… , la porta non dovrebbe essere considerata una parte dell'host (ma fa parte dell'autorità).
Alec,

@Alec questa è una nota tecnica interessante; approfondire la citazione di Wikipedia rivela che, secondo RFC 3986, "autorità" dovrebbe essere il termine per la concatenazione del nome host :e della porta. Mi chiedo quanta parte della discussione sia ancora disponibile da quando location.hostè stata formulata ... Sospetto che sia stata nominata così oggi perché nessuno dei presenti aveva letto o pensato di menzionare quell'RFC.
JamesTheAwesomeDude,

Grazie mille per la semplice soluzione
Tarun Nagpal,

70

l'host include solo il numero di porta se ce n'è uno specificato. Se non esiste un numero di porta specifico nell'URL, restituisce lo stesso nome host. Scegli se vuoi abbinare il numero di porta o meno. Vedi https://developer.mozilla.org/en/window.location per maggiori informazioni.

Suppongo che desideri che il nome host ottenga solo il nome del sito.


33

Se stai insistendo per usare il window.location.origin Puoi inserire questo in cima al tuo codice prima di leggere ilorigin

if (!window.location.origin) {
  window.location.origin = window.location.protocol + "//" + window.location.hostname + (window.location.port ? ':' + window.location.port: '');
}

Soluzione

PS: Per la cronaca, in realtà era la domanda originale. Era già stato modificato :)


5
Ma .... OP non ha mai menzionato window.location.originnella sua domanda. La loro domanda in realtà riguardava specificamente cose che non lo sono window.location.origin.
Winderps,

1
Vale anche la pena notare che window.location.origin ha problemi di compatibilità del browser. developer.mozilla.org/en-US/docs/Web/API/Window/…
Scott

10

Alla tua domanda principale è stata data una risposta sopra. Volevo solo sottolineare che la regex che stai usando ha un bug. Ci riuscirà anche su foo-domain.comcui non è un sottodominio didomain.com

Quello che vuoi davvero è questo:

/(^|\.)domain\.com$/


0

Solo per aggiungere una nota che il browser Google Chrome ha l'attributo di origine per la posizione. che ti dà l'intero dominio dal protocollo al numero di porta, come mostrato nella schermata qui sotto. strumento per sviluppatori Chrome

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.