Trả lời với 200 từ cấu hình Nginx mà không phục vụ tệp


122

Tôi đã cấu hình Apache để gửi lại phản hồi 200 mà không phục vụ bất kỳ tệp nào có dòng cấu hình này

Redirect 200 /hello

Tôi có thể làm điều này với Nginx không? Tôi không muốn phục vụ một tệp, tôi chỉ muốn máy chủ phản hồi với 200 (Tôi chỉ đăng nhập yêu cầu).

Tôi biết tôi có thể thêm một tệp chỉ mục và đạt được điều tương tự, nhưng thực hiện nó trong cấu hình có nghĩa là có một điều ít có thể sai.

Câu trả lời:


261

Vâng, bạn có thể

location / {
    return 200 'gangnam style!';
    # because default content-type is application/octet-stream,
    # browser will offer to "save the file"...
    # if you want to see reply in browser, uncomment next line 
    # add_header Content-Type text/plain;
}

1
Làm cách nào để thêm một dòng mới vào phản hồi? gangnam\nstyle?
tback

1
@tback tất nhiên, đúng là bạn
cadmi

4
add_header không hoạt động với tôi vì nó thêm một tiêu đề khác thay vì thay thế 'Kiểu nội dung' cũ. Trong phản hồi của tôi, tôi có 2 tiêu đề 'Kiểu nội dung': $ curl -v localhost / Healthcheck / h1_pio> GET / Healthcheck / h1_pio HTTP / 1.1> Tác nhân người dùng: curl / 7.38.0> Máy chủ: localhost> Chấp nhận: / > <HTTP / 1.1 200 OK <Ngày: Thứ ba, ngày 11 tháng 10 năm 2016 13:27:53 GMT <Loại nội dung: ứng dụng / octet-stream <Độ dài nội dung: 25 <Kết nối: giữ nguyên <Loại nội dung: ứng dụng / json
jmcollin92

1
@ jmcollin92 bình luận của bạn không liên quan gì đến câu hỏi đã được hỏi và câu trả lời đã được đưa ra. bởi vì bạn rõ ràng có một số loại proxy_pass, fascgi_pass, bất cứ điều gì ... nhưng tôi vẫn trả lời vị trí / Healthcheck / h1_pio {# proxy_pass blablabla những gì bạn cần; proxy_ leather_header Loại nội dung; add_header Ứng dụng loại nội dung / json; } trong tương lai, hãy đặt câu hỏi của bạn một cách chính xác và ở vị trí thích hợp
cadmi

6
@ jmcollin92 có thể xảy ra nếu bạn có default_type được khai báo ở một nơi khác. Bạn có thể ghi đè lên nó bằng cách sử dụng default_type text/plain;bên trong khối vị trí thay cho lệnh add_header.
tjb1982

20

Bạn cần phải sử dụng 204 vì Nginx sẽ không cho phép 200 không có phản hồi. Để gửi 204 bạn chỉ cần sử dụng chỉ thị trở lại để return 204;ở vị trí thích hợp.


Nếu bạn cố gắng xem điều này thông qua một trình duyệt, nó sẽ trông giống như không làm gì cả. đó là cố ý. Bạn không phục vụ gì (204), nó không hiển thị gì cả. Để chứng minh bạn đã phục vụ 204, hãy sử dụng curl.
jnovack

4

Theo định nghĩa mã trạng thái, tôi tin rằng bạn muốn nó là 204 chứ không phải 200. 200 cần có tài nguyên trong phản hồi hoặc tôi nghi ngờ hầu hết các trình duyệt lành mạnh sẽ bị nhầm lẫn bởi điều này. Một cái khác bạn có thể sử dụng là 304, dành cho nội dung được lưu trữ.

http://www.w3.org/Prot Protocol / rfc2616 / rcc2616-sec10.html


Chắc chắn, làm cho nó một 204, làm thế nào để tôi làm điều đó? Mặc dù tôi rất nghi ngờ bất kỳ trình duyệt nào sẽ bị nhầm lẫn bởi một cơ thể trống rỗng.
Theo

1
một cơ thể trống vẫn là một phản hồi, với một đối tượng, chẳng hạn như index.html trống. Những gì bạn yêu cầu là cung cấp 200 phản hồi mà không có tài nguyên nào được đính kèm (không có tệp nào được cung cấp). Về cách chính xác để làm điều đó trên nginx, tôi cần phải tự tìm kiếm nó, tôi chỉ một lần thực hiện điều này trên apache, và tôi không thể nhớ ra.
sandroid

304 có vẻ như nó sẽ gửi tất cả các tín hiệu sai cho những thứ như gỡ lỗi và trả lại tạm thời.
Kzqai

2

Để hoàn thành câu trả lời của @Martin Fjordval, hãy cẩn thận nếu bạn đang sử dụng cấu hình như vậy để kiểm tra sức khỏe.

Mặc dù 204mã HTTP hoàn hảo về mặt ngữ nghĩa đối với kiểm tra sức khỏe (chỉ dẫn thành công không có nội dung), một số dịch vụ không coi đó là thành công.

Cụ thể, tôi gặp vấn đề với Google Cloud Load-balulators .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.