![Nginx マップ ディレクティブがルールと一致しない](https://rvso.com/image/697395/Nginx%20%E3%83%9E%E3%83%83%E3%83%97%20%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96%E3%81%8C%E3%83%AB%E3%83%BC%E3%83%AB%E3%81%A8%E4%B8%80%E8%87%B4%E3%81%97%E3%81%AA%E3%81%84.png)
次の 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_code
が302
、ヘッダーを見ると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 {
# ...
}