Redirecionamento de regex Nginx

1

Estou tentando criar uma regra de redirecionamento personalizada, mas ela está funcionando. Logs não são úteis para mim.

Eu gostaria de configurar duas regras:

/api/appname/* => http://appname-edge:3000/appname/*
/appname/* => http://appname-ui:80/*

esta é minha tentativa:

server {
    listen       80;
    server_name  localhost;

    # redirect /api/myApp => http://myApp-edge:3000/myApp/

    location ~* "^\/api\/(.*?)\/(.*)" {
        proxy_pass http://$1-edge:3000/$1/$2;
    }

    # redirect /myApp => http://myApp-ui:80/

    location ~* "^\/(.*?)\/(.*)" {
        proxy_pass http://$1-ui/$2;
    }

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

Logs:

2017/03/30 16:32:25 [error] 13870#0: *1 no resolver defined to resolve app1-edge, client: 127.0.0.1, server: localhost, request: "GET /api/app1/foo/bar HTTP/1.1", host: "localhost"
2017/03/30 16:39:24 [warn] 14152#0: conflicting server name "localhost" on 0.0.0.0:80, ignored
2017/03/30 16:39:25 [warn] 14156#0: conflicting server name "localhost" on 0.0.0.0:80, ignored
2017/03/30 16:39:32 [warn] 14197#0: conflicting server name "localhost" on 0.0.0.0:80, ignored
2017/03/30 16:39:41 [error] 14199#0: *1 no resolver defined to resolve app1-edge, client: 127.0.0.1, server: localhost, request: "GET /api/app1/foo/bar HTTP/1.1", host: "localhost"
2017/03/30 16:42:22 [warn] 14321#0: conflicting server name "localhost" on 0.0.0.0:80, ignored
2017/03/30 16:42:24 [warn] 14325#0: conflicting server name "localhost" on 0.0.0.0:80, ignored
2017/03/30 16:42:32 [error] 14328#0: *1 no resolver defined to resolve app1-edge, client: 127.0.0.1, server: localhost, request: "GET /api/app1/foo/bar HTTP/1.1", host: "localhost"
2017/03/30 16:46:43 [emerg] 14628#0: host not found in resolver "$1-edge" in /etc/nginx/conf.d/ims.conf:9
2017/03/30 16:46:52 [emerg] 14658#0: host not found in resolver "$1-edge" in /etc/nginx/conf.d/ims.conf:8
2017/03/30 16:46:55 [error] 14328#0: *2 no resolver defined to resolve app1-edge, client: 127.0.0.1, server: localhost, request: "GET /api/app1/foo/bar HTTP/1.1", host: "localhost"

No meu teste, tudo deve resolver para localhost. No servidor de produção, o DNS cuidará do nome do aplicativo / DNS.

Alguma sugestão?

    
por Falci 30.03.2017 / 22:03

2 respostas

2

As entradas de log significam que sua caixa não pode resolver app1-edge hostname. Se você quiser localhost para o servidor, você precisa editar o arquivo hosts do sistema e adicionar a seguinte entrada para ele:

127.0.0.1 app1-edge

Então, eu mudaria um pouco as expressões regulares:

server {
    listen       80;
    server_name  localhost;

    root   /usr/share/nginx/html;
    index  index.html index.htm;
    error_page   500 502 503 504  /50x.html;

    # redirect /api/myApp => http://myApp-edge:3000/myApp/

    location ~* ^/api/([^/]+)/(.+)$ {
        proxy_pass http://$1-edge:3000/$1/$2;
    }

    # redirect /myApp => http://myApp-ui:80/

    location ~* ^/([^/]+)/(.+)$ {
        proxy_pass http://$1-ui/$2;
    }
}

Primeiro, as expressões regulares não precisam de aspas ou de escapar das barras. Em segundo lugar, é melhor usar o + para a correspondência "um ou mais".

A suposição aqui é que a última parte do caminho contém pelo menos um caractere em todos os casos, ou seja, não há um URL como https://www.example.com/api/appname ou https://www.example.com/api/appname/ .

Se tais URLs existirem, o regex pode ser ^/api/([^/]+)(/.*)$ para cuidar desses casos.

Você também deve tomar cuidado para ter apenas um bloco server em sua configuração com server_name localhost . Caso contrário, o nginx usará apenas um desses hosts virtuais, o que pode não ser esse.

Também removi os dois location blocos em sua configuração original, porque você pode ter o mesmo efeito ao definir as diretivas root e index no nível server .

    
por 31.03.2017 / 01:25
1

Estou tendo sucesso com os redirecionamentos Nginx por ter essa linha em nginx.conf :

include /etc/nginx/conf.d/*.conf;

E, em seguida, um arquivo /etc/nginx/conf.d/redirects.conf com uma pequena estrofe para cada um dos redirecionamentos:

server {
    listen 80;
    server_name to-be-redirected.example.com
    return 301 https://example.com/its-redirected/sample.html
}

Em seguida, execute nginx -s reload .

    
por 30.03.2017 / 22:37

Tags