ディスカッション (15件)
以下のプルリクエストおよびドキュメントで公開されている通り、Caddy v2.11(2026年2月リリース)からHostヘッダーのデフォルト動作が変更されています。
この変更はバックエンドがHTTPSの場合にのみ適用されます。
何が変わったのか?
従来、CaddyはクライアントからのオリジナルのHostヘッダー(例: whatever.example.com)をそのままアップストリームに転送していました。
しかし、最新バージョンではCaddyfileで指定したアップストリームのホスト名とポート(例: server-blue:443)が強制的にHostヘッダーとして設定されるようになりました。
以前の構成例
これまでHTTPSバックエンドに対しては、以下のように設定するのが一般的でした(証明書検証をスキップする場合など)。
whatever.{$MY_DOMAIN} {
reverse_proxy https://server-blue:443 {
transport http {
tls
tls_insecure_skip_verify
}
}
}
対策:以前の動作に戻すには
以前と同じ動作(オリジナルのHostヘッダーを維持)をさせたい場合は、明示的に header_up Host {host} を追加する必要があります。
whatever.{$MY_DOMAIN} {
reverse_proxy https://server-blue:443 {
header_up Host {host}
transport http {
tls
tls_insecure_skip_verify
}
}
}
Caddyをアップデートする際は、この挙動変更によってリバースプロキシ先でエラーが起きないか確認するようにしましょう。
この投稿やプロジェクトでAIがどう使われたかを知りたいなら、このコメントへの返信を展開してみて。
一方で、こういうTLS設定はかなり特殊だし、全く一般的じゃない。普通はHTTPに頼るか、内部CAを使うものだからね。もう一方で、この変更のやり方は最悪だ。せめて指定された名前がIPアドレスじゃなくてドメインの時にだけ動作するようにして、TLS検証を無効化しないようにするべきでしょ。
「セキュリティ」のためにHTTPSでしか公開してないWebサービスがいくつかあって、リバースプロキシがすごく面倒になるんだよね。ある書籍管理のUIなんかもそうだ。OPNsenseのデフォルトも自己署名証明書だし。
内部CAをデプロイして頑張ることもできるけど、HTTPSエンドポイントをそのまま使ってCaddy経由で転送して、ドメイン名を統一しちゃうほうが楽なことが多いよ。
どっちの指摘もその通りだね。特に「ひどい変更」ってところ。リバースプロキシのデフォルト設定が変わる最悪のケースって、まさにこういうやつだよ。リクエストはアップストリームまで届くのに、Hostヘッダーがvhostと一致しなくてルーティングや認証が静かに壊れるっていう。UniFiコントローラー、Proxmox VE、OPNsense、vCenterなんかは全部バックエンドで自己署名証明書によるHTTPSを強制してくるから、先週全部こっそり動かなくなって大変だったよ。2.11に原因があるって特定するまでかなり時間かかったし。リリースノートに一言書いておいてくれれば、数時間のロスが防げたのにな。
素人にもわかるように、典型的なシナリオで何が変わるのか教えてくれない?あと、どのアプリが壊れる可能性があるのかも。例えば、Caddyfileを変えなかったらImmichやPaperlessは動かなくなるの?
Caddyでの通常のリバースプロキシ設定はこんな感じだね。
photos.example.com {
reverse_proxy immich_server:2283
}
これは何の問題もない。バックエンドのImmichのWebサーバー側がHTTPSやTLS暗号化なしで応答しているからね。ほとんどのサービスはこうなってるよ。開発者だって、デプロイ時にリバースプロキシでHTTPS化する人が多いってわかってるから、自分たちでわざわざ面倒なことをしたくないんだよ。
ただ、セキュリティのためにHTTPSでしか公開しないって決めてるWebサーバーもある。そういうのは独自の証明書やTLSを使っていて、設定には少し手間がかかる。Caddyfileに数行追加して、「これはHTTPSで通信するから、Webサーバー側の証明書が正しくなくても気にしなくていいよ(Caddy自体の証明書が正しければ問題ないから)」って教えてやる必要があるんだ。OPの投稿にあるような設定だね。見た目は少しゴチャゴチャしてて冗長だけど、問題はないよ。
というわけで、自分のCaddyfileを見て tls_insecure_skip_verify なんて記述がどこにもないなら、今まで対応する必要がなかったってことだし、これからも何もする必要はないよ。
ちなみに自分はCrafty(Minecraft)とWireguard-easyだけはHTTPSオンリーだから、それらには header_up Host {host} を追加する必要があったな。
自分のサービスの一部はこんな感じで設定してるよ。
transport http {
tls_insecure_skip_verify
}
ただ、DNSチャレンジでLet's Encryptの正規証明書を使ってるし、HTTPS化もできてるから、この設定が本当に必要なのか自信がないんだよね。NPMからCaddyへの移行をClaudeに手伝ってもらった時、彼が勝手に追加したんだ。
一度削除してCaddyをリロードして、動くかどうか試してみればいいよ。動かなくなったら、そのサービスはHTTPSでしか応答していないってことだね。
理解しておくべきなのは、これはあくまでCaddyとコンテンツを持つWebサーバー(アップストリーム)間の通信の話だってこと。CaddyとHTTPS証明書の話をするときは、普通はエンドユーザー(スマホでネットを見てるおばあちゃんとか)がURLにアクセスして、Caddyまで安全にHTTPSで到達して、そのあとCaddyがWebサーバーと安全に通信するかどうか、という部分を指すからね。
これってレイヤー4のルーティングやSNIに影響するの?
そうは思わないな。
最近UniFiコントローラーでこれをやる必要があったけど、原因を突き止めるのが面倒だったよ。
バックエンドで強制的にHTTPSにするサービスってどれのこと?自分が使ってるやつにはないな。
教えてくれてありがと。
たぶんそれが理由でLinkstackが読み込めなかったんだな。投稿者さんサンクス。