NGINX: localhost を _ にリダイレクト

NGINX: localhost を _ にリダイレクト

nginx バージョン/1.18.0 (Ubuntu) — Ubuntu 22.04.01 LTS x86_64 カーネル 6.0.8


複数のホスト名を持ち、nginx を実行しているサーバー (上記のインストール仕様) があり、すべてが機能しています (nginx を含み、http: から https: にリダイレクトされます)。

実際、デフォルトのサーバーでは次のように実行しています。

listen 80 default_server;

listen 443 default_server ssl;
# force https-redirects
if ($scheme = http) {
  return 301 https://$host$request_uri;
}

server_name _;

奇妙な動作は次のとおりです。

メールアドレス リダイレクト先 ノート
http://mumblefrotz/ https://mumblefrotz/ (期待通りに動作します)
http://mumblefrotz.fullyqualified.com/ https://mumblefrotz.fullyqualified.com/ (期待通りに動作します)
http://127.0.0.1/ https://127.0.0.1/ (期待通りに動作します)
http://localhost/ https://_ 失敗

なぜこうなるのでしょうか? それは何か関係があるのではないかと思うserver_name指令は文字通りに解釈されますが、なぜそれが にのみ発生するのかはよくわかりませんlocalhost

見てみるとこのStack Overflowの提案、私は次の両方を試しましたが、それでも驚くべきアンダースコアが表示されました。

  • server_name ~.;
  • server_name ~^(.+)$;

私の期待$hostHTTPリクエストで渡されたホスト名仮想ホストは、定義されている場合はそれを取得し、定義されていない場合はデフォルトのサーバー定義にフォールバックします。

私の知る限り、http://localhost/正しく解決されないのはこれだけです。これを修正したいと思います。

答え1

リクエストにどのクライアントが使用されたかという質問に関する情報はありませんでした。nginx ドキュメント変数には$host以下が含まれます:

優先順位は、リクエスト行のホスト名、リクエストヘッダーフィールドの「Host」のホスト名、リクエストに一致するサーバー名のいずれかです。

GETここで、「リクエスト ライン」とは、 HTTP リクエスト内の動詞の後のホスト名を意味します。

2番目はHostヘッダーフィールドを意味します。

3 番目は で設定された名前を意味しますserver_name

あなたの場合、テスト クライアントがヘッダーを含まないリクエストを実行したと思いますHost。そのため、nginx は変数server_nameの内容の設定を使用しました。$host

個人的には、Ansible を使用して nginx 構成を管理しているため、すべての仮想サーバーに対して HTTP -> HTTPS 転送ブロックを生成するだけです。こうすることで、return 404興味のない他のすべてのホスト名に対して vhost を持つことができます。

ただし、リダイレクト用に共通の vhost を実装する必要がある場合は、次のアプローチを使用できます。

map $http_host $redirect_host {
    ~ (^.+$) $http_host;
    default  example.com;
}

server {
    listen 80 default_server;
    ...

    if ($scheme = http) {
        return 301 https://$redirect_host$request_uri;
    }
}

ヘッダーがない場合は、リダイレクト ターゲットに常に HTTP ホスト ヘッダーを使用します。ヘッダーがない場合は、リダイレクト ターゲットにHostを使用しますexample.com。たとえば、メイン ドメイン名をリダイレクト ターゲットとして割り当てることができます。

関連情報