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;
        }
    }
}

map 지시문은 전혀 작동하지 않으며 기본값으로 정의된 대로 기본값을 지정합니다.

예를 들어:

$ 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_urias http://lol.com$ret_codeas를 설정해야 302하지만 헤더를 보면 X-매핑에 지정된 기본값을 사용하는 것뿐입니다.

일주일 전에 나는 이와 동일한 nginx 구성이 작동하고 그 이후로 아무런 변화가 없었습니다. 우분투의 자동 보안 업그레이드가 켜져 있지만 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에서 동일한 문제가 발생했습니다. 지도 지시문은 와 같은 가장 단순하고 사소한 패턴이라도 패턴과 일치하지 않으며 /항상 기본값을 사용했습니다.

$uri이 문제는 매핑에서 변수를 사용하여 발생하는 것으로 확인되었습니다 . 일부 Nginx 구성은 패턴 불일치를 유발하는 접두사를 $uri앞에 추가하여 원래 값을 암시적으로 수정했습니다 . /index.php이러한 동작은 $uri의도적으로 설계된 것이며 두 요소 간의 정확한 구별은 다음과 같습니다.$request_uri그리고 $uri변수.

수정 사항은 Nginx 구성에서 URI 변수를 바꾸는 것이었습니다.

map $uri $result_var {
    # ...
}

다음과 함께:

map $request_uri $result_var {
    # ...
}

관련 정보