La mappa di nginx con espressione regolare ha mangiato l'URI

Alcune mappe uccidono l'URI, non capisco perché:

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à un reindirizzamento senza URI:

  • Come creare questo tipo di sottodominio: example.test.domain.com
  • imansible riavviare php5-fpm
  • Riscrivi sulla root del dominio solo in nginx
  • Posso eseguire due applicazioni server sulla port 80?
  • Permessi di file statici con Nginx, Gunicorn e Django
  • Come aggiungere il module di caricamento del file nginx a Debian Squeeze?
  •  $ curl -giH 'Host: redir.somedomain.com' 'localhost:8888/some/path/with/meaningful/data' -H 'Cookie: some=value' (...) Location: https://example.com/ (...) 

    Ma quando cambio la configuration a:

     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 fornisce un reindirizzamento con un 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 (...) 

    Immagino che la prima soluzione fosse davvero stupida, ma non riesco a capire perché. Hai qualche luce?

    One Solution collect form web for “La mappa di nginx con espressione regolare ha mangiato l'URI”

    Ciò accade perché $1 viene dall'ultima espressione regolare eseguita. Come map{} viene controllata più tardi dell'espressione regolare in riscrittura, il $1 deriva dall'espressione regolare specificata nella mappa (ed è vuota). C'è un biglietto 564 in sintonia su questo – mentre il comportmento è formalmente corretto, è chiaramente controintuitivo e deve essere modificato.

    Come soluzione alternativa è ansible utilizzare le catture di nome invece:

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

    Oppure, ancora meglio, utilizzare il return con $ request_uri invece:

     return 302 $redir_scheme://example.com$request_uri; 
    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.