Search code examples
traefik

Traefik redirections


I'm trying to implement a basic redirection in Traefik's file provider. I would like the following:

http://example.com/foobar      ->  https://foobar.example.com
http://www.example.com/foobar  ->  https://foobar.example.com
https://example.com/foobar     ->  https://foobar.example.com
https://www.example.com/foobar ->  https://foobar.example.com

Here's my attempt:

http:
  middlewares:
    redirect-foobar:
      redirectRegex:
        permanent: true
        regex: "^https?://(www\\.)?example\\.com/foobar(/?.*)"
        replacement: "https://foobar.example.com${2}"
  routers:
    catch-foobar:
      middlewares:
        - redirect-foobar
      rule: Host(`example.com`) || Host(`www.example.com`)
      service: noop@internal

But when I try it out, here's what I get:

$ curl -I http://www.example.com/foobar 
HTTP/1.1 308 Permanent Redirect
Location: https://foobar.example.com
Date: Wed, 02 Mar 2022 02:12:48 GMT
Content-Length: 18
Content-Type: text/plain; charset=utf-8

# That's good =)
$ curl -I https://www.example.com/foobar
HTTP/2 404 
content-type: text/plain; charset=utf-8
x-content-type-options: nosniff
content-length: 19
date: Wed, 02 Mar 2022 02:05:22 GMT

# Does that mean the request didn't even make it to the catch-foobar router?

What am I doing wrong? Any help would be greatly appreciated.

Thanks,

C

edit: fixed the regex, but the https case is still problematic


Solution

  • The folks from the Traefik community forum helped me. It turned out the router did not have a tls configuration. The correct configuration looks like this:

    http:
      middlewares:
        redirect-foobar:
          redirectRegex:
            permanent: true
            regex: "^https?://(www\\.)?example\\.com/foobar(/?.*)"
            replacement: "https://foobar.example.com${2}"
      routers:
        catch-foobar:
          middlewares:
            - redirect-foobar
          rule: Host(`example.com`) || Host(`www.example.com`)
          service: noop@internal
          tls:  # here
            certResolver: default
    

    where default is a certificate resolver defined in my traefik.yml.