Nginx マップ ディレクティブがルールと一致しない

Nginx マップ ディレクティブがルールと一致しない

次の nginx 設定ファイルがあります:

map $request_uri $new_uri {
    default DEFAULT;
    /shell http://shell.com;
    /lol http://lol.com;
}
map $request_uri $ret_code {
    default 301;
    /shell 301;
    /lol 302;
}

server {
    listen 80;
    server_name TestDomain.com www.TestDomain.com;

    location / {
        add_header X-request_uri $request_uri;
        add_header X-new_uri $new_uri;
        add_header X-return_code $ret_code;
        if ($new_uri = "DEFAULT") {
            return 301 https://ashfame.com$request_uri;
        }
        if ($ret_code = 301) {
            return 301 $new_uri;
        }
        if ($ret_code = 302) {
            return 302 $new_uri;
        }
    }
}

マップ ディレクティブはまったく機能せず、デフォルトで定義されているものだけがデフォルトになります。

例えば:

$ curl -I testdomain.com/lol
HTTP/1.1 301 Moved Permanently
Server: nginx/1.10.0 (Ubuntu)
Date: Sun, 22 Jan 2017 20:04:06 GMT
Content-Type: text/html
Content-Length: 194
Connection: keep-alive
Location: https://ashfame.com/lol
X-request_uri: /lol
X-new_uri: DEFAULT
X-return_code: 301

/lol$new_uriおよびhttp://lol.comを設定する必要があります$ret_code302、ヘッダーを見るとX-、マッピングで指定されたデフォルト値が取得されているだけです。

1 週間前、同じ nginx 構成が機能するようになりましたが、それ以降は何も変化がありません。Ubuntu の自動セキュリティ アップグレードはオンにしていますが、nginx は更新されていないと思います。実行中ですv1.10.0。なぜこれが機能しなくなったのかは正確にはわかりません。

編集: 同じ設定を別の VPS、同じ nginx バージョンでテストしたところ、正常に動作しました。どうすればこれを修正できるでしょうか?

答え1

問題が分かりました。ドメインごとにこのような設定ファイルが複数あり、マップは http コンテキストで定義されているため、最後の設定ファイルが変数の値を上書きしていました。変数が一意になるように、各設定ファイルの変数名に接尾辞を追加することで、この問題を修正しました。

map $request_uri $new_uri_5 {
    default DEFAULT;
    /shell http://shell.com;
    /lol http://lol.com;
}
map $request_uri $ret_code_5 {
    default 301;
    /shell 301;
    /lol 302;
}

server {
    listen 80;
    server_name TestDomain.com www.TestDomain.com testdomain.com www.testdomain.com;

    location / {
        add_header X-request_uri $request_uri;
        add_header X-new_uri $new_uri_5;
        add_header X-return_code $ret_code_5;

        if ($new_uri_5 = "DEFAULT") {
            return 301 https://ashfame.com$request_uri;
        }
        if ($ret_code_5 = 301) {
            return 301 $new_uri_5;
        }
        if ($ret_code_5 = 302) {
            return 302 $new_uri_5;
        }
    }
}

5 は私のシステム内のこの特定のドメインの ID です。

答え2

私は Nginx 1.12.2 でも同じ問題を経験しています。map ディレクティブは、 のような最も単純で些細なパターンであっても、どのパターンにも一致せず/、常にデフォルト値が使用されていました。

$uriこの問題は、マッピングでの変数の使用が原因であることが判明しました。一部のNginx設定では、プレフィックス$uriを先頭に追加することで暗黙的に を元の値から変更していたため/index.php、パターンの不一致が発生していました。 のこのような動作は$uri設計によるものであり、$request_uriおよび$uri変数

修正方法は、Nginx 設定内の URI 変数を置き換えることでした。

map $uri $result_var {
    # ...
}

以下の通り:

map $request_uri $result_var {
    # ...
}

関連情報