nginx mapa com expressão regular comeu meu URI

3

Alguns mapas matam meu URI, não entendo o porquê:

map $http_cookie $redir_scheme {
    default http;
    ~some=value https; # here is the SSL cookie
}
server {
    listen       8888;
    server_name  redir.*;

    expires -1;
    add_header Last-Modified "";

    location / {
        rewrite ^/(.*)$ $redir_scheme://example.com/$1 redirect;
    }
}

Curl dar um redirecionamento sem URI:

$ curl -giH 'Host: redir.somedomain.com' 'localhost:8888/some/path/with/meaningful/data' -H 'Cookie: some=value'
(...)
Location: https://example.com/
(...)

Mas quando altero a configuração para:

map $http_cookie $redir_scheme {
    default http;
    some=value https; # here is the SSL cookie
}
server {
    listen       8888;
    server_name  redir.*;

    expires -1;
    add_header Last-Modified "";

    location / {
        rewrite ^/(.*)$ $redir_scheme://example.com/$1 redirect;
    }
}

Curl dá um redirecionamento com um URI:

$ curl -giH 'Host: redir.somedomain.com' 'localhost:8888/some/path/with/meaningful/data' -H 'Cookie: some=value'
(...)
Location: https://example.com/some/path/with/meaningful/data
(...)

Acho que a primeira solução foi realmente idiota, mas não vejo por quê. Você tem alguma luz?

    
por brisssou 10.12.2014 / 17:37

1 resposta

3

Isso acontece porque $1 vem da última expressão regular executada. Como map{} é verificado depois da expressão regular em reescrita, o $1 vem da expressão regular especificada no mapa (e está vazia). Há um ticket 564 no nginx trac sobre isso - enquanto o comportamento é formalmente correto, é claramente contra-intuitivo e precisa ser mudado.

Como alternativa, você pode usar capturas nomeadas:

rewrite ^/(?<rest>.*)$ $redir_scheme://example.com/$rest redirect;

Ou, melhor ainda, use apenas return com $ request_uri:

return 302 $redir_scheme://example.com$request_uri;
    
por 10.12.2014 / 19:56

Tags