![Diretiva de mapa Nginx não corresponde às regras](https://rvso.com/image/697395/Diretiva%20de%20mapa%20Nginx%20n%C3%A3o%20corresponde%20%C3%A0s%20regras.png)
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
/lol
deveria ter definido $new_uri
as http://lol.com
e $ret_code
as 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 $uri
variável no mapeamento. Algumas configurações do Nginx estavam modificando implicitamente o $uri
valor original acrescentando /index.php
o prefixo que causava a incompatibilidade de padrão. Tal comportamento $uri
é intencional e a distinção exata entre$request_uri
e $uri
variá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 {
# ...
}