Serveur Apache HTTP Version 2.0
Il est possible à un administrateur Apache de configurer les réponses d'Apache dans les cas où des erreurs ou problèmes se présentent.
Des réponses paramétrables peuvent être définies pour être activées au cas où le serveur détecterait une erreur ou un problème.
Quand un script plante et génère une réponse "500 Server Error", sa réponse peut être remplacée par un message plus convivial, ou par une redirection vers une autre URL (locale, ou sur un autre serveur).
NCSA httpd 1.3 renvoyait un message d'erreur insipide qui ne présentait le plus souvent aucun sens ni à l'utilisateur, ni dans les journaux d'enregistrement sur des symptômes causant le plantage.
Le serveur peut être paramétré pour :
La redirection vers une autre URL peut être utile, mais seulement si des informations peuvent être envoyées pour expliquer/enregistrer l'erreur ou le problème plus clairement.
Pour y parvenir, Apache définit de nouvelles variables d'environnement CGI :
REDIRECT_HTTP_ACCEPT=*/*, image/gif, image/x-xbitmap,
image/jpeg
REDIRECT_HTTP_USER_AGENT=Mozilla/1.1b2 (X11; I; HP-UX A.09.05
9000/712)
REDIRECT_PATH=.:/bin:/usr/local/bin:/etc
REDIRECT_QUERY_STRING=
REDIRECT_REMOTE_ADDR=121.345.78.123
REDIRECT_REMOTE_HOST=ooh.ahhh.com
REDIRECT_SERVER_NAME=crash.bang.edu
REDIRECT_SERVER_PORT=80
REDIRECT_SERVER_SOFTWARE=Apache/0.8.15
REDIRECT_URL=/cgi-bin/buggy.pl
Notez que le préfixe REDIRECT_
est présent pour toutes
ces variables d'environnement.
Au minimum, REDIRECT_URL
et
REDIRECT_QUERY_STRING
seront passées à la nouvelle
URL (en supposant qu'il s'agisse d'un script CGI ou d'un
include CGI). Les autres variables ne sont définies que si
elles existaient avant l'apparition du problème ou de l'erreur.
Aucune de ces variables ne sera
définie si votre directive ErrorDocument
entraîne une redirection vers un serveur externe ;
tout ce qui commence par http:
est considéré comme
une redirection externe, y compris si cela pointe vers le
serveur local.
Il est possible d'utiliser la directive
ErrorDocument
dans les fichiers
.htaccess si AllowOverride
est
paramétrée pour le permettre.
Voici quelques exemples :
ErrorDocument 500 /cgi-bin/crash-recover
ErrorDocument 500 "Sorry, our script crashed. Oh dear"
ErrorDocument 500 http://xxx/
ErrorDocument 404 /Lame_excuses/not_found.html
ErrorDocument 401 /Subscription/how_to_subscribe.html
La syntaxe à utiliser est :
ErrorDocument <code-à-3-chiffres> <action>
où l'action peut désigner :
Le fonctionnement d'Apache vis-à-vis des redirections a été modifié afin que les nouvelles variables d'environnement soient disponibles pour un script ou un server-include.
Les variables CGI standard étaient passées au script sur lequel pointe la redirection. Aucune indication sur la provenance de la redirection n'était fournie.
Une série de nouvelles variables d'environnement est
initialisée pour être passée au script sur lequel pointe
la redirection. Chacune de ces variables est munie du préfixe
REDIRECT_
. Les variables d'environnement
REDIRECT_
sont créées à partir des variables
d'environnement "normales", telles qu'existant avant la
redirection, mais simplement renommées au moyen du préfixe
REDIRECT_
; ainsi par exemple HTTP_USER_AGENT
devient REDIRECT_HTTP_USER_AGENT
. En plus de ces
nouvelles variables, Apache définit REDIRECT_URL
et REDIRECT_status
pour aider le script à
comprendre d'où il a été appelé. L'URL d'origine et l'URL
redirigée sont toutes deux ajoutées dans le journal "access".
Si ErrorDocument
précise une redirection
locale vers un script CGI, ce script devrait inclure un
champ "Status:
" dans son en-tête de transmission
afin d'assurer que le client reçoive bien le code d'erreur et
puisse comprendre ce qui l'a causé. Par exemple, un script
Perl ErrorDocument pourrait inclure quelque chose comme :
...
print "Content-type: text/html\n";
printf "Status: %s Condition Intercepted\n", $ENV{"REDIRECT_STATUS"};
...
Un script dédié à la gestion d'une erreur donnée,
telle que 404 Not Found
, peut bien sûr
utiliser le code spécifique d'erreur et le texte associé.
Notez que le script doit envoyer l'en-tête
Status:
appropriée (comme par exemple
302 Found
), si la réponse contient un en-tête
Location:
(pour générer la redirection coté client).
Sans cet en-tête Status:
, Location:
n'aura
pas d'effet.