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ụ {
...
}