You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置Traefik实现URL前缀路由转发至Node-Express应用

Traefik反向代理Node-Express应用的路径转发配置问题

现有一个运行在Docker内部8080端口的Node-Express应用,代码如下:

var express = require('express');

var app = express();

app.get("/", function(req, res) {
    res.send(`
    <h1> Application written in  Node js</h1>
    <h3> Home page </h3>
    `)
});

app.get("/info", function(req, res) {
    res.send(`
    <h1> Application written in  Node js</h1>
    <h3> Info page </h3>
    `)
});

app.get("/api", function(req, res) {
  res.send({success: 1})
});

const PORT = process.env.NODE_DOCKER_PORT || 8080;
app.listen(PORT, () => {
  console.log(`Server is running on port ${PORT}.`);
});

需求是通过Traefik实现以下路径转发:

  • localhost/node 指向Node应用的/路由
  • localhost/node/info 指向Node应用的/info路由
  • localhost/node/api 指向Node应用的/api路由

当前使用的Traefik Docker Compose配置如下:

version: '3.1'

services:
  nodeapp:
    build: ./node_app
    container_name: nodeapp
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.node-server.rule=Host(`localhost`) && PathPrefix(`/app`)"
      - "traefik.http.services.node-server.loadbalancer.server.port=8080"
    networks:
      - proxy

  reverse-proxy:
    image: traefik:v2.10
    command: --api.insecure=true --providers.docker
    ports:
      - "80:80"
      - "8080:8080"
    volumes:
      # 让Traefik监听Docker事件
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - proxy


networks:
  proxy:

尝试过使用stripprefix.prefixes和stripprefixregex.regex中间件,但问题仍未解决,需要帮助。


解决方案

问题核心有两个:一是路由规则的前缀写错,二是未正确配置并绑定StripPrefix中间件。修改后的node服务标签配置如下,替换原nodeapp的labels部分即可:

labels:
  - "traefik.enable=true"
  # 匹配localhost下所有以/node开头的请求
  - "traefik.http.routers.node-server.rule=Host(`localhost`) && PathPrefix(`/node`)"
  # 定义StripPrefix中间件,移除请求路径中的/node前缀
  - "traefik.http.middlewares.strip-node-prefix.stripprefix.prefixes=/node"
  # 将中间件绑定到对应路由,@docker表示该中间件通过Docker标签定义
  - "traefik.http.routers.node-server.middlewares=strip-node-prefix@docker"
  - "traefik.http.services.node-server.loadbalancer.server.port=8080"

配置说明

  1. 修正路由规则:把原规则中的/app改为/node,匹配需求中的路径前缀
  2. 定义StripPrefix中间件:创建名为strip-node-prefix的中间件,作用是剥离请求URL里的/node前缀,让Node应用能识别剩余的路径
  3. 绑定中间件:将中间件关联到路由,确保请求转发前先执行前缀剥离操作

修改完成后重启Docker Compose:

docker-compose down && docker-compose up -d --build

此时访问:

  • localhost/node → 转发至Node应用的/路由
  • localhost/node/info → 转发至/info路由
  • localhost/node/api → 转发至/api路由

如果Node应用包含静态资源且存在路径问题,可在Express代码中添加app.set('trust proxy', true),让应用正确识别代理后的请求路径。


内容的提问来源于stack exchange,提问作者subhadip pahari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 20:40:39