4

With making reverse proxy on Docker and Traefik, I want to dispatch several paths on the same host into two different backend servers like these,

1. traefik.test/            ->   app1/
2. traefik.test/post/blabla ->   app1/post/blabla
3. traefik.test/user/blabla ->   app2/user/blabla

If the rules are only #2 and #3, I could do like this in docker-compose.yml

app1:
  image: akky/app1
  labels:
    - "traefik.backend=app1"
    - "traefik.frontend.rule=Host:traefik.test;PathPrefix:/post,/comment"

app2:
  image: akky/app2
  labels:
    - "traefik.backend=app2"
    - "traefik.frontend.rule=Host:traefik.test;PathPrefix:/user,/group"

However, adding the root '/' into the first PathPrefix seems to cloak /user on app2. The following does not work, and everything goes to app1 backend.

    - "traefik.frontend.rule=Host:traefik.test;PathPrefix:/,/post,/group"

The rules "Host:" and "PathPrefix" seems working as 'AND', but I wanted to use 'OR' ( exact /, OR starting with /post ). I searched and came to know that multiple rules can be directed since version 1.3.0, according to pull request #1257 by making multiple lines with adding service names.

By knowing that, what I did is like this,

app1:
  image: akky/app1
  labels:
    - "traefik.app1_subfolder.backend=app1"
    - "traefik.app1_subfolder.frontend.rule=Host:traefik.test;PathPrefix:/post,/group"
    - "traefik.app1_rootfolder.backend=app1"
    - "traefik.app1_rootfolder.frontend.rule=Host:traefik.test;Path:/"

app2:
  image: akky/app2
  labels:
    - "traefik.backend=app2"
    - "traefik.frontend.rule=Host:traefik.test;PathPrefix:/user"

Now it works as required, the root access is dispatched to app1/ .

My question is, is this the proper way? It does not look like so for me, as this root and subfolder dispatch should be a typical use case.

akky
  • 2,818
  • 21
  • 31

1 Answers1

1

You might consider adding priority labels so the app2 rules take precedence over app1 rules. Then you should be able to simplify the app1 config.

app1:
  image: akky/app1
  labels:
    - "traefik.backend=app1"
    - "traefik.frontend.priority=10"
    - "traefik.frontend.rule=Host:traefik.test;PathPrefix:/,/post,/group"

app2:
  image: akky/app2
  labels:
    - "traefik.backend=app2"
    - "traefik.frontend.priority=50"
    - "traefik.frontend.rule=Host:traefik.test;PathPrefix:/user"

Update: I had the priorities in the wrong order. Larger priority values take precedence over smaller priority values. According to the docs, it's based on (priority + rule length), and the larger value wins.

Mike Henry
  • 2,401
  • 1
  • 25
  • 34