Nginx viết lại để loại bỏ nút đường dẫn (chung) đầu tiên


3

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?


Bạn có hàng chục hoặc hàng trăm ứng dụng? Nếu không, tốt hơn là gắn bó với một số khối vị trí rõ ràng.
Alexey Ten

Câu trả lời:


1

Trong khối rewritecủa bạn locationđược đánh giá đầu tiên, sau đó proxy_passđược sử dụng. Đây là lý do mapkhối của bạn sẽ không hoạt động $uri. Bởi vì khi mapkhối được kích hoạt, URL đã được viết lại. Tôi có cấu hình này trong phòng thí nghiệm của tôi hoạt động như mong đợi:

map $custom_service $custom_backend {
        google "https://www.google.com";
        bing "https://www.bing.com";
}
location ~ ^/([^\/]+)/.* {
        set $custom_service $1;
        rewrite ^/[^\/]+(/.*)$ $1 break;
        proxy_pass $custom_backend;
}

Các mapkhối đi vào httpkhối và locationkhối vào serverkhối.

URL của bạn trông như thế này:

http://nginx/google/some/params -> backend is now -> https://www.google.com/some/params
http://nginx/bing/some/params -> backend is now -> https://www.bing.com/some/params
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.