home *** CD-ROM | disk | FTP | other *** search
/ Chip 2004 November / CMCD1104.ISO / Software / Complet / Apache / apache_2.0.52-win32-x86-no_ssl.msi / Data.Cab / F277912_custom_errordocs.xml < prev    next >
Extensible Markup Language  |  2004-04-17  |  23KB  |  585 lines

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE manualpage SYSTEM "../style/manualpage.dtd">
  3. <?xml-stylesheet type="text/xsl" href="../style/manual.en.xsl"?>
  4. <!-- $Revision: 1.1.2.7 $ -->
  5.  
  6. <!--
  7.  Copyright 2003-2004 The Apache Software Foundation
  8.  
  9.  Licensed under the Apache License, Version 2.0 (the "License");
  10.  you may not use this file except in compliance with the License.
  11.  You may obtain a copy of the License at
  12.  
  13.      http://www.apache.org/licenses/LICENSE-2.0
  14.  
  15.  Unless required by applicable law or agreed to in writing, software
  16.  distributed under the License is distributed on an "AS IS" BASIS,
  17.  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  18.  See the License for the specific language governing permissions and
  19.  limitations under the License.
  20. -->
  21.  
  22. <manualpage metafile="custom_errordocs.xml.meta">
  23.   <parentdocument href="./">Miscellaneous Documentation</parentdocument>
  24.  
  25.   <title>International Customized Server Error Messages</title>
  26.  
  27.   <summary>
  28.  
  29.     <note type="warning"><title>Warning:</title>
  30.       <p>This document has not been fully updated
  31.       to take into account changes made in the 2.0 version of the
  32.       Apache HTTP Server. Some of the information may still be
  33.       relevant, but please use it with care.</p>
  34.     </note>
  35.  
  36.     <p>This document describes an easy way to provide your Apache
  37.     HTTP Server with a set of customized error messages which take
  38.     advantage of <a href="../content-negotiation.html">Content
  39.     Negotiation</a> and <module>mod_include</module> to return 
  40.     error messages generated by the server in the client's native
  41.     language.</p>
  42.   
  43.   </summary>
  44.  
  45.   <section id="intro">
  46.  
  47.     <title>Introduction</title>
  48.  
  49.     <p>By using SSI, all <directive 
  50.     module="core">ErrorDocument</directive> messages
  51.     can share a homogenous and consistent style and layout, and
  52.     maintenance work (changing images, changing links) is kept to a
  53.     minimum because all layout information can be kept in a single
  54.     file.</p>
  55.  
  56.     <p>Error documents can be shared across different servers, or
  57.     even hosts, because all varying information is inserted at the
  58.     time the error document is returned on behalf of a failed
  59.     request.</p>
  60.  
  61.     <p>Content Negotiation then selects the appropriate language
  62.     version of a particular error message text, honoring the
  63.     language preferences passed in the client's request. (Users
  64.     usually select their favorite languages in the preferences
  65.     options menu of today's browsers). When an error document in
  66.     the client's primary language version is unavailable, the
  67.     secondary languages are tried or a default (fallback) version
  68.     is used.</p>
  69.  
  70.     <p>You have full flexibility in designing your error documents
  71.     to your personal taste (or your company's conventions). For
  72.     demonstration purposes, we present a simple generic error
  73.     document scheme. For this hypothetic server, we assume that all
  74.     error messages...</p>
  75.  
  76.     <ul>
  77.       <li>possibly are served by different virtual hosts (different
  78.       host name, different IP address, or different port) on the
  79.       server machine,</li>
  80.  
  81.       <li>show a predefined company logo in the right top of the
  82.       message (selectable by virtual host),</li>
  83.  
  84.       <li>print the error title first, followed by an explanatory
  85.       text and (depending on the error context) help on how to
  86.       resolve the error,</li>
  87.  
  88.       <li>have some kind of standardized background image,</li>
  89.  
  90.       <li>display an apache logo and a feedback email address at
  91.       the bottom of the error message.</li>
  92.     </ul>
  93.  
  94.     <p>An example of a "document not found" message for a german
  95.     client might look like this:</p>
  96.  
  97.     <p><img src="../images/custom_errordocs.gif"
  98.     alt="[Needs graphics capability to display]" /></p>
  99.     
  100.     <p>All links in the document as well as links to the server's
  101.     administrator mail address, and even the name and port of the
  102.     serving virtual host are inserted in the error document at
  103.     "run-time", i.e., when the error actually occurs.</p>
  104.   </section>
  105.  
  106.   <section id="createdir">
  107.  
  108.     <title>Creating an ErrorDocument directory</title>
  109.  
  110.     <p>For this concept to work as easily as possible, we must take
  111.     advantage of as much server support as we can get:</p>
  112.  
  113.     <ol>
  114.       <li>By defining the MultiViews <directive 
  115.       module="core">Options</directive>, we
  116.       enable the language selection of the most appropriate
  117.       language alternative (content negotiation).</li>
  118.  
  119.       <li>By setting the <directive
  120.       module="mod_negotiation">LanguagePriority</directive>
  121.       directive we define a set of default fallback languages in
  122.       the situation where the client's browser did not express any
  123.       preference at all.</li>
  124.  
  125.       <li>By enabling <module>mod_include</module>
  126.       (and disallowing execution of cgi scripts for
  127.       security reasons), we allow the server to include building
  128.       blocks of the error message, and to substitute the value of
  129.       certain environment variables into the generated document
  130.       (dynamic HTML) or even to conditionally include or omit parts
  131.       of the text.</li>
  132.  
  133.       <li>The <directive 
  134.       module="mod_mime">AddHandler</directive> and <directive
  135.       module="mod_mime">AddType</directive> directives
  136.       are useful for automatically SSI-expanding all files with a
  137.       <code>.shtml</code> suffix to <em>text/html</em>.</li>
  138.  
  139.       <li>By using the <directive
  140.       module="mod_alias">Alias</directive> directive, we
  141.       keep the error document directory outside of the document
  142.       tree because it can be regarded more as a server part than
  143.       part of the document tree.</li>
  144.  
  145.       <li>The <directive type="section"
  146.       module="core">Directory</directive> block
  147.       restricts these "special" settings to the error document
  148.       directory and avoids an impact on any of the settings for the
  149.       regular document tree.</li>
  150.  
  151.       <li>For each of the error codes to be handled (see RFC2068
  152.       for an exact description of each error code, or look at
  153.       <code>src/main/http_protocol.c</code> if you wish to see
  154.       apache's standard messages), an <directive
  155.       module="core">ErrorDocument</directive> in
  156.       the aliased <code>/errordocs</code> directory is defined.
  157.       Note that we only define the basename of the document here
  158.       because the MultiViews option will select the best candidate
  159.       based on the language suffixes and the client's preferences.
  160.       Any error situation with an error code <em>not</em> handled
  161.       by a custom document will be dealt with by the server in the
  162.       standard way (<em>i.e.</em>, a plain error message in
  163.       english).</li>
  164.  
  165.       <li>Finally, the <directive
  166.       module="core">AllowOverride</directive> directive tells 
  167.       apache that it is not necessary to look for a .htaccess file 
  168.       in the /errordocs directory: a minor speed optimization.</li>
  169.     </ol>
  170.  
  171.     <p>The resulting <code>httpd.conf</code> configuration would then
  172.     look similar to this:</p>
  173.  
  174.     <note><title>Note</title>Note that you can define your own
  175.     error messages using this method for only part of the document
  176.     tree, e.g., a /~user/ subtree. In this case, the configuration
  177.     could as well be put into the .htaccess file at the root of the
  178.     subtree, and the <Directory> and </Directory>
  179.     directives -but not the contained directives- must be
  180.     omitted.</note>
  181.  
  182. <example>
  183.   LanguagePriority en fr de <br />
  184.   Alias  /errordocs  /usr/local/apache/errordocs <br />
  185.   <br /> 
  186.   <Directory /usr/local/apache/errordocs> <br />
  187.   <indent>
  188.     AllowOverride none <br />
  189.     Options MultiViews IncludesNoExec FollowSymLinks <br />
  190.     AddType text/html .shtml <br />
  191.     <FilesMatch "\.shtml[.$]"> <br />
  192.     <indent>
  193.      SetOutputFilter INCLUDES <br />
  194.     </indent>
  195.     </FilesMatch> <br />
  196.    </indent>
  197.    </Directory> <br />
  198.   <br />
  199.   #    "400 Bad Request", <br />
  200.   ErrorDocument  400  /errordocs/400 <br />
  201.   #    "401 Authorization Required", <br />
  202.   ErrorDocument  401  /errordocs/401 <br />
  203.   #    "403 Forbidden", <br />
  204.   ErrorDocument  403  /errordocs/403 <br />
  205.   #    "404 Not Found", <br />
  206.   ErrorDocument  404  /errordocs/404 <br />
  207.   #    "500 Internal Server Error", <br />
  208.   ErrorDocument  500  /errordocs/500 <br />
  209. </example>
  210.  
  211.     <p>The directory for the error messages (here:
  212.     <code>/usr/local/apache/errordocs/</code>) must then be created
  213.     with the appropriate permissions (readable and executable by
  214.     the server uid or gid, only writable for the administrator).</p>
  215.  
  216.     <section id="naming">
  217.  
  218.     <title>Naming the Individual Error Document files</title>
  219.  
  220.     <p>By defining the <code>MultiViews</code> option, the server was
  221.     told to automatically scan the directory for matching variants
  222.     (looking at language and content type suffixes) when a
  223.     requested document was not found. In the configuration, we
  224.     defined the names for the error documents to be just their
  225.     error number (without any suffix).</p>
  226.  
  227.     <p>The names of the individual error documents are now
  228.     determined like this (I'm using 403 as an example, think of it
  229.     as a placeholder for any of the configured error
  230.     documents):</p>
  231.  
  232.     <ul>
  233.       <li>No file errordocs/403 should exist. Otherwise, it would
  234.       be found and served (with the DefaultType, usually
  235.       text/plain), all negotiation would be bypassed.</li>
  236.  
  237.       <li>For each language for which we have an internationalized
  238.       version (note that this need not be the same set of languages
  239.       for each error code - you can get by with a single language
  240.       version until you actually <em>have</em> translated
  241.       versions), a document
  242.       <code>errordocs/403.shtml.<em>lang</em></code> is created and
  243.       filled with the error text in that language (<a
  244.       href="#createdocs">see below</a>).</li>
  245.  
  246.       <li>One fallback document called
  247.       <code>errordocs/403.shtml</code> is created, usually by
  248.       creating a symlink to the default language variant (<a
  249.       href="#fallback">see below</a>).</li>
  250.     </ul>
  251.     </section>
  252.  
  253.     <section id="headfoot">
  254.  
  255.     <title>The Common Header and Footer Files</title>
  256.  
  257.     <p>By putting as much layout information in two special "include
  258.     files", the error documents can be reduced to a bare minimum.</p>
  259.  
  260.     <p>One of these layout files defines the HTML document header
  261.     and a configurable list of paths to the icons to be shown in
  262.     the resulting error document. These paths are exported as a set
  263.     of SSI environment variables and are later evaluated by the
  264.     "footer" special file. The title of the current error (which is
  265.     put into the TITLE tag and an H1 header) is simply passed in
  266.     from the main error document in a variable called
  267.     <code>title</code>.</p>
  268.     
  269.     <p><strong>By changing this file, the layout of all generated
  270.     error messages can be changed in a second.</strong> (By
  271.     exploiting the features of SSI, you can easily define
  272.     different layouts based on the current virtual host, or even
  273.     based on the client's domain name).</p>
  274.  
  275.     <p>The second layout file describes the footer to be displayed
  276.     at the bottom of every error message. In this example, it shows
  277.     an apache logo, the current server time, the server version
  278.     string and adds a mail reference to the site's webmaster.</p>
  279.  
  280.     <p>For simplicity, the header file is simply called
  281.     <code>head.shtml</code> because it contains server-parsed
  282.     content but no language specific information. The footer file
  283.     exists once for each language translation, plus a symlink for
  284.     the default language.</p>
  285.  
  286. <example>
  287. for English, French and German versions (default english) <br />
  288. <br />
  289. foot.shtml.en, <br />
  290. foot.shtml.fr, <br />
  291. foot.shtml.de, <br />
  292. foot.shtml symlink to <br />
  293. foot.shtml.en
  294. </example>
  295.  
  296.     <p>Both files are included into the error document by using the
  297.     directives <code><!--#include virtual="head" --></code>
  298.     and <code><!--#include virtual="foot" --></code>
  299.     respectively: the rest of the magic occurs in mod_negotiation
  300.     and in mod_include.</p>
  301.  
  302.     <p>See <a href="#listings">the listings below</a> to see an
  303.     actual HTML implementation of the discussed example.</p>
  304.     </section>
  305.  
  306.     <section id="createdocs">
  307.  
  308.     <title>Creating ErrorDocuments in Different Languages</title>
  309.  
  310.     <p>After all this preparation work, little remains to be said
  311.     about the actual documents. They all share a simple common
  312.     structure:</p>
  313.  
  314. <example>
  315. <!--#set var="title" value="<em>error description title</em>" --> <br />
  316. <!--#include virtual="head" --> <br />
  317. <indent>
  318.  <em>explanatory error text</em> <br />
  319. </indent>
  320. <!--#include virtual="foot" -->
  321. </example>
  322.  
  323.     <p>In the <a href="#listings">listings section</a>, you can see an
  324.     example of a [400 Bad Request] error document. Documents as
  325.     simple as that certainly cause no problems to translate or
  326.     expand.</p>
  327.     </section>
  328.  
  329.     <section id="fallback">
  330.  
  331.     <title>The Fallback Language</title>
  332.  
  333.     <p>Do we need a special handling for languages other than those we
  334.     have translations for? We did set the LanguagePriority, didn't
  335.     we?!</p>
  336.  
  337.     <p>Well, the LanguagePriority directive is for the case where
  338.     the client does not express any language priority at all. But
  339.     what happens in the situation where the client wants one of the
  340.     languages we do not have, and none of those we do have?</p>
  341.  
  342.     <p>Without doing anything, the Apache server will usually
  343.     return a [406 no acceptable variant] error, listing the choices
  344.     from which the client may select. But we're in an error message
  345.     already, and important error information might get lost when
  346.     the client had to choose a language representation first.</p>
  347.  
  348.     <p>So, in this situation it appears to be easier to define a
  349.     fallback language (by copying or linking, <em>e.g.</em>, the
  350.     english version to a language-less version). Because the
  351.     negotiation algorithm prefers "more specialized" variants over
  352.     "more generic" variants, these generic alternatives will only
  353.     be chosen when the normal negotiation did not succeed.</p>
  354.  
  355.     <p>A simple shell script to do it (execute within the
  356.     errordocs/ dir):</p>
  357.  
  358. <example>
  359.   for f in *.shtml.en <br />
  360.   do <br />
  361.   <indent>
  362.      ln -s $f `basename $f .en` <br />
  363.   </indent>
  364.   done
  365. </example>
  366.  
  367.     </section>
  368.   </section>
  369.  
  370.   <section id="proxy">
  371.  
  372.   <title>Customizing Proxy Error Messages</title>
  373.  
  374.     <p>As of Apache-1.3, it is possible to use the
  375.     <code>ErrorDocument</code> mechanism for proxy error messages
  376.     as well (previous versions always returned fixed predefined
  377.     error messages).</p>
  378.  
  379.     <p>Most proxy errors return an error code of [500 Internal
  380.     Server Error]. To find out whether a particular error document
  381.     was invoked on behalf of a proxy error or because of some other
  382.     server error, and what the reason for the failure was, you can
  383.     check the contents of the new <code>ERROR_NOTES</code> CGI
  384.     environment variable: if invoked for a proxy error, this
  385.     variable will contain the actual proxy error message text in
  386.     HTML form.</p>
  387.  
  388.     <p>The following excerpt demonstrates how to exploit the
  389.     <code>ERROR_NOTES</code> variable within an error document:</p>
  390.  
  391. <example>
  392.  <!--#if expr="$REDIRECT_ERROR_NOTES = ''" --> <br />
  393.  <br />
  394.   <p> <br />
  395.   <indent>
  396.    The server encountered an unexpected condition <br />
  397.    which prevented it from fulfilling the request. <br />
  398.   </indent>
  399.   </p> <br />
  400. <br />
  401.   <p> <br />
  402.   <indent>
  403.    <a href="mailto:<!--#echo var="SERVER_ADMIN" -->" <br />
  404.     SUBJECT="Error message [<!--#echo var="REDIRECT_STATUS" -->] <!--#echo var="title" --> for <!--#echo var="REQUEST_URI" -->"> <br />
  405.    Please forward this error screen to <!--#echo var="SERVER_NAME" -->'s <br />
  406.    WebMaster</a>; it includes useful debugging information about <br />
  407.    the Request which caused the error. <br />
  408. <br />
  409.    <pre><!--#printenv --></pre> <br />
  410.   </indent>
  411.   </p> <br/>
  412.  <br />
  413.  <!--#else --> <br />
  414.  <indent>
  415.   <!--#echo var="REDIRECT_ERROR_NOTES" --><br />
  416.  </indent>
  417. <br />
  418.  <!--#endif -->
  419. </example>
  420.  
  421.   </section>
  422.  
  423.   <section id="listings">
  424.  
  425.   <title>HTML Listing of the Discussed Example</title>
  426.  
  427.     <p>So, to summarize our example, here's the complete listing of
  428.     the <code>400.shtml.en</code> document. You will notice that it
  429.     contains almost nothing but the error text (with conditional
  430.     additions). Starting with this example, you will find it easy
  431.     to add more error documents, or to translate the error
  432.     documents to different languages.</p>
  433.  
  434. <example>
  435. <!--#set var="title" value="Bad Request"--> <br />
  436. <!--#include virtual="head" --><br />
  437. <br />
  438.    <p> <br />
  439.    <indent>
  440.    Your browser sent a request that this server could not understand: <br />
  441.    <blockquote> <br />
  442.      <indent>
  443.      <strong><!--#echo var="REQUEST_URI" --></strong><br />
  444.      </indent>
  445.    </blockquote> <br />
  446.    <br />
  447.    The request could not be understood by the server due to malformed <br />
  448.    syntax. The client should not repeat the request without <br />
  449.    modifications. <br />
  450.    </indent>
  451.    </p> <br />
  452. <br />
  453.    <p> <br />
  454.    <indent>
  455.    <!--#if expr="$HTTP_REFERER != ''" --> <br />
  456.     <indent>
  457.     Please inform the owner of <br />
  458.     <a href="<!--#echo var="HTTP_REFERER" -->">the referring page</a> about <br />
  459.     the malformed link. <br />
  460.     </indent>
  461.    <br />
  462.    <!--#else --> <br />
  463.     <indent>
  464.     Please check your request for typing errors and retry. <br />
  465.     </indent>
  466.    <br />
  467.    <!--#endif --> <br />
  468.    </indent>
  469.    </p> <br />
  470. <br />
  471. <!--#include virtual="foot" -->
  472. </example>
  473.  
  474.     <p>Here is the complete <code>head.shtml.en</code> file (the funny
  475.     line breaks avoid empty lines in the document after SSI
  476.     processing). Note the configuration section at top. That's
  477.     where you configure the images and logos as well as the apache
  478.     documentation directory. Look how this file displays two
  479.     different logos depending on the content of the virtual host
  480.     name ($SERVER_NAME), and that an animated apache logo is shown
  481.     if the browser appears to support it (the latter requires
  482.     server configuration lines of the form </p>
  483.  
  484.     <example>BrowserMatch "^Mozilla/[2-4]" anigif</example>
  485.  
  486.     <p>for browser types which support animated GIFs).</p>
  487.  
  488. <example>
  489. <!--#if expr="$SERVER_NAME = /.*\.mycompany\.com/" --><br />
  490. <indent>
  491. <!--#set var="IMG_CorpLogo" value="http://$SERVER_NAME:$SERVER_PORT/errordocs/CorpLogo.gif" --><br />
  492. <!--#set var="ALT_CorpLogo" value="Powered by Linux!" --><br />
  493. </indent>
  494. <br />
  495. <!--#else --> <br />
  496. <indent>
  497. <!--#set var="IMG_CorpLogo" value="http://$SERVER_NAME:$SERVER_PORT/errordocs/PrivLogo.gif" --> <br />
  498. <!--#set var="ALT_CorpLogo" value="Powered by Linux!" --> <br />
  499. </indent>
  500. <!--#endif--> <br />
  501. <br />
  502. <!--#set var="IMG_BgImage" value="http://$SERVER_NAME:$SERVER_PORT/errordocs/BgImage.gif" --> <br />
  503. <!--#set var="DOC_Apache" value="http://$SERVER_NAME:$SERVER_PORT/Apache/" --> <br />
  504. <br />
  505. <!--#if expr="$anigif" --> <br />
  506. <indent>
  507. <!--#set var="IMG_Apache" value="http://$SERVER_NAME:$SERVER_PORT/icons/apache_anim.gif" --> <br />
  508. </indent>
  509. <!--#else--><br />
  510. <indent>
  511. <!--#set var="IMG_Apache" value="http://$SERVER_NAME:$SERVER_PORT/icons/apache_pb.gif" --><br />
  512. </indent>
  513. <!--#endif--><br />
  514. <br />
  515.  
  516. <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> <br />
  517. <html> <br />
  518. <head> <br />
  519.   <indent>
  520.   <title> <br />
  521.   [<!--#echo var="REDIRECT_STATUS" -->] <!--#echo var="title" --> <br />
  522.   </title> <br />
  523.   </indent>
  524. </head> <br />
  525. <br />
  526. <body bgcolor="white" background="<!--#echo var="IMG_BgImage" -->"> <br />
  527. <indent>
  528.   <h1 align="center"> <br />
  529.   [<!--#echo var="REDIRECT_STATUS" -->] 
  530.   <!--#echo var="title" --> <br />
  531.   <img src="<!--#echo var="IMG_CorpLogo" -->" <br />
  532.     alt="<!--#echo var="ALT_CorpLogo" -->" align="right"> <br />
  533.   </h1> <br />
  534. <br />
  535.   <hr />
  536.   <!-- ======================================================== --> <br />
  537.   <div>
  538. </indent>
  539. </example>
  540.  
  541.     <p>and this is the <code>foot.shtml.en</code> file:</p>
  542.  
  543. <example>
  544. <indent>
  545.   </div> <br />
  546.   <hr /> <br />
  547.   <br />
  548.   <div align="right"> <br />
  549.   <indent>
  550.   <small>Local Server time:
  551.   <!--#echo var="DATE_LOCAL" --></small> <br />
  552.   </indent>
  553.   </div> <br />
  554.   <br />
  555.   <div align="center"><br />
  556.   <indent>
  557.     <a href="<!--#echo var="DOC_Apache" -->"> <br />
  558.     <img src="<!--#echo var="IMG_Apache" -->" border="0" align="bottom" <br />
  559.       alt="Powered by <!--#echo var="SERVER_SOFTWARE" -->"></a> <br />
  560.   <br /><br />
  561.  
  562.   <small><!--#set var="var" value="Powered by $SERVER_SOFTWARE -- <br />
  563.   File last modified on $LAST_MODIFIED" --> <br />
  564.   <!--#echo var="var" --></small> <br />
  565.   </indent>
  566.   </div> <br />
  567.   <br />
  568.   <p>If the indicated error looks like a misconfiguration, please inform <br />
  569.   <a href="mailto:<!--#echo var="SERVER_ADMIN" -->" <br />
  570.   subject="Feedback about Error message [<!--#echo var="REDIRECT_STATUS" -->] <br />
  571.   <!--#echo var="title" -->, req=<!--#echo var="REQUEST_URI" -->"> <br />
  572.   <!--#echo var="SERVER_NAME" -->'s WebMaster</a>.<br />
  573.   </p><br />
  574.   </indent>
  575. <br />
  576. </body><br />
  577. </html>
  578. </example>
  579.  
  580.     <p>If you have tips to contribute, send mail to <a
  581.     href="mailto:martin@apache.org">martin@apache.org</a></p>
  582.   </section>
  583.  
  584. </manualpage>
  585.