Làm cách nào tôi có thể trả lại trạng thái 503 trong apache mà không cần gọi các tập lệnh bên ngoài


26

Tôi cần trả lại mã trạng thái 503 từ một trong các trang web của mình trong khi nó đang được bảo trì, theo kiểu SE_firendly được tôn vinh theo thời gian. Tôi dường như không thể tìm ra cách để làm điều này mà không cần gọi các tập lệnh bên ngoài, điều mà tôi muốn tránh.

Có một lệnh apache nào cho phép tôi trả về mã trạng thái HTTP tùy ý mà không cần dùng đến các bản hack như gọi một tập lệnh php để đặt tiêu đề trạng thái không?


2
Tôi không chắc chắn rằng việc chạy tệp PHP được phân loại là "hack" ... đó chính xác là những gì một máy chủ web được thiết kế để làm ...
Mark Henderson

3
Hừm. Tôi nghĩ rằng việc gọi toàn bộ ngôn ngữ kịch bản được diễn giải để đặt một dòng phản hồi của máy chủ sẽ đủ điều kiện là hack. Thiết lập các dòng tiêu đề phản hồi mà không có cách giải quyết phức tạp đối với tôi dường như gần hơn với những gì máy chủ web được thiết kế để làm.
dan mackinlay

Câu trả lời:


32

Điều này phục vụ mọi yêu cầu một trang giữ tĩnh cùng với trạng thái 503.

RedirectMatch 503 ^/(?!holding\.html)
ErrorDocument 503 /holding.html
Header always set Retry-After "18000"

RedirectMatch được sử dụng để phủ định chính trang đang giữ mà sẽ tạo ra một vòng lặp vô hạn.

mod_header được sử dụng để đặt tiêu đề Retry-After để bạn có thể nói với Google / các bot khác, v.v. bạn nên sao lưu sau 18000 giây (5 giờ) trong ví dụ này. Bạn có thể sudo ap2enmod headerkích hoạt mod_header (cần thiết cho lệnh Header).


2
+1: Nhận xét phụ: Bạn chỉ có thể thêm [RedirectMatch 503. *] Và [Tiêu đề luôn đặt quy tắc Retry-After "18000"] và nó hoạt động với thông báo lỗi 503 mặc định. Kiểm tra tệp conf.d / localized-error-page để đặt một thông báo khác nhau cho các ngôn ngữ khác nhau (những ngôn ngữ yêu cầu đàm phán, bí danh và bao gồm các mô-đun).
lepe

Nó hoạt động! Đối với trang web cá nhân của tôi, tôi sử dụng RedirectMatch 503 ^/(?!\.Error/.*|dragonlord-bg\.jpg).
bwDraco

7

Thử

Redirect 503 / /

Từ http://httpd.apache.org/docs/2.2/mod/mod_alias.html#redirect :

Các mã trạng thái khác có thể được trả về bằng cách đưa mã trạng thái số làm giá trị của trạng thái. Nếu trạng thái nằm trong khoảng từ 300 đến 399, thì phải có đối số URL, nếu không thì phải bỏ qua. Lưu ý rằng trạng thái phải được biết đến với mã Apache (xem hàm send_error_response trong http_protatio.c).

Lưu ý bổ sung: Điều này sẽ hiển thị ErrorDocument mặc định / được cấu hình cho Lỗi 503.


Cảm ơn david. mod_alias không phải là nơi tôi mong đợi để tìm câu trả lời, nhưng nó dường như thực hiện công việc.
dan mackinlay

vâng, Redirect không thực sự là động từ đúng cho những gì bạn đang làm :)
David Pashley

Chuyển hướng 503 nó thiếu một đối số, đường dẫn URL, luôn luôn bắt buộc. Mặt khác, URL phải được bỏ qua nếu mã được chuyển hướng không phải là 300-399

1
Tôi gặp một lỗi khi làm điều đó: "Chuyển hướng mất hai hoặc ba đối số, trạng thái tùy chọn, sau đó tài liệu được chuyển hướng và URL đích", bạn có thể đưa ra một ví dụ đầy đủ hơn trong ngữ cảnh không?
Tom

4
Redirect 503 /dường như làm việc
mpartel

0

Để làm cho chế độ bảo trì của bạn linh hoạt hơn, hãy đặt 503 khi có tệp đặc biệt, ala:

RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}/.maintenance -f
RewriteRule .* - [R=503]

LƯU Ý: Vị trí của DOCUMENT_ROOT có thể khác nhau giữa httpd 2.2 và 2.4

Bằng cách này, tất cả những gì bạn cần làm là "chạm /path/to/docroot/.maintenance" và trang web của bạn sẽ ngay lập tức bắt đầu quay lại 503. Sau đó, để làm cho tất cả thuần túy, hãy tạo một trang lỗi html được định dạng độc đáo và thêm trang này vào tệp cấu hình của máy chủ apache chính xác:

ProxyErrorOverride on
ErrorDocument 503 /error/503.html

Và đối với điểm thưởng nếu bạn có nhiều máy chủ web, hãy tạo vị trí .maintenance trên hệ thống tệp được chia sẻ hoặc để có thêm điểm thưởng:

pdsh -w $web1_ip,$web2_ip,$web3_ip "sudo touch /path/to/docroot/.maintenance"

Ưu điểm của việc tạo tệp chế độ bảo trì dựa trên là nó hoạt động khi ứng dụng của bạn không hoạt động, nó nhanh chóng và đơn giản và dễ dàng hơn để xử lý proxy bộ nhớ đệm trước vì bạn có thể xử lý tất cả 503 phụ trợ trong một cú trượt.

Nguồn:

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.