【问题标题】:Add Authorization & Origin headers to traefik reverse proxy将 Authorization & Origin 标头添加到 traefik 反向代理
【发布时间】:2019-01-25 07:28:33
【问题描述】:

我有一个非常简单的设置,使用 Traefik 使用 Docker & Let's Encrypt 将传入请求代理到 API 服务。

除了客户端因 CORS 无法向 API 发出请求外,一切都正常运行。

如何添加 Origin、Content-Type 和 Authorization 标头,以便确保它们到达在代理后面运行的 Node API 并确保 Access-Control-Allow-Origin 保留在响应标头中?强>

我的 traefik.toml 文件:

        debug = false

        logLevel = "ERROR"
        defaultEntryPoints = ["https","http"]

        [entryPoints]
        [entryPoints.http]
        address = ":80"
            [entryPoints.http.redirect]
            entryPoint = "https"
        [entryPoints.https]
        address = ":443"
        [entryPoints.https.tls]

        [retry]

        [docker]
        endpoint = "unix:///var/run/docker.sock"
        domain = "<hostname-here>"
        watch = true
        exposedByDefault = false

        [acme]
        email = "<your-email-here>"
        storage = "acme.json"
        entryPoint = "https"
        onHostRule = true
        [acme.httpChallenge]
        entryPoint = "http"

我的docker-compose.yml 运行我的 API:

version: "2"
services:

  app: 
    build:
      context: .
      dockerfile: Dockerfile-App
    environment:
      - NODE_ENV=${NODE_ENV}
    restart: always
    networks:
      - web
      - default
    expose:
      - "5000"
    labels:
      - "traefik.docker.network=web"
      - "traefik.enable=true"
      - "traefik.basic.frontend.rule=Host:${HOSTNAME}"
      - "traefik.frontend.auth.forward.trustForwardHeader=true"
      - "traefik.frontend.passHostHeader=true"
      - "traefik.basic.port=5000"
      - "traefik.basic.protocol=http"

networks:
  web:
    external: true

文档暗示您可以添加 customHeaders

traefik.frontend.headers.customResponseHeaders=EXPR 在将响应转发到客户端之前,将标头附加到容器返回的每个响应中。 格式:HEADER:value||HEADER2:value2

但是我应该如何知道动态值(例如授权令牌)的值?

编辑:

我尝试添加这样的自定义标题:

- "traefik.frontend.headers.customResponseHeaders=Access-Control-Allow-Origin: *"

但这根本没有附加到响应标头中。

【问题讨论】:

    标签: docker-compose traefik


    【解决方案1】:

    入口点 > 路由器 > 中间件 > 服务

    我认为您应该先创建中间件,然后将其附加到特定的路由器: 通过将这些标签添加到我的服务中,我将标头添加到响应中:

            ...
            - "traefik.http.routers.frontend.entrypoints=http"
    #creating middleware for headers
            - "traefik.http.middlewares.frontend.headers.customresponseheaders.Access-Control-Allow-Methods=POST, GET, PUT, OPTIONS, DELETE"
            - "traefik.http.middlewares.frontend.headers.customresponseheaders.Access-Control-Allow-Origin=*"
            - "traefik.http.middlewares.frontend.headers.customresponseheaders.Access-Control-Allow-Headers=x-requested-with, Content-Type,Authorization"
    #attach middleware to the frontend router
            - "traefik.http.routers.frontend.middlewares=frontend"
    

    【讨论】:

      【解决方案2】:

      我在我的 nodejs 应用程序中根据请求的来源有条件地解析 CORS,以便将主机名列入白名单,但 Traefik 没有正确设置来源。我用 Traefik 删除了条件和白名单主机名。

      执行此操作后,CORS 可以正常工作,并且我上面的标签是正确的。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-14
      • 1970-01-01
      • 1970-01-01
      • 2013-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多