Я использую React-роутер, и он отлично работает, пока я нажимаю на кнопки ссылок, но когда я обновляю свою веб-страницу, она не загружает то, что я хочу.
Например, я нахожусь, localhost/joblist
и все в порядке, потому что я приехал сюда, нажав на ссылку. Но если я обновлю веб-страницу, я получу:
Cannot GET /joblist
По умолчанию это не сработало. Изначально у меня был свой URL , как localhost/#/
и localhost/#/joblist
они работали прекрасно. Но мне не нравится этот вид URL, поэтому, пытаясь стереть это #
, я написал:
Router.run(routes, Router.HistoryLocation, function (Handler) {
React.render(<Handler/>, document.body);
});
С этой проблемой не бывает localhost/
, эта всегда возвращает то, что я хочу.
РЕДАКТИРОВАТЬ: Это приложение является одностраничным, поэтому /joblist
не нужно ничего спрашивать на любом сервере.
EDIT2: весь мой маршрутизатор.
var routes = (
<Route name="app" path="/" handler={App}>
<Route name="joblist" path="/joblist" handler={JobList}/>
<DefaultRoute handler={Dashboard}/>
<NotFoundRoute handler={NotFound}/>
</Route>
);
Router.run(routes, Router.HistoryLocation, function (Handler) {
React.render(<Handler/>, document.body);
});
javascript
reactjs
url
react-router
DavidDev
источник
источник
#
символ? Спасибо!index.html
. Это гарантирует, чтоindex.html
ударил, несмотря ни на что.Ответы:
Глядя на комментарии к принятому ответу и общий характер этого вопроса («не работает»), я подумал, что это может быть хорошим местом для некоторых общих объяснений по вопросам, связанным с этим. Таким образом, этот ответ предназначен в качестве справочной информации / разработки по конкретному варианту использования ОП. Пожалуйста, потерпите меня.
Сторона сервера против стороны клиента
Первая важная вещь, которую нужно понять, это то, что теперь есть 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 выполняет маршрутизацию за вас, но они терпят неудачу на стороне сервера, если вы не заставите свой сервер их понять.Объединение серверной и клиентской маршрутизации
Если вы хотите, чтобы
http://example.com/about
URL работал как на стороне сервера, так и на стороне клиента, вам необходимо настроить для него маршруты как на стороне сервера, так и на стороне клиента. Имеет смысл правильно?И вот тут начинается ваш выбор. Решения варьируются от полного обхода проблемы через универсальный маршрут, который возвращает загрузочный HTML, до полного изоморфного подхода, когда и сервер, и клиент запускают один и тот же код JS.
,
Обход проблемы в целом: Hash History
Если вместо истории браузеров использовать историю
http://example.com/#/about
хэшей , ваш URL-адрес страницы about будет выглядеть примерно так: Часть после#
символа hash ( ) не отправляется на сервер. Таким образом, сервер только видитhttp://example.com/
и отправляет страницу индекса, как и ожидалось. React-Router подберет#/about
деталь и покажет правильную страницу.Недостатки :
,
Вместилище разнообразных предметов
При таком подходе вы используете историю браузера, а просто настроить улов-все на сервере , который посылает
/*
кindex.html
, фактически давая вам много такую же ситуацию , как с историей Hash. Тем не менее, у вас есть чистые URL-адреса, и вы могли бы улучшить эту схему позже, не делая недействительными все избранное вашего пользователя.Недостатки :
,
Гибридный
В гибридном подходе вы расширяете общий сценарий, добавляя конкретные сценарии для определенных маршрутов. Вы можете сделать несколько простых сценариев PHP, чтобы вернуть наиболее важные страницы вашего сайта с включенным содержимым, чтобы робот Googlebot мог хотя бы увидеть, что находится на вашей странице.
Недостатки :
,
изоморфный
Что если мы используем Node JS в качестве нашего сервера, чтобы мы могли запускать один и тот же код JS на обоих концах? Теперь у нас есть все наши маршруты, определенные в одной конфигурации реакции-маршрутизатора, и нам не нужно дублировать наш код рендеринга. Это, так сказать, «Святой Грааль». Сервер отправляет ту же самую разметку, которую мы получили бы в случае перехода страницы на клиенте. Это решение является оптимальным с точки зрения SEO.
Недостатки :
window
на стороне сервера и т. Д.),
Какой я должен использовать?
Выберите тот, который вы можете сойти с рук. Лично я думаю, что все достаточно просто настроить, так что это мой минимум. Эта настройка позволяет вам улучшать вещи с течением времени. Если вы уже используете Node JS в качестве серверной платформы, я бы определенно занялся созданием изоморфного приложения. Да, сначала это сложно, но как только вы освоитесь, это действительно очень элегантное решение проблемы.
В общем, для меня это было бы решающим фактором. Если мой сервер работает на Node JS, я бы стал изоморфным; В противном случае я бы выбрал решение Catch-all и просто расширил его (Гибридное решение), когда время идет, а требования SEO требуют этого.
Если вы хотите больше узнать об изоморфном (также называемом «универсальным») рендеринге с помощью React, есть несколько хороших учебников по этому вопросу:
Кроме того, чтобы начать, я рекомендую взглянуть на некоторые стартовые наборы. Выберите тот, который соответствует вашему выбору для технологического стека (помните, React - это просто V в MVC, вам нужно больше вещей для создания полноценного приложения). Начните с просмотра того, что опубликовано самим Facebook:
Или выберите один из множества сообществ. Теперь есть хороший сайт, который пытается проиндексировать их все:
Я начал с этого:
В настоящее время я использую самодельную версию универсального рендеринга, которая была вдохновлена двумя вышеперечисленными стартовыми наборами, но сейчас они устарели.
Удачи в вашем квесте!
источник
/*
и заставляете его отвечать вашей HTML-страницей. Сложность заключается в том, чтобы убедиться, что вы не перехватываете запросы на файлы .js и .css с этим маршрутом.createMemoryHistory is not a function
ошибку. Не возражаете посмотреть? stackoverflow.com/questions/45002573/…Ответы здесь очень полезны, для меня работало то, что я настроил мой сервер Webpack для ожидания маршрутов.
HistoryApiFallback - это то, что исправило эту проблему для меня. Теперь маршрутизация работает правильно, и я могу обновить страницу или ввести URL-адрес напрямую. Не нужно беспокоиться об обходах на вашем сервере узлов. Этот ответ, очевидно, работает только при использовании веб-пакета.
РЕДАКТИРОВАТЬ: см. Мой ответ здесь для более подробной причины, почему это необходимо: https://stackoverflow.com/a/37622953/5217568
источник
historyApiFallback
достаточно. Что касается всех других опций, он также может быть установлен из CLI с флагом--history-api-fallback
.Вы можете изменить свой
.htaccess
файл и вставить это:Я использую,
react: "^16.12.0"
иreact-router: "^5.1.2"
этот метод является Catch-all и, вероятно, самый простой способ, чтобы вы начали.источник
Для пользователей React Router V4 :
Если вы попытаетесь решить эту проблему с помощью техники Hash History, упомянутой в других ответах, обратите внимание, что
не работает в V4, пожалуйста, используйте
HashRouter
вместо:Ссылка: HashRouter
источник
Маршрутизатор можно вызывать двумя различными способами, в зависимости от того, происходит ли навигация на клиенте или на сервере. Он настроен для работы на стороне клиента. Ключевым параметром является второй после метода запуска местоположение.
Когда вы используете компонент React Router Link, он блокирует навигацию в браузере и вызывает transitionTo для выполнения клиентской навигации. Вы используете HistoryLocation, поэтому он использует API истории HTML5, чтобы завершить иллюзию навигации, имитируя новый URL в адресной строке. Если вы используете старые браузеры, это не сработает. Вам нужно будет использовать компонент HashLocation.
Когда вы нажимаете кнопку обновления, вы обходите весь код React и React Router. Сервер получает запрос
/joblist
и должен что-то вернуть. На сервере вам нужно передать путь, который был запрошенrun
методу, чтобы он отображал правильное представление. Вы можете использовать ту же карту маршрутов, но вам, вероятно, понадобится другой вызовRouter.run
. Как указывает Чарльз, вы можете использовать переписывание URL для этого. Другой вариант - использовать сервер node.js для обработки всех запросов и передачи значения пути в качестве аргумента location.В экспрессе, например, это может выглядеть так:
Обратите внимание, что путь запроса передается
run
. Для этого вам понадобится механизм просмотра на стороне сервера, в который вы можете передать обработанный HTML. Существует ряд других соображений,renderToString
касающихся использования и запуска React на сервере. Как только страница отображается на сервере, когда ваше приложение загружается в клиент, оно будет отображаться снова, обновляя отображаемый HTML на стороне сервера по мере необходимости.источник
В ваш index.html
head
добавьте следующее:Затем при работе с сервером webpack dev используйте эту команду.
--history-api-fallback
это важная частьисточник
/
тоHashRouter
он не будет работать (если вы используете хеш-маршрутизацию)Я использовал create-реагировать на приложение, чтобы сделать веб-сайт только что и тот же вопрос, представленный здесь. Я использую
BrowserRouting
изreact-router-dom
пакета. Я работаю на сервере Nginx, и я решил добавить следующее в/etc/nginx/yourconfig.conf
Что соответствует добавлению следующего
.htaccess
в, если вы используете AppacheЭто также, кажется, решение, предложенное самими Facebook и может быть найдено здесь
источник
Это может решить вашу проблему
Я также столкнулся с той же проблемой в приложении ReactJS в режиме производства. Вот 2 решения проблемы.
1. Измените историю маршрутизации на «hashHistory» вместо browserHistory вместо
Теперь создайте приложение с помощью команды
Затем поместите папку сборки в папку var / www /. Теперь приложение работает нормально с добавлением тега # в каждом URL. подобно
localhost / # / home localhost / # / aboutus
Решение 2. Без тега # с помощью browserHistory,
Установите вашу историю = {browserHistory} в вашем маршрутизаторе, теперь создайте ее с помощью sudo npm run build.
Вам нужно создать файл "conf" для решения страницы 404 not found, файл conf должен быть таким.
откройте свой терминал введите ниже команды
cd / etc / apache2 / sites-available ls nano sample.conf Добавьте в него приведенный ниже контент.
Теперь вам нужно включить файл sample.conf с помощью следующей команды
Затем он попросит перезагрузить сервер apache, используя sudo service apache2 reload или restart.
затем откройте папку localhost / build и добавьте файл .htaccess с содержанием ниже.
Теперь приложение работает нормально.
Примечание: измените 0.0.0.0 ip на ваш локальный IP-адрес.
Если есть сомнения по этому поводу, не стесняйтесь поднять комментарий.
Я надеюсь, что это полезно для других.
источник
"react-router-dom": "^5.1.2"
? Я использую<BrowserRouter>
Если вы используете приложение реагирования через AWS Static S3 Hosting и CloudFront
Эта проблема возникла из-за того, что CloudFront ответил сообщением 403 «Отказано в доступе», так как ожидалось, что / некоторый / другой / путь будет существовать в моей папке S3, но этот путь существует только внутри маршрутизации React с реакции-маршрутизатором.
Решением было настроить правило распространения страниц ошибок. Перейдите в настройки CloudFront и выберите свой дистрибутив. Далее перейдите на вкладку «Страницы ошибок». Нажмите «Создать пользовательский ответ об ошибке» и добавьте запись для 403, так как это код ошибки, который мы получаем. Установите Путь к странице ответа на /index.html и код состояния на 200. Конечный результат поражает своей простотой. Страница индекса обслуживается, но URL-адрес сохраняется в браузере, поэтому, как только приложение реакции загружается, оно обнаруживает путь URL-адреса и переходит к нужному маршруту.
Ошибка Страницы 403 Правило
источник
У сервера Webpack Dev есть возможность включить это. Откройте
package.json
и добавьте--history-api-fallback
. Это решение работало для меня.реагируют-маршрутизатор-учебник
источник
webpack-dev-server
но как мне это исправить для сборки?Если вы размещаете свое приложение реагирования в IIS, просто добавьте файл web.config, содержащий:
Это скажет серверу IIS возвращать главную страницу клиенту вместо ошибки 404, и нет необходимости использовать историю хешей.
источник
Добавьте это к
webpack.config.js
:источник
Производственный стек: React, React Router v4, BrowswerRouter, Express, Nginx
1) Пользователь BrowserRouter для красивых URL
2) Добавьте index.html ко всем неизвестным запросам, используя
/*
3) в комплекте с веб-пакетом
webpack -p
4) запустить
nodemon server.js
илиnode server.js
РЕДАКТИРОВАТЬ: Вы можете позволить nginx обрабатывать это в блоке сервера и игнорировать шаг 2:
источник
import path from 'path
илиconst path = require('path')
/*
) только что спас мой день. Спасибо! :)Если вы используете приложение Create React:
Тем не менее, эта проблема отлично подходит для решений для многих основных хостинговых платформ, которые вы можете найти ЗДЕСЬ на странице Create React App. Например, я использую React Router v4 и Netlify для своего кода внешнего интерфейса. Все, что нужно, это добавить 1 файл в мою общую папку ("_redirects") и одну строку кода в этом файле:
Теперь мой веб-сайт правильно отображает пути, такие как mysite.com/pricing, при входе в браузер или при обновлении.
источник
Попробуйте добавить файл «.htaccess» в общую папку с помощью приведенного ниже кода.
источник
Если у вас есть запасной вариант для вашего index.html, убедитесь, что в вашем файле index.html есть следующее:
Это может отличаться от проекта к проекту.
источник
head
: <base href = "/">Если вы используете firebase, все, что вам нужно сделать, это убедиться, что у вас есть свойство rewrites в файле firebase.json в корне вашего приложения (в разделе хостинга).
Например:
Надеюсь, что это сэкономит кому-то еще кучу разочарования и потраченного времени.
Удачного кодирования ...
Дальнейшее чтение по теме:
https://firebase.google.com/docs/hosting/full-config#rewrites
Firebase CLI: «Настроить как одностраничное приложение (переписать все URL в /index.html)»
источник
Я нашел решение для моего SPA с реагирующим маршрутизатором (Apache). Просто добавьте в .htaccess
источник: https://gist.github.com/alexsasharegan/173878f9d67055bfef63449fa7136042
источник
Я пока не использую рендеринг на стороне сервера, но столкнулся с той же проблемой, что и операционная система, в которой Link в большинстве случаев работал нормально, но не получался, когда у меня был параметр. Я запишу здесь свое решение, чтобы посмотреть, поможет ли оно кому-нибудь.
Мой основной JSX содержит это:
Это прекрасно работает для первой подходящей ссылки, но когда изменяется: id
<Link>
выражениях, вложенных в страницу сведений об этой модели, URL-адрес изменяется в панели браузера, но содержимое страницы изначально не изменялось, чтобы отражать связанную модель.Беда в том, что я использовал
props.params.id
для установки моделиcomponentDidMount
. Компонент монтируется только один раз, так что это означает, что первая модель - это та, которая прикрепляется на странице, а последующие ссылки изменяют реквизиты, но оставляют страницу неизменной.Установка модели в состояние компонента в обоих
componentDidMount
и вcomponentWillReceiveProps
(где это основано на следующих реквизитах) решает проблему, и содержимое страницы изменяется, чтобы отразить желаемую модель.источник
props
) iso,componentDidMount
если вы когда-нибудь захотите попробовать рендеринг на стороне сервера. Потому чтоcomponentDidMount
вызывается только в браузере. Его цель - делать с DOM такие вещи, как присоединение слушателей событий иbody
т. Д., С которыми вы не можете работатьrender
.Эта тема немного устарела и решаема, но я хотел бы предложить вам простое, ясное и лучшее решение. Это работает, если вы используете веб-сервер.
Каждый веб-сервер имеет возможность перенаправить пользователя на страницу ошибки в случае http 404. Для решения этой проблемы вам необходимо перенаправить пользователя на страницу индекса.
Если вы используете базовый сервер Java (tomcat или любой сервер приложений Java), решение может быть следующим:
web.xml:
Пример:
Вот и все, больше никаких магических потребностей :)
источник
const browserHistory = useRouterHistory(createHistory)({ basename: '/<appname>' });
Если вы используете Express или какой-либо другой фреймворк в бэкэнде, вы можете добавить аналогичную конфигурацию, как показано ниже, и проверить открытый путь Webpack в конфигурации, он должен работать нормально даже при перезагрузке, если вы используете BrowserRouter
источник
Исправление ошибки «невозможно получить / URL» при обновлении или при непосредственном вызове URL.
Сконфигурируйте ваш webpack.config.js так, чтобы он ожидал, что по данной ссылке будут проходить такие маршруты.
источник
Поскольку я использую .Net Core MVC, мне помогло нечто подобное:
В основном на стороне MVC все несоответствующие маршруты попадут в соответствие с
Home/Index
указанным вstartup.cs
. ВнутриIndex
можно получить исходный URL-адрес запроса и передать его, где это необходимо.источник
Если вы хостинг в IIS; Добавление этого в мой webconfig решило мою проблему
Вы можете сделать аналогичную конфигурацию для любого другого сервера
источник
В случае, если кто-нибудь здесь ищет решение для React JS SPA с Laravel. Принятый ответ - лучшее объяснение того, почему такие проблемы случаются. Как уже объяснялось, вы должны настроить как клиентскую, так и серверную сторону. В свой шаблон лезвия включите файл js в комплекте, убедитесь, что используете его
URL facade
такВ ваших маршрутах обязательно добавьте это к главной конечной точке, где находится шаблон блэйда. Например,
Выше приведен основной конечный пункт для шаблона лезвия. Теперь добавьте дополнительный маршрут,
Проблема, которая возникает, заключается в том, что сначала загружается шаблон блейда, а затем реагирующий маршрутизатор. Таким образом, когда вы загружаете
'/setting-alerts'
, он загружает HTML и JS. Но когда вы загружаете'/setting-alerts/about'
, он сначала загружается на стороне сервера. Поскольку на стороне сервера в этом месте ничего нет, возвращается не найдено. Когда у вас есть этот дополнительный маршрутизатор, он загружает ту же страницу, и загружается реагирующий маршрутизатор, а затем реагирующий загрузчик решает, какой компонент показать. Надеюсь это поможет.источник
/user/{userID}
, мне просто нужно вернуть универсальное представление/user
HTML, принести идентификатор и вызвать его, используя AJAX или axios. Возможно ли это сделать? они оптимизированы для SEO?Для тех, кто использует IIS 10, это то, что вы должны сделать, чтобы сделать это правильно. Убедитесь, что вы используете browserHistory с этим. Что касается справки, я дам код для маршрутизации, но это не имеет значения, важен следующий шаг после кода компонента ниже:
Поскольку проблема заключается в том, что IIS получает запрос от клиентских браузеров, он будет интерпретировать URL-адрес так, как если бы он запрашивал страницу, а затем возвращает страницу 404, поскольку страница недоступна. Сделайте следующее:
И теперь это будет работать нормально.
Я надеюсь, что это помогает. :-)
источник
Я использую WebPack, у меня была такая же проблема Решение => В вашем файле server.js
Почему мое приложение не обновляется после обновления?
источник
Использование
HashRouter
работало для меня с Redux также, просто замените:чтобы:
источник
У меня была такая же проблема, и это решение работало для нас ..
Фон:
Мы размещаем несколько приложений на одном сервере. Когда мы обновим сервер, он не поймет, где искать наш индекс в папке dist для этого конкретного приложения. Приведенная выше ссылка приведет вас к тому, что сработало для нас ... Надеюсь, это поможет, так как мы потратили немало часов, чтобы найти решение для наших нужд.
Мы используем:
мой webpack.config.js
мой index.js
мой app.js
источник
Мне нравится этот способ справиться с этим. Попробуйте добавить: yourSPAPageRoute / * на стороне сервера, чтобы избавиться от этой проблемы.
Я пошел с этим подходом, потому что даже собственный API истории HTML5 не поддерживает правильное перенаправление при обновлении страницы (насколько я знаю).
Примечание. В выбранном ответе это уже учтено, но я пытаюсь быть более конкретным.
Экспресс Маршрут
Протестировал и просто хотел этим поделиться.
Надеюсь, поможет.
источник