summaryrefslogtreecommitdiff
path: root/docs/manual/misc/custom_errordocs.html
diff options
context:
space:
mode:
Diffstat (limited to 'docs/manual/misc/custom_errordocs.html')
-rw-r--r--docs/manual/misc/custom_errordocs.html433
1 files changed, 0 insertions, 433 deletions
diff --git a/docs/manual/misc/custom_errordocs.html b/docs/manual/misc/custom_errordocs.html
deleted file mode 100644
index c2c2310a13..0000000000
--- a/docs/manual/misc/custom_errordocs.html
+++ /dev/null
@@ -1,433 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<HTML>
-<HEAD>
-<TITLE>International Customized Server Error Messages</TITLE>
-</HEAD>
-
-<!-- Background white, links blue (unvisited), navy (visited), red (active) -->
-<BODY
- BGCOLOR="#FFFFFF"
- TEXT="#000000"
- LINK="#0000FF"
- VLINK="#000080"
- ALINK="#FF0000"
->
-<!--#include virtual="header.html" -->
-
-<H1 ALIGN="CENTER">Using XSSI and <SAMP>ErrorDocument</SAMP> to configure
-customized international server error responses</H1>
-<P>
-<H2>Index</H2>
-<UL>
- <LI><A HREF="#intro">Introduction</A>
- <LI><A HREF="#createdir">Creating an ErrorDocument directory</A>
- <LI><A HREF="#docnames">Naming the individual error document files</A>
- <LI><A HREF="#headfoot">The common header and footer files</A>
- <LI><A HREF="#createdocs">Creating ErrorDocuments in different languages</A>
- <LI><A HREF="#fallback">The fallback language</A>
- <LI><A HREF="#proxy">Customizing Proxy Error Messages</A>
- <LI><A HREF="#listings">HTML listing of the discussed example</A>
-</UL>
-<HR>
-<H2><A NAME="intro">Introduction</A></H2>
-This document describes an easy way to provide your apache WWW server
-with a set of customized error messages which take advantage of
-<A HREF="../content-negotiation.html">Content Negotiation</A>
-and <A HREF="../mod/mod_include.html">eXtended Server Side Includes (XSSI)</A>
-to return error messages generated by the server in the client's
-native language.
-</P>
-<P>
-By using XSSI, all
-<A HREF="../mod/core.html#errordocument">customized messages</A>
-can share a homogenous and consistent style and layout, and maintenance work
-(changing images, changing links) is kept to a minimum because all layout
-information can be kept in a single file.<BR>
-Error documents can be shared across different servers, or even hosts,
-because all varying information is inserted at the time the error document
-is returned on behalf of a failed request.
-</P>
-<P>
-Content Negotiation then selects the appropriate language version of a
-particular error message text, honoring the language preferences passed
-in the client's request. (Users usually select their favorite languages
-in the preferences options menu of today's browsers). When an error
-document in the client's primary language version is unavailable, the
-secondary languages are tried or a default (fallback) version is used.
-</P>
-<P>
-You have full flexibility in designing your error documents to
-your personal taste (or your company's conventions). For demonstration
-purposes, we present a simple generic error document scheme.
-For this hypothetic server, we assume that all error messages...
-<UL>
-<LI>possibly are served by different virtual hosts (different host name,
- different IP address, or different port) on the server machine,
-<LI>show a predefined company logo in the right top of the message
- (selectable by virtual host),
-<LI>print the error title first, followed by an explanatory text and
- (depending on the error context) help on how to resolve the error,
-<LI>have some kind of standardized background image,
-<LI>display an apache logo and a feedback email address at the bottom
- of the error message.
-</UL>
-</P>
-
-<P>
-An example of a "document not found" message for a german client might
-look like this:<BR>
-<IMG SRC="../images/custom_errordocs.gif"
- ALT="[Needs graphics capability to display]"><BR>
-All links in the document as well as links to the server's administrator
-mail address, and even the name and port of the serving virtual host
-are inserted in the error document at "run-time", <EM>i.e.</EM>, when the error
-actually occurs.
-</P>
-
-<H2><A NAME="createdir">Creating an ErrorDocument directory</A></H2>
-
-For this concept to work as easily as possible, we must take advantage
-of as much server support as we can get:
-<OL>
- <LI>By defining the <A HREF="../mod/core.html#options">MultiViews option</A>,
- we enable the language selection of the most appropriate language
- alternative (content negotiation).
- <LI>By setting the
- <A HREF="../mod/mod_negotiation.html#languagepriority"
- >LanguagePriority</A>
- directive we define a set of default fallback languages in the situation
- where the client's browser did not express any preference at all.
- <LI>By enabling <A HREF="../mod/mod_include.html">Server Side Includes</A>
- (and disallowing execution of cgi scripts for security reasons),
- we allow the server to include building blocks of the error message,
- and to substitute the value of certain environment variables into the
- generated document (dynamic HTML) or even to conditionally include
- or omit parts of the text.
- <LI>The <A HREF="../mod/mod_mime.html#addhandler">AddHandler</A> and
- <A HREF="../mod/mod_mime.html#addtype">AddType</A> directives are useful
- for automatically XSSI-expanding all files with a <SAMP>.shtml</SAMP>
- suffix to <EM>text/html</EM>.
- <LI>By using the <A HREF="../mod/mod_alias.html#alias">Alias</A> directive,
- we keep the error document directory outside of the document tree
- because it can be regarded more as a server part than part of
- the document tree.
- <LI>The <A HREF="../mod/core.html#directory">&lt;Directory&gt;</A>-Block
- restricts these "special" settings to the error document directory
- and avoids an impact on any of the settings for the regular document tree.
- <LI>For each of the error codes to be handled (see RFC2068 for an exact
- description of each error code, or look at
- <CODE>src/main/http_protocol.c</CODE>
- if you wish to see apache's standard messages), an
- <A HREF="../mod/core.html#errordocument">ErrorDocument</A>
- in the aliased <SAMP>/errordocs</SAMP> directory is defined.
- Note that we only define the basename of the document here
- because the MultiViews option will select the best candidate
- based on the language suffixes and the client's preferences.
- Any error situation with an error code <EM>not</EM> handled by a
- custom document will be dealt with by the server in the standard way
- (<EM>i.e.</EM>, a plain error message in english).
- <LI>Finally, the <A HREF="../mod/core.html#allowoverride">AllowOverride</A>
- directive tells apache that it is not necessary to look for
- a .htaccess file in the /errordocs directory: a minor speed
- optimization.
-</OL>
-The resulting <SAMP>httpd.conf</SAMP> configuration would then look
-similar to this: <SMALL>(Note that you can define your own error
-messages using this method for only part of the document tree,
-e.g., a /~user/ subtree. In this case, the configuration could as well
-be put into the .htaccess file at the root of the subtree, and
-the &lt;Directory&gt; and &lt;/Directory&gt; directives -but not
-the contained directives- must be omitted.)</SMALL>
-<PRE>
- LanguagePriority en fr de
- Alias /errordocs /usr/local/apache/errordocs
- &lt;Directory /usr/local/apache/errordocs&gt;
- AllowOverride none
- Options MultiViews IncludesNoExec FollowSymLinks
- AddType text/html .shtml
- &lt;FilesMatch "\.shtml[.$]"&gt;
- SetOutputFilter INCLUDES
- &lt;/FilesMatch&gt;
- &lt;/Directory&gt;
- # "400 Bad Request",
- ErrorDocument 400 /errordocs/400
- # "401 Authorization Required",
- ErrorDocument 401 /errordocs/401
- # "403 Forbidden",
- ErrorDocument 403 /errordocs/403
- # "404 Not Found",
- ErrorDocument 404 /errordocs/404
- # "500 Internal Server Error",
- ErrorDocument 500 /errordocs/500
-</PRE>
-The directory for the error messages (here:
-<SAMP>/usr/local/apache/errordocs/</SAMP>) must then be created with the
-appropriate permissions (readable and executable by the server uid or gid,
-only writable for the administrator).
-
-<H3><A NAME="docnames">Naming the individual error document files</A></H3>
-
-By defining the <SAMP>MultiViews</SAMP> option, the server was told to
-automatically scan the directory for matching variants (looking at language
-and content type suffixes) when a requested document was not found.
-In the configuration, we defined the names for the error documents to be
-just their error number (without any suffix).
-<P>
-The names of the individual error documents are now determined like this
-(I'm using 403 as an example, think of it as a placeholder for any of
-the configured error documents):
-<UL>
- <LI>No file errordocs/403 should exist. Otherwise, it would be found and
- served (with the DefaultType, usually text/plain), all negotiation
- would be bypassed.
- <LI>For each language for which we have an internationalized version
- (note that this need not be the same set of languages for each
- error code - you can get by with a single language version until
- you actually <EM>have</EM> translated versions), a document
- <SAMP>errordocs/403.shtml.<EM>lang</EM></SAMP> is created and
- filled with the error text in that language (<A HREF="#createdocs">see
- below</A>).
- <LI>One fallback document called <SAMP>errordocs/403.shtml</SAMP> is
- created, usually by creating a symlink to the default language
- variant (<A HREF="#fallback">see below</A>).
-</UL>
-
-<H3><A NAME="headfoot">The common header and footer files</A></H3>
-
-By putting as much layout information in two special "include files",
-the error documents can be reduced to a bare minimum.
-<P>
-One of these layout files defines the HTML document header
-and a configurable list of paths to the icons to be shown in the resulting
-error document. These paths are exported as a set of XSSI environment
-variables and are later evaluated by the "footer" special file.
-The title of the current error (which is
-put into the TITLE tag and an H1 header) is simply passed in from the main
-error document in a variable called <CODE>title</CODE>.<BR>
-<STRONG>By changing this file, the layout of all generated error
-messages can be changed in a second.</STRONG>
-(By exploiting the features of XSSI, you can easily define different
-layouts based on the current virtual host, or even based on the
-client's domain name).
-<P>
-The second layout file describes the footer to be displayed at the bottom
-of every error message. In this example, it shows an apache logo, the current
-server time, the server version string and adds a mail reference to the
-site's webmaster.
-<P>
-For simplicity, the header file is simply called <CODE>head.shtml</CODE>
-because it contains server-parsed content but no language specific
-information. The footer file exists once for each language translation,
-plus a symlink for the default language.<P>
-<STRONG>Example:</STRONG> for English, French and German versions
-(default english)<BR>
-<CODE>foot.shtml.en</CODE>,<BR>
-<CODE>foot.shtml.fr</CODE>,<BR>
-<CODE>foot.shtml.de</CODE>,<BR>
-<CODE>foot.shtml</CODE> symlink to <CODE>foot.shtml.en</CODE><P>
-Both files are included into the error document by using the
-directives <CODE>&lt;!--#include virtual="head" --&gt;</CODE>
-and <CODE>&lt;!--#include virtual="foot" --&gt;</CODE>
-respectively: the rest of the magic occurs in mod_negotiation and
-in mod_include.
-<P>
-
-See <A HREF="#listings">the listings below</A> to see an actual HTML
-implementation of the discussed example.
-
-
-<H3><A NAME="createdocs">Creating ErrorDocuments in different languages</A>
-</H3>
-
-After all this preparation work, little remains to be said about the
-actual documents. They all share a simple common structure:
-<PRE>
-&lt;!--#set var="title" value="<EM>error description title</EM>" --&gt;
-&lt;!--#include virtual="head" --&gt;
- <EM>explanatory error text</EM>
-&lt;!--#include virtual="foot" --&gt;
-</PRE>
-In the <A HREF="#listings">listings section</A>, you can see an example
-of a [400 Bad Request] error document. Documents as simple as that
-certainly cause no problems to translate or expand.
-
-<H3><A NAME="fallback">The fallback language</A></H3>
-
-Do we need a special handling for languages other than those we have
-translations for? We did set the LanguagePriority, didn't we?!
-<P>
-Well, the LanguagePriority directive is for the case where the client does
-not express any language priority at all. But what
-happens in the situation where the client wants one
-of the languages we do not have, and none of those we do have?
-<P>
-Without doing anything, the Apache server will usually return a
-[406 no acceptable variant] error, listing the choices from which the client
-may select. But we're in an error message already, and important error
-information might get lost when the client had to choose a language
-representation first.
-<P>
-So, in this situation it appears to be easier to define a fallback language
-(by copying or linking, <EM>e.g.</EM>, the english version to a language-less version).
-Because the negotiation algorithm prefers "more specialized" variants over
-"more generic" variants, these generic alternatives will only be chosen
-when the normal negotiation did not succeed.
-<P>
-A simple shell script to do it (execute within the errordocs/ dir):
-<PRE>
- for f in *.shtml.en
- do
- ln -s $f `basename $f .en`
- done
-</PRE>
-
-<P>
-</P>
-
-<H2><A NAME="proxy">Customizing Proxy Error Messages</A></H2>
-
-<P>
- As of Apache-1.3, it is possible to use the <CODE>ErrorDocument</CODE>
- mechanism for proxy error messages as well (previous versions always
- returned fixed predefined error messages).
-</P>
-<P>
- Most proxy errors return an error code of [500 Internal Server Error].
- To find out whether a particular error document was invoked on behalf
- of a proxy error or because of some other server error, and what the reason
- for the failure was, you can check the contents of the new
- <CODE>ERROR_NOTES</CODE> CGI environment variable:
- if invoked for a proxy error, this variable will contain the actual proxy
- error message text in HTML form.
-</P>
-<P>
- The following excerpt demonstrates how to exploit the <CODE>ERROR_NOTES</CODE>
- variable within an error document:
-</P>
-<PRE>
- &lt;!--#if expr="$REDIRECT_ERROR_NOTES = ''" --&gt;
- &lt;p&gt;
- The server encountered an unexpected condition
- which prevented it from fulfilling the request.
- &lt;/p&gt;
- &lt;p&gt;
- &lt;A HREF="mailto:&lt;!--#echo var="SERVER_ADMIN" --&gt;"
- SUBJECT="Error message [&lt;!--#echo var="REDIRECT_STATUS" --&gt;] &lt;!--#echo var="title" --&gt; for &lt;!--#echo var="REQUEST_URI" --&gt;"&gt;
- Please forward this error screen to &lt;!--#echo var="SERVER_NAME" --&gt;'s
- WebMaster&lt;/A&gt;; it includes useful debugging information about
- the Request which caused the error.
- &lt;pre&gt;&lt;!--#printenv --&gt;&lt;/pre&gt;
- &lt;/p&gt;
- &lt;!--#else --&gt;
- &lt;!--#echo var="REDIRECT_ERROR_NOTES" --&gt;
- &lt;!--#endif --&gt;
-</PRE>
-
-<H2><A NAME="listings">HTML listing of the discussed example</A></H2>
-
-So, to summarize our example, here's the complete listing of the
-<SAMP>400.shtml.en</SAMP> document. You will notice that it contains
-almost nothing but the error text (with conditional additions).
-Starting with this example, you will find it easy to add more error
-documents, or to translate the error documents to different languages.
-<HR><PRE>
-&lt;!--#set var="title" value="Bad Request"
---&gt;&lt;!--#include virtual="head" --&gt;&lt;P&gt;
- Your browser sent a request that this server could not understand:
- &lt;BLOCKQUOTE&gt;
- &lt;STRONG&gt;&lt;!--#echo var="REQUEST_URI" --&gt;&lt;/STRONG&gt;
- &lt;/BLOCKQUOTE&gt;
- The request could not be understood by the server due to malformed
- syntax. The client should not repeat the request without
- modifications.
- &lt;/P&gt;
- &lt;P&gt;
- &lt;!--#if expr="$HTTP_REFERER != ''" --&gt;
- Please inform the owner of
- &lt;A HREF="&lt;!--#echo var="HTTP_REFERER" --&gt;"&gt;the referring page&lt;/A&gt; about
- the malformed link.
- &lt;!--#else --&gt;
- Please check your request for typing errors and retry.
- &lt;!--#endif --&gt;
- &lt;/P&gt;
-&lt;!--#include virtual="foot" --&gt;
-</PRE><HR>
-
-Here is the complete <SAMP>head.shtml</SAMP> file (the funny line
-breaks avoid empty lines in the document after XSSI processing). Note the
-configuration section at top. That's where you configure the images and logos
-as well as the apache documentation directory. Look how this file displays
-two different logos depending on the content of the virtual host name
-($SERVER_NAME), and that an animated apache logo is shown if the browser
-appears to support it (the latter requires server configuration lines
-of the form <BR><CODE>BrowserMatch "^Mozilla/[2-4]" anigif</CODE><BR>
-for browser types which support animated GIFs).
-<HR><PRE>
-&lt;!--#if expr="$SERVER_NAME = /.*\.mycompany\.com/"
---&gt;&lt;!--#set var="IMG_CorpLogo"
- value="http://$SERVER_NAME:$SERVER_PORT/errordocs/CorpLogo.gif"
---&gt;&lt;!--#set var="ALT_CorpLogo" value="Powered by Linux!"
---&gt;&lt;!--#else
---&gt;&lt;!--#set var="IMG_CorpLogo"
- value="http://$SERVER_NAME:$SERVER_PORT/errordocs/PrivLogo.gif"
---&gt;&lt;!--#set var="ALT_CorpLogo" value="Powered by Linux!"
---&gt;&lt;!--#endif
---&gt;&lt;!--#set var="IMG_BgImage" value="http://$SERVER_NAME:$SERVER_PORT/errordocs/BgImage.gif"
---&gt;&lt;!--#set var="DOC_Apache" value="http://$SERVER_NAME:$SERVER_PORT/Apache/"
---&gt;&lt;!--#if expr="$anigif"
---&gt;&lt;!--#set var="IMG_Apache" value="http://$SERVER_NAME:$SERVER_PORT/icons/apache_anim.gif"
---&gt;&lt;!--#else
---&gt;&lt;!--#set var="IMG_Apache" value="http://$SERVER_NAME:$SERVER_PORT/icons/apache_pb.gif"
---&gt;&lt;!--#endif
---&gt;&lt;!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"&gt;
-&lt;HTML&gt;
- &lt;HEAD&gt;
- &lt;TITLE&gt;
- [&lt;!--#echo var="REDIRECT_STATUS" --&gt;] &lt;!--#echo var="title" --&gt;
- &lt;/TITLE&gt;
- &lt;/HEAD&gt;
- &lt;BODY BGCOLOR="white" BACKGROUND="&lt;!--#echo var="IMG_BgImage" --&gt;"&gt;&lt;UL&gt;
- &lt;H1 ALIGN="center"&gt;
- [&lt;!--#echo var="REDIRECT_STATUS" --&gt;] &lt;!--#echo var="title" --&gt;
- &lt;IMG SRC="&lt;!--#echo var="IMG_CorpLogo" --&gt;"
- ALT="&lt;!--#echo var="ALT_CorpLogo" --&gt;" ALIGN=right&gt;
- &lt;/H1&gt;
- &lt;HR&gt;&lt;!-- ======================================================== --&gt;
- &lt;DIV&gt;
-</PRE><HR>
- and this is the <SAMP>foot.shtml.en</SAMP> file:
-<HR><PRE>
-
- &lt;/DIV&gt;
- &lt;HR&gt;
- &lt;DIV ALIGN="right"&gt;&lt;SMALL&gt;&lt;SUP&gt;Local Server time:
- &lt;!--#echo var="DATE_LOCAL" --&gt;
- &lt;/SUP&gt;&lt;/SMALL&gt;&lt;/DIV&gt;
- &lt;DIV ALIGN="center"&gt;
- &lt;A HREF="&lt;!--#echo var="DOC_Apache" --&gt;"&gt;
- &lt;IMG SRC="&lt;!--#echo var="IMG_Apache" --&gt;" BORDER=0 ALIGN="bottom"
- ALT="Powered by &lt;!--#echo var="SERVER_SOFTWARE" --&gt;"&gt;&lt;/A&gt;&lt;BR&gt;
- &lt;SMALL&gt;&lt;SUP&gt;&lt;!--#set var="var"
- value="Powered by $SERVER_SOFTWARE -- File last modified on $LAST_MODIFIED"
- --&gt;&lt;!--#echo var="var" --&gt;&lt;/SUP&gt;&lt;/SMALL&gt;
- &lt;/DIV&gt;
- &lt;ADDRESS&gt;If the indicated error looks like a misconfiguration, please inform
- &lt;A HREF="mailto:&lt;!--#echo var="SERVER_ADMIN" --&gt;"
- SUBJECT="Feedback about Error message [&lt;!--#echo var="REDIRECT_STATUS"
- --&gt;] &lt;!--#echo var="title" --&gt;, req=&lt;!--#echo var="REQUEST_URI" --&gt;"&gt;
- &lt;!--#echo var="SERVER_NAME" --&gt;'s WebMaster&lt;/A&gt;.
- &lt;/ADDRESS&gt;
- &lt;/UL&gt;&lt;/BODY&gt;
-&lt;/HTML&gt;
-</PRE><HR>
-
-
-<H3>More welcome!</H3>
-
-If you have tips to contribute, send mail to <A
-HREF="mailto:martin@apache.org">martin@apache.org</A>
-
- <!--#include virtual="footer.html" -->
-</BODY>
-</HTML>
-