Nginx
nginx 修改和代理 URL
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 進行評估rewrite
和location
指令,其中不包括?
和它後面的任何內容。
$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; ... } }