【问题标题】:Why is the react router redirecting all requests on nginx server?为什么反应路由器重定向 nginx 服务器上的所有请求?
【发布时间】:2018-10-19 17:47:12
【问题描述】:

我在 nginx 服务器上的 / 下部署了一个 react 应用程序。我在/old 下部署了一个旧的 Django 应用程序。

如果我打开一个新的浏览器窗口并直接访问/old,我可以毫无问题地访问 Django 应用程序。如果我第一次打开反应应用程序,所有以下对/old 的请求都会重定向到反应应用程序。这只能通过关闭浏览器窗口来清除(选项卡是不够的)。

反应路由器:

function render(location) {
  Router.resolve(routes, location)
    .then(renderComponent)
    .catch((error) => {
        console.log(error);
    });
}

Nginx 配置:

location /old {
    proxy_redirect off;
    uwsgi_pass unix:///var/run/uwsgi.sock;
    uwsgi_intercept_errors on;
}

location / {
    root /var/www;
    try_files $uri /index.html;
}

免责声明:我不是 react 应用的开发者,对此知之甚少。我很确定我的 nginx 配置是正确的。相反,我认为这是由于一些重定向缓存/浏览器 foo react 正在做的,但我不知道如何阻止它。

有什么帮助吗?

【问题讨论】:

  • 我注意到:注释掉对registerServiceWorker(); 的调用,一切正常。不幸的是,我不知道为什么。

标签: reactjs nginx


【解决方案1】:

React 应用程序有一个客户端路由器,它拦截页面点击,而不是向服务器发出 HTTP GET 请求,而是向浏览器路由器发出请求。

这可以解释为什么通过干净的浏览器会话,您可以访问预期的/old Django 应用程序,因为初始的GET 请求必须始终路由到服务器。

在这些情况下,尚未加载 React 应用程序,因此无法使用客户端路由器。但是,当你访问/ 路由,并且 React 被加载时,客户端路由器会踢它,并拦截所有后续请求。

理论上,您可以通过将/old 等一些路由列入白名单来解决此问题,而不是将这些路由传递给路由器,浏览器只需执行类似window.location = https://yoursite.com/old 的操作。

【讨论】:

  • 很好的建议,谢谢。我们正在考虑采用这种方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多