React Router browserHistory работает не так, как ожидалось

В качестве пользователя я хочу получить доступ к контенту, перейдя по ссылке на глубокий URL

Положение

На главной странице у меня есть ссылка на страницу "about". нажав на изменения содержимого, как ожидалось. Страница загружается и URL изменяется на localhost: 8080/about.

Если я обновляю страницу, я получаю ошибку:

Невозможно GET/about

Интересно, это нормальное поведение или я что-то пропустил?

Маршруты

var React = require('react');
var ReactRouter = require('react-router');

var Router = ReactRouter.Router;
var Route = ReactRouter.Route;
var browserHistory = ReactRouter.browserHistory;
var Main = require('./components/Main');
var About = require('./components/About');

module.exports = (
  <Router history={browserHistory} >
    <Route path="/" component={Main}>
      <Route path="about" component={About}/>
    </Route>
  </Router>
)

Main:

var React = require('react');
var ReactRouter = require('react-router');
var Link = ReactRouter.Link;

module.exports = React.createClass({
  render: function() {
    return <div>
      <div>Header!!</div>
      {this.content()}
    </div>
  },
  content: function() {
    if(this.props.children) {
      return this.props.children
    } else {
      return (
        <div>
          <h1>Main</h1>
          <Link to={'about'}>To about</Link>
        </div>)
    }
  }
});

О:

var React = require('react');
module.exports = React.createClass({
  render: function() {
    return (<div>About</div>)
  }
});

И мой package.json

{
  "name": "react-starter",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "browserify": "^13.0.0",
    "gulp": "^3.9.0 ",
    "gulp-concat": "^2.6.0",
    "gulp-react": "^3.1.0",
    "gulp-sass": "^2.1.1",
    "gulp-server-livereload": "1.6.2",
    "gulp-util": "^3.0.7",
    "gulp-watch": "^4.3.5",
    "node-notifier": "^4.4.0",
    "react": "^0.14.6",
    "react-dom": "^0.14.6",
    "react-router": "^2.0.0-rc5",
    "reactify": "^1.1.1",
    "vinyl-source-stream": "^1.1.0",
    "watchify": "^3.7.0"
  },
  "devDependencies": {}
}

Ответ 1

При использовании browserHistory вы должны настроить свой сервер надлежащим образом для обслуживания на всех маршрутах. Подробнее см. этот.

Ответ 2

У меня была такая же проблема. Так как выше @taion ответ сказал, что нам нужно настроить экспресс-сервер, чтобы сделать горячую перезагрузку с URL-адресами в маршрутах.

Но если вы не хотите добавлять экспресс-сервер дополнительно для выполнения горячей перезагрузки, используйте это для запуска вашего проекта.

webpack-dev-server -d --history-api-fallback --hot --inline --progress --colors

Раньше я использовал именно это, для которого нужно настроить настроенный сервер

webpack-dev-server --hot --inline

ПРИМЕЧАНИЕ. Но я все же думаю, что вам нужно настроить nginx при развертывании. Вышеупомянутые команды, которые я сказал, предназначены только для целей развития. Поэтому не забудьте посмотреть этот, как сказал @taion.

Ответ 3

Если вы используете gulp -server-livereload, просто добавьте свойство fallback, указывающее на ваш индекс

gulp.src(['dist'])
  .pipe(livereload({
    livereload: true,
    defaultFile: 'index.html',
    fallback: 'index.html',
    log: 'debug'
  }))