Bagaimana saya bisa mengembalikan status 503 di apache tanpa menggunakan skrip eksternal

26

Saya perlu mengembalikan kode status 503 dari salah satu situs saya saat sedang dalam perbaikan, dengan cara SE_firendly yang dihormati waktu. Sepertinya saya tidak bisa mengetahui cara melakukan ini tanpa menggunakan skrip eksternal, yang saya lebih suka hindari.

Apakah ada arahan apache yang memungkinkan saya mengembalikan kode status HTTP sewenang-wenang tanpa menggunakan peretasan seperti menggunakan skrip php yang menetapkan header status?

dan mackinlay
sumber
2
Saya tidak yakin bahwa menjalankan file PHP mengklasifikasikan sebagai "hack" ... itu semacam apa web server yang dirancang untuk melakukan ...
Mark Henderson
3
Hm Saya pikir menggunakan bahasa scripting yang ditafsirkan secara keseluruhan untuk menetapkan satu baris respon server memenuhi syarat sebagai hack. Menetapkan baris tajuk respons tanpa penyelesaian yang rumit bagi saya tampaknya lebih dekat dengan apa yang dirancang untuk dilakukan oleh server web.
dan mackinlay
Pertanyaan yang sama di webmasters.stackexchange.com/questions/61241/…
rubo77

Jawaban:

32

Ini melayani setiap permintaan halaman induk statis bersama dengan status 503.

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

RedirectMatch digunakan untuk meniadakan halaman holding itu sendiri yang jika tidak akan membuat loop tak terbatas.

mod_header digunakan untuk mengatur header Retry-After sehingga Anda dapat memberi tahu Google / bot lain, dll bahwa Anda harus membuat cadangan setelah 18000 detik (5 jam) dalam contoh ini. Anda dapat sudo ap2enmod headermengaktifkan mod_header (yang diperlukan untuk arahan Header).

penelitian muffin
sumber
2
+1: Komentar samping: Anda hanya dapat menambahkan [RedirectMatch 503. *] Dan aturan [Header selalu mengatur Coba Lagi-Setelah "18000"] dan berfungsi dengan pesan kesalahan 503 default. Periksa file conf.d / localized-error-pages untuk mengatur pesan yang berbeda untuk bahasa yang berbeda (yang memerlukan negosiasi, alias dan termasuk modul).
lepe
Berhasil! Untuk situs web pribadi saya, saya menggunakan RedirectMatch 503 ^/(?!\.Error/.*|dragonlord-bg\.jpg).
bwDraco
7

Mencoba

Redirect 503 / /

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

Kode status lainnya dapat dikembalikan dengan memberikan kode status numerik sebagai nilai status. Jika statusnya antara 300 dan 399, argumen URL harus ada, jika tidak harus dihilangkan. Perhatikan bahwa statusnya harus diketahui oleh kode Apache (lihat fungsi send_error_response di http_protocol.c).

Catatan tambahan: Ini akan menampilkan DokumenDokumen default / dikonfigurasi untuk Kesalahan 503.

David Pashley
sumber
Terima kasih david. mod_alias bukan tempat saya diharapkan menemukan jawaban itu, tetapi tampaknya melakukan pekerjaan itu.
dan mackinlay
yeah, Redirect tidak benar-benar kata kerja yang tepat untuk apa yang Anda lakukan :)
David Pashley
Redirect 503 tidak ada satu argumen, jalur URL, yang selalu wajib. URL di sisi lain harus dihilangkan jika kode yang dialihkan tidak
1
Saya mendapatkan kesalahan saat melakukan itu: "Redirect membutuhkan dua atau tiga argumen, status opsional, lalu mendokumentasikan untuk diarahkan dan URL tujuan", dapatkah Anda memberikan contoh yang lebih lengkap dalam konteks?
Tom
4
Redirect 503 /sepertinya berhasil.
mpartel
0

Untuk membuat mode pemeliharaan Anda lebih fleksibel, atur 503 ketika ada file khusus, ala:

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

CATATAN: Lokasi DOCUMENT_ROOT dapat berbeda antara httpd 2.2 dan 2.4

Dengan cara ini, yang perlu Anda lakukan adalah "menyentuh /path/to/docroot/.maintenance" dan situs Anda akan langsung mulai mengembalikan 503-an. Kemudian untuk menjadikannya semua murni, buat halaman kesalahan html yang diformat dengan baik dan tambahkan ini ke file konfigurasi server apache yang benar:

ProxyErrorOverride on
ErrorDocument 503 /error/503.html

Dan untuk poin bonus jika Anda memiliki beberapa server web, jadikan lokasi .memelihara pada sistem file bersama, atau untuk lebih banyak poin bonus:

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

Keuntungan membuat file mode perawatan berbasis adalah berfungsi ketika aplikasi Anda tidak, itu cepat dan sederhana, dan lebih mudah untuk proxy cache frontend untuk menangani karena Anda dapat menangani semua backend 503 dalam satu gerakan sekaligus.

Sumber:

Phil
sumber