使用路径前缀规则时如何用 Traefik 重写路径?

Posted

技术标签:

【中文标题】使用路径前缀规则时如何用 Traefik 重写路径?【英文标题】:How to rewrite paths with Traefik when using path prefix rules? 【发布时间】:2018-09-13 06:52:28 【问题描述】:

我的 WordPress Traefik 配置包含以下 docker-labels:

- "traefik.backend=wordpress"
- "traefik.docker.network=web"
- "traefik.frontend.rule=Host:MyHostName.net;PathPrefix:/blog"
- "traefik.enable=true"
- "traefik.port=80"

现在请求网址“https://MyHostName/blog”似乎到达了似乎返回重定向到“https://MyHostName/wp-admin...”的服务。

我不能使用子域。

我该如何解决这个问题?

更新 0

首先应该添加过滤器“PathPrefixStrip:/blog”以在将请求转发到服务时删除“/blog”前缀。对吗?

但是如何修改(例如)重定向请求以将前缀“/blog”添加到重定向 URL?

更新 1

https://github.com/containous/traefik/issues/985 我的问题已“讨论”,并且似乎已合并解决方案 (https://github.com/containous/traefik/pull/1442)。

简而言之:剥离的前缀将作为相应的标头添加(X-Forwarded-Prefix)。

我会检查并在这里写下结果。

其他资源:

Routing paths with Traefik Is there an equivalent to ReverseProxyPass for Apache in Traefik?

更新 2

现在我创建了一个如下所示的请求:

https://MYHOSTNAME/blog

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: de,en-US;q=0.7,en;q=0.3
Connection: keep-alive
Cookie: ocuvhr6ala6i=d2cd9020839889a752b4375a63dedad0; oc_sessionPassphrase=qJu13Q%2FlAoSsv5b0qC18Re%2BcrcML6o32c2XuDJEGViIMI4uERIf%2Bs77DvFbMSkEBkZs%2Bn%2FfnUjdB9APvk4zq2qlj6AiDXX2CGYf31MPVci8HkgcsXFcpL7cRLBbRGRWS; __Host-nc_sameSiteCookielax=true; __Host-nc_sameSiteCookiestrict=true
Host: MYHOSTNAME
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:59.0) Gecko/20100101 Firefox/59.0

“PathPrefixStrip”似乎在 CLIENT>>SERVICE 的方向上工作。这是我的 traefik 日志包含的内容:

traefik    | time="2018-04-04T18:12:54Z" level=debug msg="vulcand/oxy/roundrobin/rr: competed ServeHttp on request" Request="

   "Method":"GET",
   "URL":
      "Scheme":"",
      "Opaque":"",
      "User":null,
      "Host":"",
      "Path":"/",
      "RawPath":"",
      "ForceQuery":false,
      "RawQuery":"",
      "Fragment":""
   ,
   "Proto":"HTTP/2.0",
   "ProtoMajor":2,
   "ProtoMinor":0,
   "Header":
      "Accept":[
         "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
      ],
      "Accept-Encoding":[
         "gzip, deflate, br"
      ],
      "Accept-Language":[
         "de,en-US;q=0.7,en;q=0.3"
      ],
      "Cookie":[
         "ocuvhr6ala6i=d2cd9020839889a752b4375a63dedad0; oc_sessionPassphrase=qJu13Q%2FlAoSsv5b0qC18Re%2BcrcML6o32c2XuDJEGViIMI4uERIf%2Bs77DvFbMSkEBkZs%2Bn%2FfnUjdB9APvk4zq2qlj6AiDXX2CGYf31MPVci8HkgcsXFcpL7cRLBbRGRWS; __Host-nc_sameSiteCookielax=true; __Host-nc_sameSiteCookiestrict=true"
      ],
      "Upgrade-Insecure-Requests":[
         "1"
      ],
      "User-Agent":[
         "Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:59.0) Gecko/20100101 Firefox/59.0"
      ],
      "X-Forwarded-Prefix":[
         "/blog"
      ]
   ,
   "ContentLength":0,
   "TransferEncoding":null,
   "Host":"MYHOSTNAME",
   "Form":null,
   "PostForm":null,
   "MultipartForm":null,
   "Trailer":null,
   "RemoteAddr":"81.128.35.176:33468",
   "RequestURI":"/",
   "TLS":null

"

但重定向答案在我的浏览器中如下所示:

HTTP/2.0 302 Found
cache-control: no-cache, must-revalidate, max-age=0
content-length: 0
content-type: text/html; charset=UTF-8
date: Wed, 04 Apr 2018 18:44:18 GMT
expires: Wed, 11 Jan 1984 05:00:00 GMT
location: https://MYHOSTNAME/wp-admin/install.php
server: Apache/2.4.25 (Debian)
X-Firefox-Spdy: h2
x-powered-by: PHP/7.2.2

因此,redirect-response 不包含任何关于剥离路径前缀“/blog”的信息。

更新 3

最后看起来像是容器内的服务软件不处理标头的问题。

其他资源:

Wordpress & nginx with Docker: Static files not loaded

有什么想法吗?

【问题讨论】:

【参考方案1】:

也许您应该在 PathPrefixStrip: / blog 规则中添加所有可能的值,例如。

PathPrefixStrip: /blog,/wp-admin,/abc,/xyz

在许多情况下,它适用于标准路线。最大的问题是当您的后端服务不侦听根 / 中的请求,而是在某些子目录 /something/index.html 中侦听请求时,并且该子目录从根 / 获取资源。

【讨论】:

如果您安装了一个 wordpress,则此方法有效。 /wp-admin 与第二个实例发生冲突 :) - 抱歉...为了让 wordpress 运行,我必须做更多;在wordpress配置里面;非常糟糕的事情。

以上是关于使用路径前缀规则时如何用 Traefik 重写路径?的主要内容,如果未能解决你的问题,请参考以下文章

Kubernetes入口中基于Traefik路径的路由无法按预期工作

如何根据url的写入规则重写图片路径?

Zuul路由转发规则

在 IIS 重写规则中排除路径?

Nginx重写

nginx配置url重写