Traefik(Docker)是否未设置X-Forwarded- *标头?

时间:2019-04-14 20:13:36

标签: docker docker-compose http-headers reverse-proxy traefik

我正在尝试在Docker的Apache Traefik反向代理后面运行Apache。一切正常,除了当我访问不带斜杠的文件夹URL时,Apache将我重定向到非https(即https://www.example.com/folder-> http://www.example.com/folder/)。如herehere所述,这是由Apache mod_dir DirectorySlash引起的。解决方案是使用重写规则,该规则在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- *标头。这是我得到的标题的屏幕截图: enter image description here

这是我在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- *标头似乎总是丢失。例如(refref):

- "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中使用该标头)?如何获得它?

2 个答案:

答案 0 :(得分:0)

您尝试过

traefik.frontend.passHostHeader: true

如果可能,我建议让traefik对http到https重定向进行排序:

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

    [entryPoints.https]
    address = ":443"
      [entryPoints.https.tls]

答案 1 :(得分:0)

对于任何发现并想知道的人,我的问题是双重的:

1)X-Forwarded- *标头在浏览器中不可见。您可以使用phpinfo()或转储$ _SERVER变量在服务器上查看它们:

http://take.ms/cbhtM

2)重定向不起作用(解决DirectorySlash问题)的原因是,除了上面列出的RewriteRules之外,您的htaccess还必须包括 RewriteOptions AllowNoSlash 。从Apache documentation

  

默认情况下,mod_rewrite将忽略映射到磁盘上的目录但没有尾部斜杠的URL,以期望mod_dir模块将向客户端发出带有尾部斜杠的对规范URL的重定向。可以启用AllowNoSlash选项,以确保不再忽略重写规则。如果需要,可以使用此选项在与目录匹配的.htaccess文件中应用重写规则,而不用斜杠。