Diretiva de mapa Nginx não corresponde às regras

Diretiva de mapa Nginx não corresponde às regras

Eu tenho este arquivo de configuração 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;
        }
    }
}

A diretiva map não está funcionando, apenas padronizando o que está definido como padrão.

Por exemplo:

$ 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

/loldeveria ter definido $new_urias http://lol.come $ret_codeas 302, mas se você olhar os X-cabeçalhos, verá apenas os valores padrão especificados no mapeamento.

Há uma semana, coloquei a mesma configuração do nginx funcionando e não houve nenhuma alteração desde então. Eu tenho atualizações automáticas de segurança do Ubuntu, mas não acho que o nginx tenha sido atualizado. Correndo v1.10.0. Não consigo apontar por que isso parou de funcionar.

Editar: acabei de testar esta mesma configuração em um VPS diferente, mesma versão nginx e funciona corretamente lá. Como posso consertar isso agora?

Responder1

Eu descobri o problema. Eu tinha vários desses arquivos de configuração para cada domínio e como o mapa é definido no contexto http, o último estava sobrescrevendo o valor das variáveis. Eu consertei isso adicionando um sufixo ao nome da variável em cada arquivo de configuração, para que as variáveis ​​sejam exclusivas:

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 é o ID deste domínio específico no meu sistema.

Responder2

Tenho enfrentado o mesmo problema no Nginx 1.12.2 - a diretiva map não correspondia a nenhum dos padrões, mesmo os mais simples e triviais /, como e sempre usava o valor padrão.

O problema foi causado pelo uso da $urivariável no mapeamento. Algumas configurações do Nginx estavam modificando implicitamente o $urivalor original acrescentando /index.phpo prefixo que causava a incompatibilidade de padrão. Tal comportamento $urié intencional e a distinção exata entre$request_urie $urivariáveis.

A correção foi substituir a variável URI na configuração do Nginx:

map $uri $result_var {
    # ...
}

com o seguinte:

map $request_uri $result_var {
    # ...
}

informação relacionada