【发布时间】:2019-04-14 20:13:35
【问题描述】:
我正在尝试在 Docker 中运行 Apache,在 https 的 Traefik 反向代理之后。一切正常,除了当我访问没有尾部斜杠的文件夹 URL 时,Apache 将我重定向到非 https(即https://www.example.com/folder -> http://www.example.com/folder/)。这是由 Apache mod_dir DirectorySlash 引起的,如 here 和 here 所述。解决方案是使用重写规则,该规则在 DirectorySlash 之前启动,如下所示:
# Redirect to HTTPS before Apache mod_dir DirectorySlash redirect to HTTP
RewriteCond %{HTTP:X-Forwarded-Proto} =https
RewriteCond %{LA-U:REQUEST_FILENAME} -d
RewriteRule ^/(.*[^/])$ https://%{HTTP_HOST}/$1/ [R=301,L,QSA]
但是,问题是 Traefik 似乎没有设置 X-Forwarded-* 标头。这是我得到的标题的屏幕截图:
这是我在 Apache docker-compose 文件中使用的标签:
labels:
- traefik.enable=true
- traefik.port=80
- traefik.frontend.rule=PathPrefix:/web #Apache is accessible under https://example.com/web/
我尝试了各种标签组合,但无论我做什么,x-forwarded-* 标头似乎总是丢失。例如(ref、ref):
- "traefik.frontend.headers.SSLProxyHeaders=X-Forwarded-Proto:https"
- "traefik.frontend.headers.SSLRedirect=true"
我什至尝试让 Traefik 添加我自己的自定义标头,但无法显示它们 (ref):
- "traefik.https.middlewares.testHeader.Headers.CustomRequestHeaders.X-Script-Name=test"
...但是,只是为了说服自己我没有发疯,而这个是实际上在 Traefik 后面运行,并且 Traefik 可以添加我可以看到的标题,这确实有效并导致 X-Frame-Options 标头出现在 Firefox 中:
- traefik.frontend.headers.frameDeny=true
总而言之,问题是:为什么 Traefik 不设置 x-forwarded-* 标头(然后我可以在我的 Apache RewriteRules 中使用它) - 我怎样才能让它这样做?
【问题讨论】:
标签: docker docker-compose http-headers reverse-proxy traefik