我正在尝试在Docker的Apache Traefik反向代理后面运行Apache。一切正常,除了当我访问不带斜杠的文件夹URL时,Apache将我重定向到非https(即https://www.example.com/folder-> http://www.example.com/folder/)。如here和here所述,这是由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- *标头。这是我得到的标题的屏幕截图:
这是我在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中使用该标头)?如何获得它?
答案 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变量在服务器上查看它们:
2)重定向不起作用(解决DirectorySlash问题)的原因是,除了上面列出的RewriteRules之外,您的htaccess还必须包括 RewriteOptions AllowNoSlash 。从Apache documentation:
默认情况下,mod_rewrite将忽略映射到磁盘上的目录但没有尾部斜杠的URL,以期望mod_dir模块将向客户端发出带有尾部斜杠的对规范URL的重定向。可以启用AllowNoSlash选项,以确保不再忽略重写规则。如果需要,可以使用此选项在与目录匹配的.htaccess文件中应用重写规则,而不用斜杠。