内部ホスト名と外部ホスト名の両方で利用できるnginxのサイトを提供しています。外部アクセスにhttpsを使用するように強制したいのですが、内部アクセス用にhttpを保持します(これらの内部アドレスの証明書を取得できないため)。
次の構成は私が望むことをします:
#redirect port 80 http to 443 https
server{
listen 80 default_server;
listen [::]:80 default_server;
#just for external access
server_name hostname.external_domain;
return 301 https://$Host$request_uri;
}
# serve both http and https internally
server {
listen 80;
listen 443 ssl;
listen [::]:80;
listen [::]:443 ssl;
server_name hostname hostname.internal_domain hostname.external_domain;
...
しかし、nginx -t
は私に警告を与えます
nginx: [warn] conflicting server name "hostname.external_domain" on 0.0.0.0:80, ignored
このホスト名は両方のサーバー定義で使用されるためです。しかし、そこにある必要があります。そうしないと、httpアクセスの試行またはリダイレクトされた試行をキャッチできません。
hostname.external_domain
のポート443のみで、ポート80なしの3番目のサーバー定義を追加し、この名前だけを2番目のサーバーから削除すると、おそらく警告が削除されますが、全体をコピーする必要がありました。サーバーブロックのコンテンツも、冗長だと思います。
より良い解決策はありますか?
オプション1。
3つのserver
ブロックを使用しますが(質問で述べたように)、重複したコンテンツを別のファイルにオフロードし、include
ディレクティブを使用して関連する各server
ブロックにプルします。詳細については、 このドキュメント を参照してください。
オプション2。
default_server
にはserver_name
ステートメントは必要ありません。ただし、default_server
を他のserver
ブロックに交換して、最初のserver
ブロックがより具体的なものになるようにする必要があります。
例えば:
server{
listen 80;
listen [::]:80;
server_name hostname.external_domain;
return 301 https://$Host$request_uri;
}
server {
listen 80 default_server;
listen 443 ssl default_server;
listen [::]:80 default_server;
listen [::]:443 ssl default_server;
...
}
2番目のserver_block
は、最初のserver
ブロックが明示的に一致しないものと一致するため、server_name
を使用して一致する必要はありません。