You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

OpenShift路由配置路径后子路由失效问题求助

解决OpenShift带路径路由下Node.js API子路由失效的问题

我之前在OpenShift上部署Node.js应用时也碰到过完全一样的问题——根路径路由正常,加了路径前缀后所有子请求都跳回欢迎页,折腾了好一会儿才搞定,给你几个靠谱的解决方案:

方案1:调整Node.js应用适配子路径运行

这是最根本的解决方式,让应用知道自己运行在/app/这样的子路径下,而不是默认的根路径。以Express.js为例:

方式A:硬编码挂载路由前缀

把所有API路由挂载到和OpenShift路由一致的路径下:

const express = require('express');
const app = express();
const apiRouter = express.Router();

// 定义你的API路由
apiRouter.get('/request/something', (req, res) => {
  res.json({ message: 'API响应正常' });
});

// 把路由挂载到/app前缀(和OpenShift路由的path匹配)
app.use('/app', apiRouter);

app.listen(process.env.PORT || 3000);

方式B:用环境变量动态适配

为了更灵活(比如不同环境用不同前缀),可以通过OpenShift的环境变量传递前缀:

const express = require('express');
const app = express();
const apiRouter = express.Router();

// 从环境变量获取前缀,默认用根路径
const basePath = process.env.APP_BASE_PATH || '/';

apiRouter.get('/request/something', (req, res) => {
  res.json({ message: 'API响应正常' });
});

// 动态挂载前缀
app.use(basePath, apiRouter);

app.listen(process.env.PORT || 3000);

然后在OpenShift的Deployment里设置环境变量:

oc set env deployment/my-app APP_BASE_PATH=/app/

方式C:利用OpenShift的X-Forwarded-Prefix头

OpenShift路由会自动在请求头里带上X-Forwarded-Prefix,值就是你设置的路由路径(比如/app/),可以用中间件让应用自动适配:

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

// 中间件处理前缀
app.use((req, res, next) => {
  const prefix = req.headers['x-forwarded-prefix'] || '/';
  // 把前缀设为baseUrl,后续路由会自动适配
  req.baseUrl = prefix;
  next();
});

// 正常定义路由即可,不需要加前缀
app.get('/request/something', (req, res) => {
  res.json({ message: 'API响应正常' });
});

app.listen(process.env.PORT || 3000);

方案2:配置OpenShift路由重写路径

如果不想修改应用代码,可以通过OpenShift路由的HAProxy注解,让路由自动去掉路径前缀后转发给应用:

创建路由时添加注解

oc create route edge my-app-route \
  --service=my-app-service \
  --hostname=www.host.com \
  --path=/app/ \
  --annotation=haproxy.router.openshift.io/rewrite-target=/

给现有路由添加注解

oc annotate route my-app-route haproxy.router.openshift.io/rewrite-target=/

这个注解会让HAProxy把/app/request/something这样的请求,转发成/request/something给应用,应用就像在根路径下运行一样,不需要任何修改。

⚠️ 注意:如果应用有静态资源(比如CSS、JS、图片),且资源路径是绝对路径(比如/static/style.css),那么访问时会变成www.host.com/static/style.css,而不是www.host.com/app/static/style.css,导致404。解决这个的办法:

  • 把静态资源路径改成相对路径(比如./static/style.css
  • 或者在应用里给静态资源加上前缀(比如app.use('/app/static', express.static('public'))

方案3:检查路由路径的匹配规则

确保你的OpenShift路由路径设置正确:

  • 路由的path最好设为/app(不带末尾斜杠),这样/app/app/都会匹配
  • 如果必须带末尾斜杠,访问时要确保URL里包含斜杠(比如www.host.com/app/request/something,而不是www.host.com/apprequest/something

内容的提问来源于stack exchange,提问作者relief.melone

火山引擎 最新活动