¿Cómo puedo devolver un estado 503 en apache sin invocar scripts externos?

26

Necesito devolver un código de estado 503 de uno de mis sitios mientras está fuera de servicio por mantenimiento, de la manera tradicional SE_firendly. Parece que no puedo resolver cómo hacer esto sin invocar scripts externos, lo que prefiero evitar.

¿Existe una directiva de apache que me permita devolver un código de estado HTTP arbitrario sin recurrir a hacks como invocar un script php que establece el encabezado de estado?

dan mackinlay
fuente
2
No estoy muy seguro de que ejecutar un archivo PHP clasifique como un "hack" ... eso es exactamente para lo que está diseñado un servidor web ...
Mark Henderson
3
Hm. Creo que invocar todo un lenguaje de script interpretado para establecer una sola línea de respuesta del servidor califica como hack. Establecer líneas de encabezados de respuesta sin soluciones elaboradas me parece más cercano a lo que los servidores web fueron diseñados para hacer.
dan mackinlay

Respuestas:

32

Esto sirve a cada solicitud de una página de retención estática junto con el estado 503.

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

RedirectMatch se utiliza para negar la página de retención en sí misma que de lo contrario crearía un bucle infinito.

mod_header se usa para configurar un encabezado Retry-After para que pueda decirle a Google / otros bots, etc. que debe hacer una copia de seguridad después de 18000 segundos (5 horas) en este ejemplo. Puede sudo ap2enmod headeractivar mod_header (que se requiere para la directiva Header).

muffinresearch
fuente
2
+1: Un comentario secundario: solo puede agregar [RedirectMatch 503. *] Y las reglas [Encabezado siempre establecen Reintentar después de "18000"] y funciona con el mensaje de error 503 predeterminado. Verifique el archivo conf.d / localized-error-pages para configurar un mensaje diferente para diferentes idiomas (estos requieren negociación, alias e incluir módulos).
lepe
¡Funciona! Para mi sitio web personal, yo uso RedirectMatch 503 ^/(?!\.Error/.*|dragonlord-bg\.jpg).
bwDraco
7

Tratar

Redirect 503 / /

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

Se pueden devolver otros códigos de estado dando el código de estado numérico como el valor del estado. Si el estado está entre 300 y 399, el argumento URL debe estar presente; de ​​lo contrario, debe omitirse. Tenga en cuenta que el código de Apache debe conocer el estado (consulte la función send_error_response en http_protocol.c).

Nota adicional: Esto mostrará el ErrorDocument predeterminado / configurado para el Error 503.

David Pashley
fuente
Gracias david mod_alias no es donde esperaba encontrar esa respuesta, pero parece hacer el trabajo.
dan mackinlay
sí, Redirect no es realmente el verbo correcto para lo que estás haciendo :)
David Pashley
Redirect 503 le falta un argumento, URL-path, que siempre es obligatorio. Por otro lado, se debe omitir la URL si el código redirigido no es 300-399
1
Me da un error al hacer eso: "Redirigir toma dos o tres argumentos, un estado opcional, luego el documento para ser redirigido y la URL de destino", ¿puede dar un ejemplo más completo en contexto?
Tom
44
Redirect 503 /parece funcionar.
mpartel
0

Para hacer que su modo de mantenimiento sea más flexible, configure 503 cuando exista un archivo especial, ala:

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

NOTA: La ubicación de DOCUMENT_ROOT puede diferir entre httpd 2.2 y 2.4

De esta manera, todo lo que necesita hacer es "touch /path/to/docroot/.maintenance" y su sitio comenzará a devolver 503 instantáneamente. Luego, para que todo esté en orden, cree una página de error html bien formateada personalizada y agréguela al archivo de configuración del servidor apache correcto:

ProxyErrorOverride on
ErrorDocument 503 /error/503.html

Y para obtener puntos de bonificación si tiene varios servidores web, haga la ubicación de .maintenance en un sistema de archivos compartido o para obtener aún más puntos de bonificación:

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

La ventaja de hacer que el archivo de modo de mantenimiento se base es que funciona cuando su aplicación no lo hace, es rápido y simple, y es más fácil de manejar para un proxy de almacenamiento en caché de la interfaz porque puede manejar todos los 503 del backend de una sola vez.

Fuentes:

Phil
fuente