Tôi có một trang web với nginx trả về index.html (ứng dụng phản ứng một trang) cho hầu hết tất cả các yêu cầu.Mọi yêu cầu đối với hầu hết mọi đường dẫn (ví dụ: /một số/bài viết
) cũng sẽ trở lại index.html
, và ứng dụng phản ứng (bộ định tuyến phản ứng) sẽ dịch đường dẫn thành lệnh gọi API. Đây là cách nó hoạt động và nó không thể thay đổi (trang web rất lớn, sẽ có quá nhiều công việc và dù sao thì tôi cũng không có tư cách thay đổi điều này).
Nên có hai trường hợp ngoại lệ cho những yêu cầu này:
- Tất cả các yêu cầu bắt đầu bằng /api/* đường dẫn được chuyển đến một thượng nguồn (máy chủ ứng dụng). Vì vậy, một chương trình phụ trợ khác sẽ xử lý tất cả các yêu cầu API thực tế.
- Ngoại lệ khác phải là lượt truy cập bên ngoài facebook. Có một điểm cuối khác trong /api/open_graph trên máy chủ ứng dụng cho điều đó. Ví dụ. /api/open_graph nên được thêm trước vào đường dẫn ban đầu. Điểm cuối đó trả về nội dung thực (chứ không phải ứng dụng phản ứng một trang thông thường không có nội dung thực). Định dạng cũng khác - lệnh gọi API thông thường thường trả về dữ liệu JSON nhưng điểm cuối open_graph trả về HTML đơn giản.
Ví dụ cấu hình nginx:
ngược dòng www {
#...
}
người phục vụ {
#...
# Sử dụng /api/open_graph trên thượng nguồn cho các lượt truy cập bên ngoài facebook
if ($http_user_agent ~* "^facebookexternalhit.*$") {
viết lại ^/(.*)$ /api/open_graph/$1 vĩnh viễn;
}
# Yêu cầu API sẽ đi ngược dòng
vị trí ~ ^/api/ {
proxy_pass http://www;
proxy_read_timeout 90;
proxy_redirect http://www https://example.com;
}
# Tất cả các yêu cầu khác đều sử dụng ứng dụng phản ứng,
# bộ định tuyến phản ứng xử lý tất cả các yêu cầu tiếp theo
địa điểm / {
chỉ số index.html;
error_page 404 =200 /index.html;
}
}
Cấu hình trên hoạt động như thế này:
# curl -A "facebookexternalhit" -s -D - -o /dev/null https://example.com/article1
HTTP/1.1 301 được di chuyển vĩnh viễn
Máy chủ: nginx
Ngày: Thứ tư, ngày 20 tháng 10 năm 2021 08:14:13 GMT
Loại nội dung: văn bản/html
Độ dài nội dung: 162
Vị trí: https://example.com/api/open_graph/article1
Kết nối: giữ nguyên
Nghiêm ngặt-Giao thông-An ninh: max-age=31536000
X-Content-Type-Options: nosniff
X-XSS-Bảo vệ: 1; chế độ = khối
Tùy chọn khung hình X: SAMEORIGIN
Điều này gần như tốt, ngoại trừ api biểu đồ facebook không xử lý các chuyển hướng. (Ai biết tại sao?). Vì vậy, thay vì chuyển hướng đến /api/open_graph/*
máy chủ sẽ kết nối trực tiếp ngược dòng và chuyển tiếp yêu cầu.
Nhưng tôi không biết làm thế nào? Giải pháp ngây thơ sẽ là:
# Sử dụng /api/open_graph trên thượng nguồn cho các lượt truy cập bên ngoài facebook
if ($http_user_agent ~* "^facebookexternalhit.*$") {
viết lại ^/(.*)$ /api/open_graph/$1 vĩnh viễn;
proxy_pass http://www;
proxy_read_timeout 90;
proxy_redirect http://www https://example.com;
}
Nhưng nó không hoạt động, bởi vì proxy_pass
chỉ có thể được sử dụng bên trong một địa điểm
. Nó không thể được sử dụng bên trong một nếu
. Nếu tôi thử cấu hình đó thì tôi nhận được:
nginx: [emerg] Lệnh "proxy_pass" không được phép ở đây trong /etc/nginx/sites-enabled/example-www:62
nginx: kiểm tra tệp cấu hình /etc/nginx/nginx.conf không thành công
Tôi có thể thay đổi mã chương trình ở thượng nguồn (ví dụ: thêm bộ lọc cho tác nhân người dùng ở đó), nhưng điều đó sẽ khá khó khăn.
Có cách giải quyết nào cho vấn đề này trong nginx không?
Câu hỏi này liên quan đến: nginx - proxy_pass trên user_agent nhưng điều đó cũng không hiệu quả với tôi (gây ra lỗi)