Traefikによるhttpリダイレクション

ごく普通のウェブサイトにおいて、ブラウザにプロトコルを指定せずにドメイン名を入力すると、例えばexample.comのみを入力すると、それはまずhttpとみなされてリクエストが行われる。しかし、サーバ側で「httpsでアクセスしてよ」という応答がなされ、ブラウザは結局「https://example.com」にアクセスする、という仕組みのようだ。

これを、Traefikで行う方法として二種類ある。この記事は、HTTP to HTTPS redirects with Traefikを参考にしている。

また、Traefikを使ってLet’s Encryptの証明書を得るのサンプルに追加する形になる。

Traefikの受け取ったすべてのhttp要求をhttpsに変更する

Traefikのさばいているすべてのウェブサイトについて一律にhttpsに変更する。これは簡単で、二行追加すればよい。

先のTraefikのdocker-compose.ymlの例のcommandの最後に、以下の最後の二行を追加する。

    command:
      #- "--log.level=DEBUG"
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
      - "--certificatesresolvers.myresolver.acme.httpchallenge=true"
      - "--certificatesresolvers.myresolver.acme.httpchallenge.entrypoint=web"
      #- "--certificatesresolvers.myresolver.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory"
      - "--certificatesresolvers.myresolver.acme.email=rep@jimakudaio.com"
      - "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"
      - "--entrypoints.web.http.redirections.entrypoint.to=websecure"
      - "--entrypoints.web.http.redirections.entrypoint.scheme=https"

ただし、当然だが、Traefik自体の機能には影響がないと思われる。Traefikは、Let’s Encrypt証明書の取得や更新を行うために、80番ポートを開けておかなければならないからだ。

※いったん上の設定をして、手持ちのドメインのいくつかにアクセスすると、ブラウザはそのリダイレクトを覚えているようで、この設定をキャンセルしてもリダイレクトされてしまうことに注意。

ドメインごとのリダイレクト

まず、先の二行を削除しておく。

      - "--entrypoints.web.http.redirections.entrypoint.to=websecure"
      - "--entrypoints.web.http.redirections.entrypoint.scheme=https"

「すべてのドメインを一律に」では不都合なことがある。この場合は、「必要なドメインのみ」に処置を施す必要がある。ドメインごとに対策しなければならないので面倒ではある。

Traefikを使ってLet’s Encryptの証明書を得るのwhoamiの最後の例に追加してみる。

    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.whoami.rule=Host(`fortest.example.com`)"
      - "traefik.http.routers.whoami.entrypoints=websecure"
      - "traefik.http.routers.whoami.tls.certresolver=myresolver"
      - "traefik.http.services.whoami.loadbalancer.server.port=2001"
      - "traefik.http.routers.whoami-http.entrypoints=web"
      - "traefik.http.routers.whoami-http.rule=Host(`fortest.example.com`)"
      - "traefik.http.routers.whoami-http.middlewares=whoami-https"
      - "traefik.http.middlewares.whoami-https.redirectscheme.scheme=https"

最後の四行が追加されたものだ。ここでは、routers.whoamiとは別のrouters.whoami-httpを作成して、それをhttpsに振り向けている。

この状態をTraefikのダッシュボードで観察すると以下になる。

まずhttpルータとしては以下。この場合のHTTPはHTTPSも含む、盾マークのついているのがHTTPS。

80番の方を見てみると以下。

443の方は以下だ。