Điểm:0

Viết lại chuỗi truy vấn Nginx

lá cờ cn

Tôi có một cấu hình như bên dưới, nhưng tôi gặp lỗi 500. Lỗi này có thể ở đâu?

máy chủ chính ngược dòng {máy chủ 192.168.1.1:8000;}
máy chủ nô lệ ngược dòng {máy chủ 192.168.1.2:8001;}

bản đồ $request_uri $redirect_to {
    máy chủ chính "mục tiêu=chính";
    máy chủ nô lệ "mục tiêu=nô lệ";
}

người phục vụ {
    nghe 80;
        server_name 192.168.1.10;

       địa điểm / {
        proxy_pass http://$redirect_to;
    }

}

Khi tôi gọi URL như bên dưới, tôi gặp lỗi sau.

http://192.168.1.10/app/index.html?target=master

http://192.168.1.10/app/index.html?target=slave

Nhật ký Nginx: *2 tiền tố URL không hợp lệ trong "http://", máy khách: 192.168.1.11, máy chủ: 192.168.1.10, yêu cầu: "GET /favicon.ico HTTP/1.1", máy chủ: "192.168.1.10", liên kết giới thiệu: "http ://192.168.1.10/app/index.html?target=master"

Điểm:0
lá cờ gr

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ínhmụ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ụ {
    ...
}
MrTux01 avatar
lá cờ cn
Cảm ơn vì lời giải thích tuyệt vời. Làm cách nào để loại bỏ lỗi 500 đối với tệp css và js?
Ivan Shatsky avatar
lá cờ gr
Không chắc liệu tôi có hiểu chính xác câu hỏi của bạn không, nếu tôi hiểu đúng, hãy kiểm tra bản cập nhật để có câu trả lời.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.