Uitând la comentariile la răspunsul acceptat și la natura generică a acestei întrebări („nu funcționează”), m-am gândit că acesta ar putea fi un loc bun pentru câteva explicații generale despre problemele implicate aici. Deci, acest răspuns este conceput ca informații de fundal/elaborare asupra cazului de utilizare specific al OP. Vă rog să mă îndurați.
Partea server vs partea clientului
Primul lucru important de înțeles despre acest lucru este că acum există 2 locuri în care URL-ul este interpretat, în timp ce înainte era doar 1 în „pe vremuri”. În trecut, când viața era simplă, unii utilizatori trimiteau o solicitare pentru http://example.com/about
către server, care inspecta partea de cale a adresei URL, determina că utilizatorul solicita pagina despre și apoi trimitea înapoi acea pagină.
Cu rutarea pe partea client, care este ceea ce oferă React-Router, lucrurile sunt mai puțin simple. La început, clientul nu are încă niciun cod JS încărcat. Deci, prima solicitare va fi întotdeauna către server. Aceasta va returna apoi o pagină care conține etichetele de script necesare pentru a încărca React și React Router etc. Faza 2 începe doar după ce s-au încărcat acele scripturi. În faza 2, când utilizatorul face clic pe linkul de navigare „Despre noi”, de exemplu, adresa URL este schimbată numai local în http://example.com/about
(făcut posibil de History API), dar nu se face nicio solicitare către server. În schimb, React Router își face treaba pe partea clientului, determină ce vizualizare React să randeze și o redă. Presupunând că pagina dvs. despre nu trebuie să efectueze apeluri REST, este deja făcută. Ați trecut de la Acasă la Despre noi fără ca vreo solicitare de server să fi declanșat.
Deci, practic, atunci când faceți clic pe un link, se rulează Javascript care manipulează adresa URL din bara de adrese, fără a provoca o reîmprospătare a paginii, ceea ce, la rândul său, face ca React Router să efectueze o tranziție de pagină pe client. -lateral.
Dar acum luați în considerare ce se întâmplă dacă copiați și lipiți adresa URL în bara de adrese și o trimiteți prin e-mail unui prieten. Prietenul tău nu ți-a încărcat site-ul încă. Cu alte cuvinte, ea este încă în faza 1. Niciun router React nu rulează încă pe computerul ei. Prin urmare, browserul ei va face o solicitare de server către http://example.com/about
.
Și de aici încep necazurile tale. Până acum, ai putea scăpa doar plasând un HTML static la webroot-ul serverului tău. Dar asta ar da erori 404
pentru toate celelalte URL-uri când sunt solicitate de la server. Aceleași adrese URL funcționează bine pe partea clientului, deoarece acolo React Router face rutarea pentru dvs., dar eșuează pe partea serverului dacă nu vă faceți serverul să înțeleagă lor.
Combinând rutarea serverului și clientului
Dacă doriți ca URL-ul http://example.com/about
să funcționeze atât pe server, cât și pe partea client, trebuie să configurați rute pentru aceasta atât pe server, cât și pe partea client. Are sens, nu?
Și de aici încep alegerile tale. Soluțiile variază de la ocolirea completă a problemei, printr-o rută catch-all care returnează HTML-ul de bootstrap, până la abordarea izomorfă completă în care atât serverul, cât și clientul rulează același cod JS.
.
Ocolind cu totul problema: Istoricul Hash
Cu Istoricul hash în loc de Istoricul browserului, adresa URL a paginii Despre ar arăta cam așa: http://example.com/#/about
Partea de după simbolul hash (#
) nu este trimisă la server. Deci serverul vede doar http://example.com/
și trimite pagina de index așa cum era de așteptat. React-Router va prelua partea #/about
și va afișa pagina corectă.
Dezavantaje:
- URL-uri „urâte”.
- Redarea pe partea serverului nu este posibilă cu această abordare. În ceea ce privește optimizarea pentru motoarele de căutare (SEO), site-ul dvs. web constă dintr-o singură pagină cu aproape deloc conținut.
.
Prindele pe toate
Cu această abordare, utilizați Istoricul browserului, dar doar configurați un catch-all pe server care trimite /*
la index.html
, oferindu-vă efectiv aceeași situație ca și în Istoricul Hash. Cu toate acestea, aveți adrese URL curate și puteți îmbunătăți această schemă mai târziu fără a fi nevoie să invalidați toate favoritele utilizatorului.
Dezavantaje:
- Mai complex de configurat
- Încă nu este un SEO bun
.
Hibrid
În abordarea hibridă, extindeți scenariul catch-all adăugând scripturi specifice pentru anumite rute. Ai putea crea niște scripturi PHP simple pentru a returna cele mai importante pagini ale site-ului tău cu conținut inclus, astfel încât Googlebot să poată vedea cel puțin ce este pe pagina ta.
Dezavantaje:
- Și mai complex de configurat
- Doar SEO bun pentru acele rute pe care le acordați un tratament special
- Duplicarea codului pentru redarea conținutului pe server și client
.
izomorf
Ce se întâmplă dacă folosim Node JS ca server, astfel încât să putem rula același cod JS la ambele capete? Acum, avem toate rutele noastre definite într-o singură configurare a routerului de reacție și nu trebuie să ne duplicăm codul de randare. Acesta este „Sfântul Graal”, ca să spunem așa. Serverul trimite exact același marcaj cu care am ajunge dacă tranziția paginii ar fi avut loc pe client. Această soluție este optimă în ceea ce privește SEO.
Dezavantaje:
- Serverul trebuie (să poată) rula JS. Am experimentat cu Java i.c.w. Nashorn, dar nu funcționează pentru mine. În practică, înseamnă mai ales că trebuie să utilizați un server bazat pe Node JS.
- Multe probleme de mediu dificile (folosirea
window
pe partea serverului etc.)
- Curbă abruptă de învățare
.
Pe care ar trebui să-l folosesc?
Alege-l pe cel cu care poți scăpa. Personal, cred că catch-all este destul de simplu de configurat, așa că acesta ar fi minimul meu. Această configurație vă permite să îmbunătățiți lucrurile în timp. Dacă utilizați deja Node JS ca platformă de server, cu siguranță aș investiga realizarea unei aplicații izomorfe. Da, este greu la început, dar odată ce înțelegi, este de fapt o soluție foarte elegantă la problemă.
Deci, practic, pentru mine, acesta ar fi factorul decisiv. Dacă serverul meu rulează pe Node JS, aș deveni izomorf; în caz contrar, aș opta pentru soluția Catch-all și aș extinde-o (soluție hibridă) pe măsură ce timpul trece și cerințele SEO o cer.
Dacă doriți să aflați mai multe despre redarea izomorfă (numită și „universală”) cu React, există câteva tutoriale bune pe acest subiect:
De asemenea, pentru a începe, vă recomand să vă uitați la câteva truse de pornire. Alegeți unul care se potrivește cu alegerile dvs. pentru stiva de tehnologie (rețineți, React este doar V-ul în MVC, aveți nevoie de mai multe lucruri pentru a crea o aplicație completă). Începeți cu privire la cel publicat de Facebook însuși:
Sau alegeți unul dintre multele comunitate. Există acum un site frumos care încearcă să le indexeze pe toate:
Am inceput cu astea:
În prezent, folosesc o versiune home-brew a redării universale care a fost inspirată din cele două kituri de pornire de mai sus, dar acestea sunt depășite acum.
Mult succes cu căutarea ta!
person
Stijn de Witt
schedule
14.04.2016
#
? Mulțumesc! - person SudoPlz   schedule 06.06.2015index.html
. Acest lucru se va asigura căindex.html
este lovit indiferent de situație. - person Trevor Hutto   schedule 30.07.2016