2011-11-11 9 views
18

Mi piacerebbe accendere qualche script se l'utente sta visitando l'url di root del mio sito.Come verificare se l'utente sta visitando l'url di root del sito?

Per esempio, io voglio fare qualcosa a mio avviso quando l'utente sta visitando

  • www.example.com
  • example.com
  • www.example.com/
  • http://www.example.com
  • http://example.com

... [Varie combinazioni di quanto sopra.]

E non per www.example.com/anything else.
Qual è il modo più sicuro per controllarlo in una pagina di visualizzazione di un sito Web ASP.NET MVC 3 [Razor] e javascript? Inoltre, c'è un modo per scoprire usando solo JavaScript?
Grazie.

risposta

51

Il metodo più semplice JavaScript è:

var is_root = location.pathname == "/"; //Equals true if we're at the root 

Anche http://example.com/?foo=bar#hash produrrà il risultato giusto, dal momento che il percorso esclude la stringa di query e la posizione di hash .

dare un'occhiata:

http://anything-but-a-slash/     Root 
          /?querystring  Root 
          /#hash    Root 
          /page    Not root 

Se si dispone di file di indice (s) a vostra cartella principale, uno sguardo al seguente esempio:

var is_root =/^\/(?:|index\.aspx?)$/i.test(location.pathname); 

La riga precedente sta usando una regolare espressione. I caratteri speciali devono essere sfuggiti, il suffisso /i rende il modello non sensibile al maiuscolo/minuscolo. Se vuoi che il caso corrisponda, ometti il ​​flag i.

La stessa espressione regolare presentato graficamente:

Regular expression visualization

+0

Grazie per la risposta completa. – Kamyar

+0

Se è necessario anche il supporto per localhost, provare questo, dove/Site/rappresenta il progetto var is_root = (window.location.pathname == "/" || window.location.pathname == "/ Site /")? vero falso; – afreeland

+0

@afreeland Per 'http: // localhost/Site /', 'location.pathname' mostra'/Site/'. Se vuoi testare un sito web, temporaneamente, è meglio usare '.htaccess' per riscrivere la radice. Vedi: http://pastebin.com/4ZJzKJkE. Inoltre, 'a == b' restituisce già un valore booleano, non c'è bisogno di usare' (a == b? True: false) '. –

0

Con un'espressione regolare come:

(/^https?\:\/\/[^\/]+\/?$/).test(window.location.href)

+3

sembra molto più facile da usare 'window.location.pathname'. – jfriend00

+0

è dannatamente vero :) – Mic

+0

@Mic un po 'confuso con la regex puoi per favore lo riassunto? – Praveen

0

Penso

if(window.location == window.location.hostname) { 
    //is root 
} 

Edit: Non utilizzare questo, si veda il commento

+1

Grazie. ma 'window.location.hostname' non rispetta i numeri di porta. Quindi, in dev, se sei su un numero di porta diverso da 80, otterrai risultati falsi. – Kamyar

+1

@ Kamyar: hai ragione, grazie – Andre

1

Prova questo più robusto espressione regolare :

Regex

var isRoot =/^(\/|\/index\.asp|\/index\.aspx)$/i.test(location.pathname); 


Descrizione

Regular expression visualization


Demo

Debuggex Demo

0

Il test per il percorso di "/" non è riuscito quando ho eseguito la mia app in modalità debug/anteprima dal mio IDE online. In altre parole, normalmente viene fornito con un URL pulito (no .html) tranne quando lo servo da Cloud9, nel qual caso viene servito con index.html.

Quindi, questo sta lavorando per me:

if(window.location.pathname.length == 1 || window.location.pathname.length == 0 || window.location.pathname === "/index.html" || window.location.pathname === "/index"){ //I'm at the app root }

Problemi correlati