Search code examples
traefik

Cannot access Portainer when trailing "/" is missing. Is it possible to get the same behavion as Nginx proxy_pass?


I'm trying to setup Traefik to replace my Nginx reverse proxy setup. I have my domain setup like this: - I can access different services using http://example.com and detecting which service I should proxy to, by using subpath.

Nginx config of reverse proxy

I tried to recreate same setup with Traefik. First by using ReplacePathRegex and then StripPrefix. My api requests work fine, but when I try to use Portainer, requests made from web browser omit /portainer part which causes web ui to break.

For example: I make request to http://example.com/portainer. I get response and then consecutive requests should be made like this: http://example.com/portainer/vendor1.css and instead it makes request like this: http://example.com/vendor1.css

Is there any way to setup Traefik behavior to exactly match Nginx proxy_pass?

I found this post that gives me a partial solution: Is there an equivalent to ReverseProxyPass for Apache in Traefik?. Portainer seems to be working when I make request to http://example.com/portainer/ by adding "/" to the end. I tried to fix it with forceSlash, but it did not make any change

Current setup for Portainer with Traefik

Is it possible to make it work with or without trailing "/"?

This is how requests look like in /portainer and /portainer/: /portainer request

/portainer/ request

This is my current Traefik configuration (I'm only using Docker): Traefik configuration


Solution

  • I found a solution: https://community.containo.us/t/middleware-to-add-the-if-needed/1895

    This is what I had to add to labels in my portainer container to make it work:

    - traefik.http.middlewares.strip-prefix.chain.middlewares=strip-prefix-1,strip-prefix-2
    - traefik.http.middlewares.strip-prefix-1.redirectregex.regex=^(https?://[^/]+/[a-z0-9_]+)$$
    - traefik.http.middlewares.strip-prefix-1.redirectregex.replacement=$${1}/
    - traefik.http.middlewares.strip-prefix-1.redirectregex.permanent=true
    - traefik.http.middlewares.strip-prefix-2.stripprefixregex.regex=/[a-z0-9_]+
    

    It is not ideal solution as I think there should be an easier way to achieve it, but for the time being it satisfies my needs.