Bạn đang so sánh của bạn $request_uri, tương đương với /app/index.html?target=master từ ví dụ của bạn, đến mục tiêu = chính và mục tiêu = nô lệ dây. Không có cái nào phù hợp, vì vậy $redirect_to biến trở thành một chuỗi rỗng. Nếu bạn muốn kiểm tra xem $request_uri chứa một mục tiêu = chính hoặc mục tiêu = nô lệ chuỗi con, bạn có thể sử dụng các mẫu biểu thức chính quy bên trong bản đồ chặn:
bản đồ $request_uri $redirect_to {
máy chủ chính "~ target=master";
máy chủ nô lệ "~ target=slave";
}
hoặc kiểm tra tốt hơn $arg_target giá trị biến:
bản đồ $arg_target $redirect_to {
máy chủ chính;
nô lệ nô lệ;
}
Cũng xem xét sử dụng một số mặc định giá trị khi không Mục tiêu đối số truy vấn được chỉ định trong yêu cầu (hoặc giá trị của nó không hợp lệ):
bản đồ $arg_target $redirect_to {
máy chủ chính;
nô lệ nô lệ;
máy chủ mặc định;
}
Cái cuối cùng có thể được đơn giản hóa thành
bản đồ $arg_target $redirect_to {
nô lệ nô lệ;
máy chủ mặc định;
}
Hoặc thực hiện một số kiểm tra sơ bộ như
bản đồ $arg_target $redirect_to {
máy chủ chính;
nô lệ nô lệ;
}
người phục vụ {
nghe 80;
server_name 192.168.1.10;
nếu ($redirect_to = '') {
trả lại 501; # HTTP 501 không được triển khai
}
địa điểm / {
proxy_pass http://$redirect_to;
}
}
Cập nhật
Nếu tôi hiểu chính xác câu hỏi bổ sung của bạn - cách tải tất cả nội dung từ cùng một hướng ngược dòng với tệp HTML chính - bạn có thể thử lấy tên ngược dòng từ HTTP người giới thiệu giá trị tiêu đề nếu Mục tiêu không có đối số truy vấn bằng cách sử dụng hai chuỗi bản đồ các khối (ở đây là regex thực sự xuất hiện):
bản đồ $arg_target $redirect_to {
máy chủ chính;
nô lệ nô lệ;
mặc định $by_referer;
}
bản đồ $http_referer $by_referer {
máy chủ chính "~ target=master";
máy chủ nô lệ "~ target=slave";
}
người phục vụ {
...
}