使用 Apache 反向代理的 React-router url 不匹配

Posted

技术标签:

【中文标题】使用 Apache 反向代理的 React-router url 不匹配【英文标题】:React-router urls don't match using Apache reverse proxy 【发布时间】:2016-09-22 03:37:35 【问题描述】:

我正在尝试在 Apache 中设置反向代理来提供 React/Redux/webpack 包。我有一个 Express 服务器文件为我的静态文件和 index.html 提供服务,如下所示:

const express = require('express');
const path = require('path');

const app = express();
const port = process.env.PORT || 3000;

app.use(express.static('./dist'));
app.get('/', (req, res) => 
  res.sendFile(path.join(__dirname, 'dist', 'index.html'));
);

app.listen(port, () => 
  console.log(`Server running on port $port`);
);

我的 apache 配置如下所示:

<VirtualHost *:80>
  ProxyRequests off
  ProxyPass "/foo/" "http://localhost:8777/"
  ProxyPassReverse "/foo/" "http://localhost:8777/"
</VirtualHost>

现在,当导航到 example.com/foo 时,我的 index.html 和 webpack 包已正确提供,但 React 路由器抛出一个错误,指出 /foo/ 不匹配任何路由。显然,这是因为 /foo 是该应用程序的代理位置,而 React 路由器不需要(也不应该)考虑生产中使用的代理路径。

如何设置 Apache,以便当请求发送到 localhost:8777 时,/foo 路径不会被 apache 传递?换句话说,您如何设置 proxypass 以便对 example.com/foo/bar 的请求在服务器上转换为对 localhost:8777/bar 的请求,然后像来自 example.com/foo/bar 一样返回给客户端?

【问题讨论】:

我也遇到了同样的问题。想知道你是否找到了一个好的解决方案,tayden? @MattSidor 我从来没有这样做过。我最终更改了我的反应路由器 URL 以包含代理位置,以便页面按预期呈现。我仍然很乐意找到更好的解决方案 这能解决您的问题吗? https://***.com/questions/45570841/proxy-react-server-behind-apache/48964874#48964874 【参考方案1】:

改变 nginx 服务器更灵活和简单的配置

server  
  listen 80 default_server;
  listen [::]:80 default_server;
  root /usr/share/nginx/html/web;
  location / 
  try_files $uri /index.html;


【讨论】:

【参考方案2】:

我的团队遇到了类似的问题,他们解决的方法是使用带有强制重定向 [R] 的 RewriteRule,然后让 Apache 代理通过。所以也许你可以试试看:

<VirtualHost *:80> ProxyRequests off RewriteRule ^/foo/bar/& /bar/ [R] ProxyPass "/bar/" "http://localhost:8777/" ProxyPassReverse "/bar/" "http://localhost:8777/" </VirtualHost>

我不是 Apache 配置方面的专家,因此您可能需要自己尝试一下 RewriteRule (https://httpd.apache.org/docs/2.4/mod/mod_rewrite.html#rewriterule)。但是,我相信以上内容可能只是您部分问题的答案:

如何设置 proxypass,以便将对 example.com/foo/bar 的请求转换为对服务器上 localhost:8777/bar 的请求

但我不太确定,抱歉:

然后就好像来自example.com/foo/bar一样返回给客户端?

希望对你有所帮助。

【讨论】:

以上是关于使用 Apache 反向代理的 React-router url 不匹配的主要内容,如果未能解决你的问题,请参考以下文章

apache与tomcat 反向代理

怎么配置反向代理 apache

使用 nginx 作为反向代理运行 Apache Zeppelin

特定子域的 Apache 反向代理

使用和不使用 SSL 的 Apache 反向代理之间行为不同的原因

宝塔 apache 反向代理配置wss服务