traefik/docs/content/routing/routers.md
Gérald Croës ac6b11037d Documentation Revamp
Co-authored-by: jbdoumenjou <jb.doumenjou@gmail.com>
2019-02-26 14:50:07 +01:00

5.7 KiB

Routers

Connecting Requests to Services {: .subtitle }

Routers

A router is in charge of connecting incoming requests to the services that can handle them. In the process, routers may use pieces of middleware to update the request, or act before forwarding the request to the service.

Configuration Example

??? example "Requests /foo are Handled by service-foo -- Using the File Provider"

```toml
  [Routers]
    [Routers.my-router]
    rule = "Path(/foo)"
    service = "service-foo"
```

??? example "With a Middleware -- using the File Provider"

```toml
  [Routers]
    [Routers.my-router]
    rule = "Path(/foo)"
    middlewares = ["authentication"] # declared elsewhere
    service = "service-foo"
```

Configuration

EntryPoints

If not specified, routers will accept requests from all defined entrypoints. If you want to limit the router scope to a set of entrypoint, set the entrypoints option.

??? example "Listens to Every EntryPoint"

```toml
[EntryPoints]
   [EntryPoint.http]
      # ...
   [EntryPoint.https]
      # ...   
   [EntryPoint.other]
      # ...
      
[Routers]
   [Routers.Router-1]
      # By default, routers listen to every entrypoints
      rule = "Host(traefik.io)"
      service = "service-1"      
```

??? example "Listens to Specific EntryPoints"

```toml
[EntryPoints]
   [EntryPoint.http]
      # ...
   [EntryPoint.https]
      # ...   
   [EntryPoint.other]
      # ...
      
[Routers]
   [Routers.Router-1]
      entryPoints = ["https", "other"] # won't listen to entrypoint http
      rule = "Host(traefik.io)"
      service = "service-1"      
```

Rule

Rules are a set of matchers that determine if a particular request matches specific criteria. If the rule is verified, then the router becomes active and calls middlewares, then forward the request to the service.

??? example "Host is traefik.io"

```
   rule = "Host(`traefik.io`)" 
```

??? example "Host is traefik.io OR Host is containo.us AND path is /traefik"

```
   rule = "Host(`traefik.io`) || (Host(`containo.us`) && Path(`/traefik`))"
```

The table below lists all the available matchers:

Rule Description
Headers(`key`, `value`) Check if there is a key keydefined in the headers, with the value value
HeadersRegexp(`key`, `regexp`) Check if there is a key keydefined in the headers, with a value that matches the regular expression regexp
Host(`domain-1`, ...) Check if the request domain targets one of the given domains.
HostRegexp(`traefik.io`, `{subdomain:[a-z]+}.traefik.io`, ...) Check if the request domain matches the given regexp.
Method(methods, ...) Check if the request method is one of the given methods (GET, POST, PUT, DELETE, PATCH)
Path(`path`, `/articles/{category}/{id:[0-9]+}`, ...) Match exact request path. It accepts a sequence of literal and regular expression paths.
PathPrefix(`/products/`, `/articles/{category}/{id:[0-9]+}`) Match request prefix path. It accepts a sequence of literal and regular expression prefix paths.
Query(`foo=bar`, `bar=baz`) Match` Query String parameters. It accepts a sequence of key=value pairs.

!!! important "Regexp Syntax"

In order to use regular expressions with `Host` and `Path` expressions,
you must declare an arbitrarily named variable followed by the colon-separated regular expression, all enclosed in curly braces.
Any pattern supported by [Go's regexp package](https://golang.org/pkg/regexp/) may be used (example: `/posts/{id:[0-9]+}`).

!!! tip "Combining Matchers Using Operators and Parenthesis"

You can combine multiple matchers using the AND (`&&`) and OR (`||) operators. You can also use parenthesis.

!!! important "Rule, Middleware, and Services"

The rule is evaluated "before" any middleware has the opportunity to work, and "before" the request is forwarded to the service.

!!! tip "Path Vs PathPrefix"

Use `Path` if your service listens on the exact path only. For instance, `Path: /products` would match `/products` but not `/products/shoes`.

Use a `*Prefix*` matcher if your service listens on a particular base path but also serves requests on sub-paths.
For instance, `PathPrefix: /products` would match `/products` but also `/products/shoes` and `/products/shirts`.
Since the path is forwarded as-is, your service is expected to listen on `/products`.

Middlewares

You can attach a list of middlewares to the routers. The middlewares will take effect only if the rule matches, and before forwarding the request to the service.

Service

You must attach a service per router. Services are the target for the router.