ฉันจะคืนสถานะ 503 ใน apache ได้อย่างไรโดยไม่ต้องเรียกใช้สคริปต์ภายนอก


26

ฉันต้องส่งคืนรหัสสถานะ 503 จากหนึ่งในไซต์ของฉันในขณะที่ไม่สามารถทำการบำรุงรักษาได้ในแบบ SE_firendly ฉันไม่สามารถหาวิธีทำสิ่งนี้ได้โดยไม่ต้องเรียกใช้สคริปต์ภายนอกซึ่งฉันควรหลีกเลี่ยง

มีคำสั่ง apache ซึ่งจะช่วยให้ฉันกลับรหัสสถานะ HTTP โดยไม่ต้องหันไปแฮ็กเช่นการเรียกสคริปต์ PHP ที่ตั้งส่วนหัวสถานะ?


2
ผมไม่แน่ใจว่าการทำงานที่จัดประเภทไฟล์ PHP เป็น "สับ" ... นั่นคือการจัดเรียงของสิ่งที่เว็บเซิร์ฟเวอร์ถูกออกแบบมาเพื่อทำ ...
มาร์คเฮนเดอ

3
ฮึ่ม ฉันคิดว่าการใช้ภาษาสคริปต์ตีความทั้งหมดเพื่อตั้งบรรทัดเดียวของการตอบสนองของเซิร์ฟเวอร์จะถือว่าเป็นแฮ็ค การตั้งค่าบรรทัดของส่วนหัวการตอบสนองโดยไม่มีวิธีแก้ไขปัญหาที่ซับซ้อนดูเหมือนว่าฉันจะเข้าใกล้เว็บเซิร์ฟเวอร์ที่ได้รับการออกแบบให้ทำ
แดน Mackinlay

คำถามเดียวกันที่webmasters.stackexchange.com/questions/61241/ …
rubo77

คำตอบ:


32

สิ่งนี้ทำหน้าที่ร้องขอโฮลดิ้งเพจแบบคงที่ทุกครั้งพร้อมกับสถานะ 503

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

RedirectMatch ใช้ในการปฏิเสธหน้าโฮลดิ้งซึ่งจะเป็นการสร้างวงวนไม่สิ้นสุด

mod_header ใช้เพื่อตั้งค่าส่วนหัว Retry-After เพื่อให้คุณสามารถบอก Google / บ็อตอื่น ๆ เป็นต้นว่าคุณควรสำรองข้อมูลหลังจาก 18000 วินาที (5 ชั่วโมง) ในตัวอย่างนี้ คุณสามารถsudo ap2enmod headerเปิดใช้งาน mod_header (ซึ่งจำเป็นสำหรับคำสั่ง Header)


2
+1: ความคิดเห็นด้านข้าง: คุณสามารถเพิ่มได้เพียง [RedirectMatch 503. *] และ [ส่วนหัวตั้งกฎลองใหม่อีกครั้งหลังจาก "18000"] และจะทำงานกับข้อความแสดงข้อผิดพลาด 503 ที่เป็นค่าเริ่มต้น ตรวจสอบไฟล์ conf.d / localized-error-pages เพื่อตั้งค่าข้อความที่แตกต่างกันสำหรับภาษาต่างๆ (ผู้ที่ต้องการเจรจาต่อรองนามแฝงและรวมถึงโมดูล)
lepe

มันได้ผล! RedirectMatch 503 ^/(?!\.Error/.*|dragonlord-bg\.jpg)สำหรับเว็บไซต์ส่วนตัวของฉันฉันใช้
bwDraco

7

ลอง

Redirect 503 / /

จากhttp://httpd.apache.org/docs/2.2/mod/mod_alias.html#redirect :

รหัสสถานะอื่น ๆ สามารถส่งคืนได้โดยให้รหัสสถานะที่เป็นตัวเลขเป็นค่าสถานะ หากสถานะอยู่ระหว่าง 300 ถึง 399 อาร์กิวเมนต์ URL ต้องแสดงอยู่ไม่เช่นนั้นจะต้องละเว้น โปรดทราบว่าต้องรู้จักสถานะของรหัส Apache (ดูฟังก์ชัน send_error_response ใน http_protocol.c)

หมายเหตุเพิ่มเติม: นี่จะแสดง ErrorDocument เริ่มต้น / กำหนดค่าสำหรับข้อผิดพลาด 503


ขอบคุณเดวิด mod_alias ไม่ใช่ที่ที่ฉันคาดว่าจะพบคำตอบนั้น แต่ดูเหมือนว่าจะทำงาน
แดน Mackinlay

ใช่เปลี่ยนเส้นทางไม่ได้จริงๆคำกริยาที่เหมาะสมสำหรับสิ่งที่คุณทำ :)
เดวิด Pashley

เปลี่ยนเส้นทาง 503 ไม่มี URL เส้นทางหนึ่งซึ่งเป็นข้อบังคับเสมอ URL จะต้องถูกละเว้นหากรหัสที่เปลี่ยนเส้นทางไม่ใช่ 300-399

1
ฉันได้รับข้อผิดพลาด: "การเปลี่ยนเส้นทางใช้อาร์กิวเมนต์สองหรือสามข้อสถานะที่เป็นตัวเลือกจากนั้นเอกสารที่จะเปลี่ยนเส้นทางและ URL ปลายทาง" คุณช่วยยกตัวอย่างที่สมบูรณ์มากขึ้นในบริบทได้หรือไม่
Tom

4
Redirect 503 /ดูเหมือนว่าจะทำงาน
mpartel

0

หากต้องการทำให้โหมดการบำรุงรักษาของคุณมีความยืดหยุ่นยิ่งขึ้นให้ตั้งค่า 503 เมื่อมีไฟล์พิเศษเช่น

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

หมายเหตุ: ตำแหน่งของ DOCUMENT_ROOT อาจแตกต่างกันระหว่าง httpd 2.2 และ 2.4

วิธีนี้เป็นสิ่งที่คุณต้องทำคือ "touch /path/to/docroot/.maintenance" และเว็บไซต์ของคุณจะเริ่มส่งคืน 503 ทันที จากนั้นเพื่อให้มันหมดจดสร้างหน้าข้อผิดพลาดในรูปแบบ html ที่กำหนดเองและเพิ่มสิ่งนี้ไปยังไฟล์ config ของเซิร์ฟเวอร์ Apache ที่ถูกต้อง:

ProxyErrorOverride on
ErrorDocument 503 /error/503.html

และสำหรับคะแนนโบนัสหากคุณมีเว็บเซิร์ฟเวอร์หลายแห่งอาจทำให้ตำแหน่งของการบำรุงรักษาบนระบบไฟล์ที่ใช้ร่วมกันหรือสำหรับคะแนนโบนัสมากยิ่งขึ้น:

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

ข้อได้เปรียบของการสร้างไฟล์โหมดการบำรุงรักษาคือใช้งานได้เมื่อแอปพลิเคชันของคุณไม่รวดเร็วและง่ายกว่าและง่ายกว่าสำหรับพร็อกซีแคชส่วนหน้าในการจัดการเนื่องจากคุณสามารถจัดการแบ็คเอนด์ 503 ทั้งหมดในคราวเดียว

แหล่งที่มา:

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.