A cosa servono gli shebang / hashbang (#!) In Facebook e i nuovi URL di Twitter?


743

Ho appena notato che gli URL di Facebook lunghi e contorti a cui siamo abituati ora sembrano così:

http://www.facebook.com/example.profile#!/pages/Another-Page/123456789012345

Per quanto posso ricordare, all'inizio di quest'anno era solo una normale stringa simile a un frammento di URL (a partire da #), senza il punto esclamativo. Ma ora è uno shebang o hashbang ( #!), che in precedenza ho visto solo negli script shell e negli script Perl.

I nuovi URL di Twitter ora presentano anche i #!simboli. Un URL del profilo Twitter, ad esempio, ora assomiglia a questo:

http://twitter.com/#!/BoltClock

Fa #!ora giocare un qualche ruolo speciale nella URL, come per un certo quadro Ajax o qualcosa del genere dal momento che le nuove interfacce di Facebook e Twitter sono ormai ampiamente Ajaxified?
L'utilizzo di questo nei miei URL gioverebbe in qualche modo alla mia applicazione Web?


130
Hmm. Ho dovuto cercare quello che shebangera ... en.wikipedia.org/wiki/Shebang_%28Unix%29
JYelton

32
FWIW, non sono solo script shell e perl, ma qualsiasi script eseguito su un sistema unix come. Il #! line dice alla shell qual è l'interprete per quella sceneggiatura ... ovviamente, il mio commento non ha nulla a che fare con Facebook o Twitter
bluesmoon

3
Grazie, Hacker Notizie! (lasciando un commento in modo da non rispondere alla mia domanda, non vedo la necessità di farlo)
BoltClock

15
L'hashbang è glorificato per tutte le ragioni sbagliate, rompe le migliori pratiche e distrugge la possibilità di un miglioramento progressivo e un degrado aggraziato. Si prega di utilizzare le altre soluzioni là fuori.
Balupton,

2
Nota che a ottobre 2015 Google ha deprecato l'hashtag che hanno introdotto nel 2009 ! Quindi per le nuove applicazioni non dovresti più farlo per il SEO. Al momento c'è solo un'osservazione sottile in bianco nella parte superiore delle pagine delle specifiche di Google: "Questa raccomandazione è ufficialmente obsoleta a partire da ottobre 2015".
Bart,

Risposte:


483

Questa tecnica è ora obsoleta .

Questo era usato per dire a Google come indicizzare la pagina.

https://developers.google.com/webmasters/ajax-crawling/

Questa tecnica è stata per lo più soppiantata dalla possibilità di utilizzare l'API della cronologia JavaScript introdotta insieme a HTML5. Per un URL come www.example.com/ajax.html#!key=value, Google controllerà l'URL www.example.com/ajax.html?_escaped_fragment_=key=valueper recuperare una versione non AJAX dei contenuti.


16
Sei sicuro che sia tutto ciò che c'è da fare? Trovo spesso che il caricamento della pagina si blocchi su un URL shebang su Facebook (anche dopo molte ricariche), ma se rimuovi manualmente il # !, funziona. Per non parlare del fatto che spesso si ottengono "1.5 URL" (ovvero il vecchio URL rimane, e solo la nuova parte viene aggiunta ad esso (cioè photo.php? Id = ... due volte, ma con ID diversi). Per non parlare del fatto che " #! "viene anche aggiunto agli URL di Facebook, che probabilmente non sono (e non dovrebbero essere) indicizzabili. In ogni caso trovo lo shebang estremamente fastidioso poiché sembra essere il motivo di così tanti errori di pagina sul mio lento linea di casa
Pedery,

11
Il fatto che Facebook abbia dei bug non rende questi errori colpa di due caratteri nell'URL. Se il sito è codificato correttamente per comprenderli e generarli, gli URL AJAX scansionabili sono abbastanza utili. Anche molte altre cose su Facebook si guastano.
Ceejayoz,

15
@Pedery: ho mai visto quel problema con Facebook. Sono d'accordo, mi fa salire il muro (non Facebook) per tutto il tempo.
BoltClock

5
Per quanto riguarda i motori di ricerca, avere un URL AJAX indicizzabile non fa più indicizzare la pagina rispetto a un URL non AJAX indicizzabile . Facebook utilizza questo formato URL non solo per i vantaggi di Google, ma rende anche le pagine a cui puoi accedere tramite AJAX su Facebook come segnalibro quando altrimenti non lo sarebbero.
Ceejayoz,

13
Per alcuni avvertimenti interessanti, leggi anche questo articolo: isolani.co.uk/blog/javascript/BreakingTheWebWithHashBangs
Michael Stum

215

L'ottotorpe / numero-segno / hashmark ha un significato speciale in un URL, normalmente identifica il nome di una sezione di un documento. Il termine preciso è che il testo che segue l'hash è la parte di ancoraggio di un URL. Se usi Wikipedia, vedrai che la maggior parte delle pagine ha un sommario e puoi saltare alle sezioni all'interno del documento con un'ancora, come:

https://en.wikipedia.org/wiki/Alan_Turing#Early_computers_and_the_Turing_test

https://en.wikipedia.org/wiki/Alan_Turingidentifica la pagina ed Early_computers_and_the_Turing_testè l'ancora. La ragione per cui Facebook e altre applicazioni basate su Javascript (come il mio Wood & Stones ) usano ancore è che vogliono rendere le pagine segnalibro (come suggerito da un commento su quella risposta) o supportare il pulsante Indietro senza ricaricare l'intera pagina dal server .

Per supportare il bookmarking e il pulsante Indietro, è necessario modificare l'URL. Tuttavia, se si modifica la porzione di pagina (con qualcosa di simile window.location = 'http://raganwald.com';) in un URL diverso o senza specificare un ancoraggio, il browser caricherà l'intera pagina dall'URL. Prova questo nella console Javascript di Firebug o Safari. Load http://minimal-github.gilesb.com/raganwald. Ora nella console Javascript, digitare:

window.location = 'http://minimal-github.gilesb.com/raganwald';

Vedrai la pagina aggiornare dal server. Ora digita:

window.location = 'http://minimal-github.gilesb.com/raganwald#try_this';

Aha! Nessuna pagina di aggiornamento! Genere:

window.location = 'http://minimal-github.gilesb.com/raganwald#and_this';

Ancora nessun aggiornamento. Usa il pulsante Indietro per vedere che questi URL sono nella cronologia del browser. Il browser nota che siamo sulla stessa pagina ma che stiamo cambiando l'ancora, quindi non si ricarica. Grazie a questo comportamento, possiamo avere una singola applicazione Javascript che appare al browser in una 'pagina' ma che ha molte sezioni con segnalibro che rispettano il pulsante Indietro. L'applicazione deve cambiare l'ancoraggio quando un utente immette "stati" diversi e allo stesso modo se un utente utilizza il pulsante Indietro o un segnalibro o un collegamento per caricare l'applicazione con un ancoraggio incluso, l'applicazione deve ripristinare lo stato appropriato.

Quindi il gioco è fatto: Anchors fornisce ai programmatori Javascript un meccanismo per creare applicazioni con segnalibri, indicizzabili e back-friendly. Questa tecnica ha un nome: è un'interfaccia a pagina singola .

ps C'è un quarto vantaggio in questa tecnica: caricare il contenuto della pagina tramite AJAX e quindi iniettarlo nel DOM corrente può essere molto più veloce del caricare una nuova pagina. Oltre all'aumento della velocità, ulteriori trucchi come il caricamento di determinate porzioni in background possono essere eseguiti sotto il controllo del programmatore.

pps Alla luce di tutto ciò, il "botto" o il punto esclamativo è un ulteriore suggerimento per il web crawler di Google che la stessa pagina esatta può essere caricata dal server in un URL leggermente diverso. Vedi Ajax Crawling . Un'altra tecnica consiste nel fare in modo che ciascun collegamento punti a un URL accessibile dal server e quindi utilizzare Javascript discreto per modificarlo in una SPI con un ancoraggio.

Ecco di nuovo il collegamento chiave: il manifesto dell'interfaccia a pagina singola


14
"Tuttavia, un'applicazione senza questa ottimizzazione è ancora eseguibile la scansione se il crawler Web desidera indicizzarla." Non proprio. L'hash non viene inviato al server.
Chris Broadfoot,

7
solo per informazione: self.document.location.hashfornisce il valore di questo hash
Kevin,

12
L'hash non viene inviato al server. Buona pesca!
raganwald,

36
Tutta questa risposta a parte il singolo paragrafo "pps" è ridondante.
Corse di leggerezza in orbita

21
@imaginonic: Sono in ritardo, ma come perfettamente artigianale come è, il 90% di essa non tocca l' #!aspetto della mia domanda a tutti . Ecco perché ha detto che è ridondante. Il numero di voti qui è probabilmente dovuto all'alto traffico quando la mia domanda è arrivata a Hacker News unita alla sola lunghezza di questa risposta.
BoltClock

111

Prima di tutto: sono l'autore del Manifesto per l'interfaccia a pagina singola citato da raganwald

Come raganwald ha spiegato molto bene, l'aspetto più importante dell'approccio Single Page Interface (SPI) utilizzato in FaceBook e Twitter è l'uso dell'hash #negli URL

Il personaggio !viene aggiunto solo per scopi di Google, questa notazione è uno "standard" di Google per la scansione di siti Web intensivi su AJAX (negli estremi siti Web con interfaccia singola pagina). Quando il crawler di Google trova un URL con #!esso sa che esiste un URL convenzionale alternativo che fornisce lo stesso "stato" della pagina, ma in questo caso al momento del caricamento.

Nonostante la #!combinazione sia molto interessante per il SEO, è supportato solo da Google (per quanto ne so), con alcuni trucchi JavaScript puoi costruire siti web SPI SEO compatibili per qualsiasi web crawler (Yahoo, Bing ...).

Il Manifesto SPI e le demo non utilizzano il formato di Google !negli hash, questa notazione potrebbe essere facilmente aggiunta e la scansione SPI potrebbe essere ancora più semplice (AGGIORNAMENTO: ora! La notazione viene utilizzata e rimane compatibile con altri motori di ricerca).

Dai un'occhiata a questo tutorial , è un esempio di un semplice sito SPI ItsNat ma puoi scegliere alcune idee per altri framework, questo esempio è compatibile con SEO per qualsiasi crawler web.

Il difficile problema è generare qualsiasi (o selezionato) "stato della pagina AJAX" come semplice HTML per SEO, in ItsNat è molto semplice e automatico, lo stesso sito è contemporaneamente SPI o pagina basata per SEO (o quando JavaScript è disabilitato per accessibilità). Con altri framework Web è possibile seguire l'approccio del doppio sito, un sito è basato su SPI e un'altra pagina basata su SEO, ad esempio Twitter utilizza questa tecnica del "doppio sito".


3
Che dire del principio del miglioramento progressivo? Il sito Web non dovrebbe arrestarsi in modo anomalo a causa di JavaScript disabilitato. E credetemi, javascript è disabilitato non solo nei browser obsoleti ma anche da molti utenti attenti alla sicurezza che non amano eseguire JS casuali.
Roman Royter,

88

Sarei molto attenti se si stanno prendendo in considerazione l'adozione di questa convenzione hashbang.

Una volta che hai hashbang, non puoi tornare indietro. Questo è probabilmente il problema più difficile. Il post di Ben afferma che quando pushState viene adottato più ampiamente, possiamo lasciare gli hashbang e tornare agli URL tradizionali. Bene, il fatto è che non puoi. In precedenza ho affermato che gli URL sono per sempre, vengono indicizzati e archiviati e generalmente mantenuti in circolazione. Per aggiungere a ciò, gli URL interessanti non cambiano. Non vogliamo disconnetterci da tutti i preziosi link ai nostri contenuti. Se hai implementato URL hashbang in qualsiasi momento, allora vuoi modificarli senza interrompere i collegamenti, l'unico modo per farlo è eseguendo un po 'di JavaScript sul documento principale del tuo dominio. Per sempre. Non è in alcun modo temporaneo, ne sei bloccato.

Vuoi davvero usare pushState invece di hashbang , perché rendere i tuoi URL brutti e possibilmente rotti - per sempre - è un aspetto negativo colossale e permanente degli hashbang.


Penso che le tue critiche agli hashbang siano valide, ma usare solo pushState come sostituto significa che perderemmo la possibilità di caricare contenuti all'interno di un'unica app di pagina in base all'URL. Quindi gli URL non possono essere condivisi.
Luca,

Ho avuto un problema simile nel mio lavoro: abbiamo iniziato a utilizzare Page.js (che utilizza pushState) per la navigazione a pagina singola, dove in precedenza abbiamo usato Hasher e Crossroads (hash-bashed). Di conseguenza, dovevamo salvare percorsi simili /blah#foo/feep/baz?stuff=nonsense. Il nuovo equivalente del percorso sarebbe /blah/foo/feep/baz?stuff=nonsense(nota # sostituita da /). L'ho fatto semplicemente avendo un percorso nella mia configurazione che ha catturato/blah e verificato se aveva, in tal caso, aggiungere il contenuto dell'hash dopo una barra. Salvato.
Gert Sønderby,

16

Per avere un buon seguito su tutto ciò, Twitter - uno dei pionieri degli URL hashbang e dell'interfaccia a pagina singola - ha ammesso che il sistema hashbang era lento nel lungo periodo e che hanno effettivamente iniziato a invertire la decisione e tornare a legami della vecchia scuola.

L'articolo su questo è qui.


9

Ho sempre supposto che il !appena indicato che il frammento di hash che seguiva corrispondesse a un URL, con! sostituendo la radice o il dominio del sito. Potrebbe essere qualsiasi cosa, in teoria, ma sembra che all'API di scansione di Google AJAX piaccia in questo modo.

L'hash, ovviamente, indica solo che non si sta verificando una vera ricarica della pagina, quindi sì, è per scopi AJAX. Modifica: Raganwald fa un ottimo lavoro spiegando questo in modo più dettagliato.


-2

Le risposte sopra descrivono bene perché e come viene utilizzato su Twitter e Facebook, ciò che mi è mancato è la spiegazione che cosa #fa di default ...

Su un 'normale' (non una singola applicazione di pagina) puoi fare l'ancoraggio hasha qualsiasi elemento che ha id posizionando quell'elemento id in url dopo l'hash#

Esempio:

(su Chrome) Fare clic su F12o Rihgt MouseeInspect element

inserisci qui la descrizione dell'immagine

quindi prendi id="answer-10831233"e aggiungi all'URL come segue

/programming/3009380/whats-the-shebang-hashbang-in-facebook-and-new-twitter-urls-for#answer-10831233

e otterrai un link che salta a quell'elemento nella pagina

A cosa servono gli shebang / hashbang (#!) In Facebook e i nuovi URL di Twitter?

Usando #in un modo descritto nelle risposte sopra stai introducendo comportamenti contrastanti ... anche se non perderei il sonno su di esso ... poiché Angular è diventato in qualche modo uno standard ...


2
La risposta di raganwald contiene la spiegazione che hai detto di aver perso. Anche così, non vedo come la domanda tragga vantaggio da un tutorial su come # funziona: la domanda presume che il lettore abbia già familiarità con i frammenti di URL e che la funzionalità non sia davvero rilevante qui, ad eccezione della tua osservazione sul comportamento in conflitto .
BoltClock

@BoltClock Ciao BoltClock, ma senza spiegare qual è il comportamento predefinito dicendo che "sarà in conflitto" non dà al lettore alcuna idea di cosa sia in gioco, che tipo di funzionalità si sta potenzialmente perdendo ... Mi piace solo dare belle risposte con le immagini se Vedo che manca qualcosa che sia il più completo possibile ...
Matas Vaitkevicius,
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.