Điểm:0

nginx proxy_pass cho tác nhân người dùng nhất định

lá cờ cn

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:

  1. 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ế.
  2. 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)

Richard Smith avatar
lá cờ jp
Hãy thử thay đổi cấu hình ban đầu của bạn từ `vĩnh viễn` thành `cuối cùng`.
Egidijus avatar
lá cờ nz
Khi cuộn tròn trong nhà phát triển, hãy thử các cờ này để vượt qua các chứng chỉ tự ký, theo dõi các chuyển hướng và nhận được nhiều giá trị hơn: `curl -ivLk https://yahoo.com`

Đă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.