Nginx

nginx 修改和代理 URL

  • May 21, 2018

Ngnix新手在這裡。請我需要一些幫助來弄清楚如何正確地使 nginx 修改和重定向(代理?)傳入請求。重定向似乎工作正常,但 URL 沒有在目的地重寫。

我的配置是:

       server {

      listen 91 default_server ssl;

      ssl_prefer_server_ciphers on;
      ssl_certificate /etc/nginx/ssl/domain.crt;
      ssl_certificate_key /etc/nginx/ssl/domain.key;

       location /dest {

       rewrite ^a_service_prod&id_number=((1234701|1234708|1234802|1234808|1234812|1234902)\d+)&(.*?)$ /dest?service=a_service_prod.sub_service&operation=sub_service&id_number=$1&$2 break;
           proxy_pass http://192.168.1.1:1440;
           proxy_redirect off;
           proxy_set_header Host $host;
       }
   }

我試圖獲取諸如/dest?service=a_service_prod&id_number=12347016734696&slime=somethig 被重寫的請求並將請求發送到另一台伺服器作為http://192.168.1.1:1440/dest?service=a_service_prod.sub_service&operation=sub_service&id_number=12347016734696&slime=somethig

但是在目的地,收到的是http://192.168.1.1:1440/dest?service=a_service_prod&id_number=12347016734696&slime=somethig

請問我做錯了什麼,我該如何解決?

您目前的方法不起作用,因為您試圖在rewrite指令的正則表達式中擷取查詢字元串。nginx使用規範化的 URI 進行評估rewritelocation指令,其中不包括?和它後面的任何內容。

$request_uri您可以在變數、變數中找到查詢字元串$args- 或在變數中拆分$arg_xxx。有關詳細資訊,請參閱此文件

您可以使用if語句或map指令將正則表達式應用於其中一個變數。

下面的範例使用帶有正則表達式和兩個命名擷取的map指令(有關詳細資訊,請參閱此文件)來重建所需的參數列表。上游 URI 附加到proxy_pass指令中(有關詳細資訊,請參閱本文件)。

map $args $newargs {
   default $args;
   ~*^(?<prefix>service=a_service_prod)&(?<suffix>id_number=(?:1234701|1234708|1234802|1234808|1234812|1234902)\d+&.*)$  $prefix.sub_service&operation=sub_service&$suffix;
}
server {
   ...
   location /dest {
       proxy_pass http://192.168.1.1:1440$uri?$newargs;
       ...
   }
}

引用自:https://serverfault.com/questions/913111