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:

 $ 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?

  • Imansible riscrivere l'URL in Nginx quando si utilizza SSL su porte non standard
  • Limiti la dimensione del file di caricamento e reindirizza l'utente alla pagina di errore se il limite supera
  • Utilizzo di una variabile nome_server in una configuration nginx proxy_pass
  • Come effettuare il reindirizzamento di nginx
  • nginx - il corpo di richiesta del client è bufferizzato in un file temporaneo
  • Connessione Nginx a Apache a monte: La stretta di mano di ri-negoziazione non è rioutput
  • NGINX: come bloccare l'accesso a tutti i file all'interno di alcune directory
  • NGINX riscrivere la syntax all'interno del block di posizione
  • 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.