Глядя на комментарии к принятому ответу и общий характер этого вопроса («не работает»), я подумал, что это может быть хорошим местом для некоторых общих объяснений по затронутым здесь вопросам. Итак, этот ответ предназначен в качестве справочной информации / уточнения конкретного варианта использования OP. Пожалуйста, потерпите меня.
На стороне сервера или на стороне клиента
Первое, что нужно понять, это то, что теперь есть 2 места, где интерпретируется URL, тогда как раньше было только 1 место. Раньше, когда жизнь была простой, какой-то пользователь отправлял запрос http://example.com/about
на сервер, который проверял часть пути URL-адреса, определял, что пользователь запрашивал страницу about, а затем отправлял эту страницу обратно.
С маршрутизацией на стороне клиента, которую предоставляет React-Router, все менее просто. Сначала у клиента еще нет загруженного JS-кода. Таким образом, самый первый запрос всегда будет к серверу. Затем будет возвращена страница, содержащая необходимые теги сценария для загрузки React и React Router и т. Д. Только после загрузки этих сценариев начинается фаза 2. На этапе 2, когда пользователь нажимает, например, ссылку навигации "О нас", URL-адрес изменяется только локально на http://example.com/about
(что стало возможным благодаря разработчику History API), но запросы к серверу не выполняются. Вместо этого React Router делает свое дело на стороне клиента, определяет, какое представление React нужно отображать, и отображает его. Предполагая, что на вашей странице about не нужно выполнять какие-либо вызовы REST, это уже сделано. Вы перешли с главной страницы на раздел «О нас», но при этом не было запущено ни одного запроса сервера.
Таким образом, в основном, когда вы нажимаете ссылку, запускается некоторый Javascript, который манипулирует URL-адресом в адресной строке, не вызывая обновления страницы, что, в свою очередь, заставляет React Router выполнять переход страницы на клиенте -сайд.
Но теперь подумайте, что произойдет, если вы скопируете и вставите URL-адрес в адресную строку и отправите его другу по электронной почте. Ваш друг еще не загрузил ваш сайт. Другими словами, она все еще находится в фазе 1. На ее машине еще не запущен React Router. Таким образом, ее браузер сделает запрос сервера к http://example.com/about
.
И здесь начинаются ваши проблемы. До сих пор вы могли обойтись простым размещением статического HTML-кода в корневом веб-сервере вашего сервера. Но это приведет к 404
ошибкам для всех остальных URL при запросе с сервера. Те же самые URL-адреса отлично работают на стороне клиента, потому что React Router выполняет маршрутизацию за вас, но они не работают на стороне сервера, если вы не дадите своему серверу понять их.
Комбинирование маршрутизации на стороне сервера и на стороне клиента
Если вы хотите, чтобы URL-адрес http://example.com/about
работал как на стороне сервера, так и на стороне клиента, вам необходимо настроить маршруты для него как на стороне сервера, так и на стороне клиента. Имеет смысл, правда?
И здесь начинается ваш выбор. Решения варьируются от полного обхода проблемы с помощью всеобъемлющего маршрута, который возвращает загрузочный HTML-код, до полностью изоморфного подхода, когда и сервер, и клиент запускают один и тот же JS-код.
.
Полный обход проблемы: история хеширования
С помощью истории хеширования вместо История браузера, ваш URL-адрес для страницы с информацией будет выглядеть примерно так: http://example.com/#/about
Часть после символа решетки (#
) не отправляется на сервер. Таким образом, сервер видит только http://example.com/
и отправляет индексную страницу, как ожидалось. React-Router подберет #/about
часть и покажет правильную страницу.
Минусы:
- "уродливые" URL
- При таком подходе рендеринг на стороне сервера невозможен. Что касается поисковой оптимизации (SEO), ваш веб-сайт состоит из одной страницы, на которой практически нет контента.
.
Поймать все
При таком подходе вы действительно используете историю браузера, но просто настраиваете на сервере всеохватывающую информацию, которая отправляет /*
на index.html
, что дает вам практически ту же ситуацию, что и с историей хеширования. Однако у вас есть чистые URL-адреса, и вы можете улучшить эту схему позже, не аннулируя все избранное пользователя.
Минусы:
- Более сложный в настройке
- Все еще нет хорошего SEO
.
Гибридный
В гибридном подходе вы расширяете всеобъемлющий сценарий, добавляя определенные сценарии для определенных маршрутов. Вы можете создать несколько простых сценариев PHP, чтобы возвращать самые важные страницы вашего сайта с включенным контентом, чтобы робот Googlebot мог, по крайней мере, видеть, что на вашей странице.
Минусы:
- Еще сложнее настроить
- Только хорошее SEO для тех маршрутов, которым вы уделяете особое внимание
- Дублирование кода для рендеринга контента на сервере и клиенте
.
Изоморфный
Что, если мы используем Node JS в качестве нашего сервера, чтобы мы могли запускать один и тот же код JS на обоих концах? Теперь у нас есть все наши маршруты, определенные в одной конфигурации реактивного маршрутизатора, и нам не нужно дублировать наш код рендеринга. Это, так сказать, «Святой Грааль». Сервер отправляет ту же разметку, которую мы получили бы, если бы переход страницы произошел на клиенте. Это решение оптимально с точки зрения SEO.
Минусы:
- Сервер должен (уметь) запускать JS. Я экспериментировал с Java i.c.w. Нашорн, но у меня это не работает. На практике это в основном означает, что вы должны использовать сервер на основе Node JS.
- Множество сложных экологических проблем (использование
window
на стороне сервера и т. Д.)
- Крутая кривая обучения
.
Что мне использовать?
Выберите тот, который вам сойдет с рук. Лично я считаю, что все достаточно просто настроить, так что это мой минимум. Эта настройка позволяет вам со временем улучшать ситуацию. Если вы уже используете Node JS в качестве серверной платформы, я бы определенно исследовал создание изоморфного приложения. Да, сначала это сложно, но как только вы освоитесь, это действительно очень элегантное решение проблемы.
По сути, для меня это был бы решающий фактор. Если мой сервер работает на Node JS, я бы стал изоморфным; в противном случае я бы выбрал решение Catch-all и просто расширил его (гибридное решение) по мере того, как время прогрессирует и этого требуют требования SEO.
Если вы хотите узнать больше об изоморфном (также называемом «универсальном») рендеринге с помощью React, есть несколько хороших руководств по этой теме:
Кроме того, для начала я рекомендую посмотреть несколько стартовых комплектов. Выберите тот, который соответствует вашему выбору для стека технологий (помните, React - это просто V в MVC, вам нужно больше материала для создания полноценного приложения). Начнем с того, что опубликовал сам Facebook:
Или выберите один из множества, предложенных сообществом. Теперь есть хороший сайт, который пытается их всех проиндексировать:
Я начал с этих:
В настоящее время я использую самодельную версию универсального рендеринга, вдохновленную двумя стартовыми наборами выше, но сейчас они устарели.
Удачи в поисках!
person
Stijn de Witt
schedule
14.04.2016
#
? Спасибо! - person SudoPlz   schedule 06.06.2015index.html
. Это обеспечит попадание вindex.html
несмотря ни на что. - person Trevor Hutto   schedule 30.07.2016