Tôi hiện đang viết một bộ điều phối sẽ gửi các URL khác nhau đến các URL dịch vụ cụ thể.
Tôi chủ yếu muốn gửi một cái gì đó như:
POST http://nginx/awesome_service/a/lot/of/params/and?so=on
đến
POST http://awesome_service/a/lot/of/params/and?so=on
Tôi đã đạt được bằng cách mã hóa cứng tên dịch vụ:
location /awesome_service {
rewrite ^/awesome_service(/.*)$ $1 break;
proxy_pass http://awesome_service;
}
Tuy nhiên, tôi có các dịch vụ khác nhau với các tên khác nhau và tôi không muốn sao chép các tuyến đường.
Tôi đã sử dụng bản đồ từ tên đến url:
map $uri $service_url {
~^/awesome_service/ "http://awesome_service";
~^/mediocre_service/ "http://mediocre_service";
}
Vì vậy, thật dễ dàng để gửi đến một url proxy biến:
location /awesome_service {
rewrite ^/awesome_service(/.*)$ $1 break;
proxy_pass $service_url;
}
Tuy nhiên, tôi vẫn đang vật lộn với việc viết lại.
Đây là những gì tôi đã đưa ra cho đến nay:
location ~ ^/([^\/]+)/.* {
set $service $1;
rewrite ^/$service(/.*)$ $1 break;
proxy_pass $service_url;
}
Yêu cầu được nắm bắt và chuyển qua. Nhưng việc viết lại thất bại. Dịch vụ vẫn nhìn thấy phần đầu tiên của url.
Có thể có một sự pha trộn với regex hoặc tôi chuyển sai trong biến?