предисловие
Существует два типа режимов маршрутизации React:
hashHistory:
Напримерhttp://localhost:8080/#/login
browserHistory
Напримерhttp://localhost:8080/login
browserHistory
преимущества больше, чемhashHistory
, но беда в том,browserHistory
Режим маршрутизации требует настройки сервера:
проситьhttp://localhost:8080/loginКогда ресурсы находятся на сервере, сервер по умолчанию будет искать ресурсы в текущем каталоге.login
ресурсы в папке. ноlogIn
Этот каталог на самом деле не существует, часто при обновлении браузера он будет ==404Not fund==;
Поэтому вам нужно использовать nginx внутриtry_files
указатьfall back
ресурс;
1. Реагировать на конфигурацию маршрутизатора
import React from 'react';
import { Route, Switch, BrowserRouter as Router } from 'react-router-dom';
import App from '@pages/App';
function About(props) {
console.log('about', props);
return <div>page: about</div>;
}
// 路由配置
const routerConfig = [
{
path: '/',
component: App
},
{
path: '/about',
component: About
}
];
function AppRouter() {
return (
// 只有当你的应用部署到服务器的二级目录的时候,才需要设置basename
<Router basename="/react">
<Switch>
{routerConfig.map(n => {
return <Route path={n.path} exact component={n.component}></Route>;
})}
</Switch>
</Router>
);
}
export default AppRouter;
Я настроил дополнительный каталог на сервере здесьreact
В качестве каталога запроса, поэтому базовое имя здесь должно быть настроено как/react
. Вам не нужно устанавливать это, если ваши статические ресурсы уже находятся в корневом каталоге.
Запустите локальную службу:
Нажмите, чтобы перейти с домашней страницы в это времяabout
, вы можете увидеть путь этого режима маршрутизации;
На этом этапе, если вы обновите браузер, вам будет предложено, что он не может быть найденabout
содержание:
В это время вы можетеwebpack.config.js
Внутрь добавить:
devServer {
historyApiFallback: true
}
webpack
внутриhistoryApiFallback
используетconnect-history-api-fallback
:
Перезапустите локальную службу и снова обновите ее.
О подключении-истории-api-fallback
Одностраничные приложения (SPA) обычно имеют только один index.html, а переходы навигации основаны наHTML5 History API, когда пользователь получает прямой доступ к этому адресу за пределами страницы index.html или извлекает его с помощью кнопки обновления браузера, возникает ошибка 404;
например, прямой доступ
/login
,/login/online
, на этот раз через index.html, чтобы найти файл по этому адресу. Так как это одностраничное приложение, конечным результатом должен быть сбой поиска с ошибкой 404.Это промежуточное программное обеспечение используется для решения этой проблемы;
Пока выполняется одно из следующих четырех условий, промежуточное ПО изменит адрес запроса, чтобы он указывал на адрес по умолчанию.
index.html
:1
GET请求
2 Допустимый формат контента:
text/html
3 не является прямым запросом файла, например, путь не содержит
.
4 нет
options.rewrites
регулярные матчи в
2. конфигурация нгинкс
location /react {
alias /project/react/;
# browserHistory模式 404问题
try_files $uri $uri/ /react/index.html;
index index.html;
autoindex on;
gzip on;
add_header Access-Control-Allow-Origin '*';
add_header Access-Control-Allow-Methods 'GET, POST, PUT, OPTIONS';
add_header Access-Control-Expose-Headers 'Accept-Ranges, Content-Encoding, Content-Length, Content-Range';
}
autoindex on Включите это, и ввод /react направит вас к index.html;
Основное решение try_files заключается в том, что если index.html не может быть найден в некоторых каталогах, в конечном итоге будет гарантированный путь к ресурсу /react/index.html;
try_files $uri $uri/ /react/index.html;
Ввод браузера http://**:6002/react/about
Сначала будет искать http://**:6002/react/about, есть ли файл about.html, затем искать
/about/
Есть ли файл под существующим, если нет, то запустить/react/index.html
;
==try_files можно решить, добавив $uri/try_files
а такжеautoindex
Когда оба существуют, введите/react
Он не направляется автоматически наindex.html
проблема ==;