我使用Traefik进行了非常简单的设置,使用Docker和Let's Encrypt将传入请求代理到API服务。
除了客户端由于CORS无法向API发出请求之外,其他所有程序都运行良好。
如何添加Origin,Content-Type和Authorization标头,以确保它们到达运行在代理后面的Node API,并确保Access-Control-Allow-Origin保留在响应标头中? strong>
我的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"
运行我的API的我的docker-compose.yml
:
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: *"
但这根本没有被附加到响应头中。
答案 0 :(得分:0)
我正在根据请求的来源有条件地在我的nodejs应用程序中解析CORS,以试图将主机名列入白名单,但是Traefik没有正确设置来源。我改用Traefik删除了条件主机和列入白名单的主机名。
完成此操作后,CORS可以正常工作,并且上面的标签都正确。
答案 1 :(得分:0)
入口点>路由器>中间件>服务
我认为您应该首先创建中间件,然后将其附加到特定的路由器: 通过将这些标签添加到服务中,我将标题添加到了响应中:
...
- "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"