如何使用 nginx/cherrypy 和我当前的 reactjs 应用程序配置 react-router

How can I configure react-router to with nginx/cherrypy and my current reactjs app

我有一个由 nginx 提供的工作网络应用程序,后端使用 cherrypy,前端使用 ReactJS。

应用程序越来越大,所以我想使用 react-router 来提供对带有 URL 的页面的快速访问。 例如,我希望 my.domain.name/user 将在我的应用程序中获得管理用户的部分。

我的单曲 index.html 包含这样的 js 包: <script src="/js/bundle.js"></script>

直到现在,我的应用程序都是通过渲染 AppMain 开始的。 现在,我创建了一个 NoMatch class 并将它们都放入了一个反应路由器中,如下所示:

ReactDOM.render((
    <Router history={browserHistory}>
        <Route path="/" component={AppMain}>
            <Route path="*" component={NoMatch}/>
        </Route>
    </Router>
), document.getElementById('main-central'));

尝试这个时效果很好。使用 http://my.domain.name 给了我以前的应用程序。 但实际上,现在尝试 http://my.domain.name/whatever 应该会渲染 NoMatch 正在渲染的内容。但是我得到的是 nginx 404 页面。

所以我认为需要 nginx 端配置,但可能不仅如此(这就是为什么我把整个故事都放在上面)。

Nginx 配置(http 部分)如下所示:

upstream app_servers {
    server 127.0.0.1:9988;
}

# Configuration for Nginx
server {

    location / {
        root /var/www;
        index index.html;
    }

    # Proxy connections to the application servers
    # app_servers
    location /api {
        proxy_pass         http://app_servers/api;
        proxy_redirect     off;
        proxy_set_header   Host $host;
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Host $server_name;
    }
}

如您所见,cherrypy 正在获取所有 /api/* 路径。

我在 /css、/img 等目录下有静态内容,我希望得到正确的服务。

所以我需要一切不是静态的,也不是 /api 去 js/bundle.js

如何在 nginx 中配置它? 我是否需要在 cherrypy 或 javascript 中做一些不同的事情?

提前致谢。

找到我自己的答案...这是:

基本上 nginx 配置需要将 URL 重定向到 /index.html(当然不是我的 bundle.js)

在 nginx conf 中添加 try_files 可以解决这个问题:

location / {
    root /var/www;
    index index.html;

    try_files $uri $uri/ /index.html;
}

另外我修改了路由器的主界面:

ReactDOM.render(
    (<Router history={browserHistory}>
        <Route path="/" component={AppMainNewNav}>
            <Route path="users" component={UsersPage}/>
            <Route path="about" component={About}/>
        </Route>
        <Route path="*" component={NoMatch}/>
    </Router>)
    , document.getElementById('navbar'));

在 AppMainNewNav render() 中,我将导航修改为如下内容:

<nav>
    <ul role="nav">
        <li><Link to="/videos">Videos</Link></li>
        <li><Link to="/about">About</Link></li>
    </ul>
</nav>