2013-08-25 21 views
10

È possibile sostituire il comportamento predefinito del router in Durandal 2.0 per sostituire la route predefinita, ad esempio: 'mysite.com/#/myroute' con 'mysite.com/#!/myroute' il motivo è che per lo spider di google per rilevare la pagina è ajax crawl-able, ho bisogno di inserire un hashbang nell'URL non solo un hashtag. Qualsiasi aiuto sarebbe molto apprezzato.Router Durandal 2.0 puoi sostituire # per #! per scopi di scansione web ajax?

Grazie!

risposta

6

Per quanto ne so, in Durandal 2.0 non si è in grado di farlo. I plug-in router enon supportano questo e non sarebbe una soluzione facile poiché ci sono alcuni punti nel codice che si basano sullo #.

Tuttavia, non penso che questo sia un problema nel vostro scenario. Forse hai bisogno di cambiare il modo di affrontare la necessità di rendere la tua applicazione eseguibile.

Si può ancora fare il vostro SEO applicazione compatibile utilizzando # specificando il tipo di frammento meta nella principale HTML dell'applicazione:

<meta name="fragment" content="!"> 

Così si sta dicendo google che il vostro link non hanno la #! ma che l'applicazione utilizza il rendering JavaScript. Quindi le richieste dal crawler includeranno ?_escaped_fragment_.

Così nella vostra applicazione, utilizzare:

mysite.com/#myroute 

e il crawler richiedere:

mysite.com?_escaped_fragment_=myroute 

controllare la sezione 3 di Google di documentation on crawling per sapere di più sul tag frammento meta.

SUGGERIMENTO

Se si vuole sfruttare appieno questa caratteristica Io suggerisco di usare pushState in Durandal 2.0 attivando il router in questo modo:

router.activate({ pushState: true }); 

E anche incluso il tag frammento meta.

<meta name="fragment" content="!"> 

Cose che si dovrebbe prendere in considerazione se si utilizza pushState:

  • Utilizzare pushState solo se non si ha intenzione di sostenere vecchi browser.

  • È necessario per rendere il vostro pushState lato server pronto, questo significa che quando il server è richiesto con mysite.com/myroutedovrebbe essere in grado di restituire la stessa applicazione JS e lasciare che il processo client i parametri di stringa di query. Ad esempio, questo può essere ottenuto utilizzando la riscrittura URL IIS se si utilizza ASP.NET. C'è un buon blog post su questo argomento.

+1

Eccellente risposta chiaramente scritta. Grazie, questo mi sarà di grande aiuto. – ccorrin

+0

Ho una domanda veloce, penso che abbia funzionato ora ma quando invio il mio sito a google e fornisco link a google devo dargli il http://mysite.com/#! o semplicemente http://mysite.com e Google aggiungerà in _escaped_fragment_ perché lo ho nel meta tag? – ccorrin

+0

Direi solo mysite.com .. – margabit