Al observar los comentarios sobre la respuesta aceptada y la naturaleza genérica de esta pregunta ('no funciona'), pensé que este podría ser un buen lugar para algunas explicaciones generales sobre los problemas involucrados aquí. Por lo tanto, esta respuesta pretende ser información / elaboración de antecedentes sobre el caso de uso específico del OP. Por favor, tenga paciencia conmigo.
Lado del servidor vs lado del cliente
Lo primero que hay que entender sobre esto es que ahora hay 2 lugares donde se interpreta la URL, mientras que solía haber solo 1 en 'los viejos tiempos'. En el pasado, cuando la vida era simple, algún usuario enviaba una solicitud http://example.com/about
al servidor, que inspeccionaba la parte de la ruta de acceso de la URL, determinaba que el usuario estaba solicitando la página acerca de y luego la devolvía.
Con el enrutamiento del lado del cliente, que es lo que proporciona React-Router, las cosas son menos simples. Al principio, el cliente aún no tiene ningún código JS cargado. Por lo tanto, la primera solicitud siempre será al servidor. Eso devolverá una página que contiene las etiquetas de secuencia de comandos necesarias para cargar React y React Router, etc. Solo cuando se hayan cargado esas secuencias de comandos comienza la fase 2. En la fase 2, cuando el usuario hace clic en el enlace de navegación 'Acerca de nosotros', por ejemplo, la URL se cambia localmente solo a http://example.com/about
(posible mediante la API de historial ), pero no se realiza ninguna solicitud al servidor. En cambio, React Router hace lo suyo en el lado del cliente, determina qué vista de React renderizar y lo representa. Asumiendo que su página acerca de no necesita hacer llamadas REST, ya está hecha. Ha pasado de Inicio a Acerca de nosotros sin que se haya activado ninguna solicitud del servidor.
Básicamente, cuando hace clic en un enlace, se ejecuta un Javascript que manipula la URL en la barra de direcciones, sin causar una actualización de la página , lo que a su vez hace que React Router realice una transición de página en el lado del cliente .
Pero ahora considere lo que sucede si copia y pega la URL en la barra de direcciones y se la envía por correo electrónico a un amigo. Tu amigo aún no ha cargado tu sitio web. En otras palabras, ella todavía está en la fase 1 . Todavía no se está ejecutando ningún React Router en su máquina. Entonces su navegador hará una solicitud al servidorhttp://example.com/about
.
Y aquí es donde comienza tu problema. Hasta ahora, podría salirse con la simple colocación de un HTML estático en la raíz web de su servidor. Pero eso daría 404
errores para todas las otras URL cuando se solicite desde el servidor . Esas mismas URL funcionan bien en el lado del cliente , porque React Router está haciendo el enrutamiento por usted, pero fallan en el lado del servidor a menos que haga que su servidor las entienda.
Combinación de enrutamiento del lado del servidor y del cliente
Si desea que la http://example.com/about
URL funcione tanto en el lado del servidor como en el lado del cliente, debe configurar rutas para ella tanto en el lado del servidor como en el del cliente. Tiene sentido ¿verdad?
Y aquí es donde comienzan tus elecciones. Las soluciones van desde eludir el problema por completo, a través de una ruta general que devuelve el HTML de arranque, hasta el enfoque isomorfo completo en el que tanto el servidor como el cliente ejecutan el mismo código JS.
.
Evitando el problema por completo: Hash History
Con Hash History en lugar de Browser History , su URL para la página acerca se vería así:
http://example.com/#/about
La parte que #
sigue al símbolo hash ( ) no se envía al servidor. Por lo tanto, el servidor solo ve http://example.com/
y envía la página de índice como se esperaba. React-Router recogerá la #/about
parte y mostrará la página correcta.
Desventajas :
- URL 'feas'
- La representación del lado del servidor no es posible con este enfoque. En lo que respecta a la optimización de motores de búsqueda (SEO), su sitio web consta de una sola página con casi ningún contenido.
.
Catch-all
Con este enfoque, usted usa el Historial del navegador, pero simplemente configura un servidor general que envía /*
a index.html
, lo que le proporciona la misma situación que con el Historial de hash. Sin embargo, tiene URL limpias y podría mejorar este esquema más adelante sin tener que invalidar todos los favoritos de sus usuarios.
Desventajas :
- Más complejo de configurar
- Todavía no hay buen SEO
.
Híbrido
En el enfoque híbrido, se expande en el escenario general al agregar scripts específicos para rutas específicas. Puede crear algunos scripts PHP simples para devolver las páginas más importantes de su sitio con contenido incluido, de modo que Googlebot pueda al menos ver lo que hay en su página.
Desventajas :
- Aún más complejo de configurar
- Solo buen SEO para esas rutas le das el trato especial
- Duplicación de código para representar contenido en el servidor y el cliente
.
Isomorfo
¿Qué sucede si utilizamos Node JS como nuestro servidor para poder ejecutar el mismo código JS en ambos extremos? Ahora, tenemos todas nuestras rutas definidas en una única configuración de enrutador de reacción y no necesitamos duplicar nuestro código de representación. Este es 'el santo grial', por así decirlo. El servidor envía exactamente el mismo marcado que terminaríamos si la transición de página hubiera ocurrido en el cliente. Esta solución es óptima en términos de SEO.
Desventajas :
- Servidor debe (poder) ejecutar JS. He experimentado con Java icw Nashorn pero no me funciona. En la práctica, significa principalmente que debe utilizar un servidor basado en Node JS.
- Muchos problemas ambientales difíciles (usando
window
en el lado del servidor, etc.)
- Curva de aprendizaje empinada
.
¿Cuál debería usar?
Elija el que pueda salirse con la suya. Personalmente, creo que el conjunto es lo suficientemente simple como para configurarlo, por lo que ese sería mi mínimo. Esta configuración le permite mejorar las cosas con el tiempo. Si ya está utilizando Node JS como su plataforma de servidor, definitivamente investigaría hacer una aplicación isomórfica. Sí, es difícil al principio, pero una vez que lo dominas, en realidad es una solución muy elegante para el problema.
Básicamente, para mí, ese sería el factor decisivo. Si mi servidor se ejecuta en el Nodo JS, me volvería isomorfo; de lo contrario, optaría por la solución Catch-all y solo la ampliaría (solución híbrida) a medida que pasa el tiempo y los requisitos de SEO lo exigen.
Si desea obtener más información sobre el procesamiento isomorfo (también llamado 'universal') con React, hay algunos buenos tutoriales sobre el tema:
Además, para comenzar, te recomiendo mirar algunos kits de inicio. Elija uno que coincida con sus opciones para la pila de tecnología (recuerde, React es solo la V en MVC, necesita más cosas para construir una aplicación completa). Comience mirando el publicado por el propio Facebook:
O elija uno de los muchos de la comunidad. Hay un buen sitio ahora que intenta indexarlos a todos:
Empecé con estos:
Actualmente estoy usando una versión casera de renderizado universal inspirada en los dos kits de inicio anteriores, pero ahora están desactualizados.
¡Buena suerte con tu búsqueda!