access.html.en revision 488228a03efe42d9f0b03334a4753ce79a6dc5cc
7db058a7846888b8823fca9e8135f395265ef1d8nilgun<?xml version="1.0" encoding="ISO-8859-1"?>
7db058a7846888b8823fca9e8135f395265ef1d8nilgun<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
7db058a7846888b8823fca9e8135f395265ef1d8nilgun<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head><!--
7db058a7846888b8823fca9e8135f395265ef1d8nilgun XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
7db058a7846888b8823fca9e8135f395265ef1d8nilgun This file is generated from xml source: DO NOT EDIT
7db058a7846888b8823fca9e8135f395265ef1d8nilgun XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
7db058a7846888b8823fca9e8135f395265ef1d8nilgun -->
7db058a7846888b8823fca9e8135f395265ef1d8nilgun<title>Using mod_rewrite to control access - Apache HTTP Server</title>
7db058a7846888b8823fca9e8135f395265ef1d8nilgun<link href="/style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
7db058a7846888b8823fca9e8135f395265ef1d8nilgun<link href="/style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
d29d9ab4614ff992b0e8de6e2b88d52b6f1f153erbowen<link href="/style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" /><link rel="stylesheet" type="text/css" href="/style/css/prettify.css" />
2e545ce2450a9953665f701bb05350f0d3f26275nd<script src="/style/scripts/prettify.js" type="text/javascript">
d29d9ab4614ff992b0e8de6e2b88d52b6f1f153erbowen</script>
d29d9ab4614ff992b0e8de6e2b88d52b6f1f153erbowen
7db058a7846888b8823fca9e8135f395265ef1d8nilgun<link href="/images/favicon.ico" rel="shortcut icon" /></head>
7db058a7846888b8823fca9e8135f395265ef1d8nilgun<body id="manual-page"><div id="page-header">
7db058a7846888b8823fca9e8135f395265ef1d8nilgun<p class="menu"><a href="/mod/">Modules</a> | <a href="/mod/directives.html">Directives</a> | <a href="/faq/">FAQ</a> | <a href="/glossary.html">Glossary</a> | <a href="/sitemap.html">Sitemap</a></p>
af33a4994ae2ff15bc67d19ff1a7feb906745bf8rbowen<p class="apache">Apache HTTP Server Version 2.5</p>
3f08db06526d6901aa08c110b5bc7dde6bc39905nd<img alt="" src="/images/feather.gif" /></div>
7db058a7846888b8823fca9e8135f395265ef1d8nilgun<div class="up"><a href="./"><img title="&lt;-" alt="&lt;-" src="/images/left.gif" /></a></div>
7db058a7846888b8823fca9e8135f395265ef1d8nilgun<div id="path">
7db058a7846888b8823fca9e8135f395265ef1d8nilgun<a href="http://www.apache.org/">Apache</a> &gt; <a href="http://httpd.apache.org/">HTTP Server</a> &gt; <a href="http://httpd.apache.org/docs/">Documentation</a> &gt; <a href="../">Version 2.5</a> &gt; <a href="./">Rewrite</a></div><div id="page-content"><div id="preamble"><h1>Using mod_rewrite to control access</h1>
3f08db06526d6901aa08c110b5bc7dde6bc39905nd<div class="toplang">
7db058a7846888b8823fca9e8135f395265ef1d8nilgun<p><span>Available Languages: </span><a href="/en/rewrite/access.html" title="English">&nbsp;en&nbsp;</a></p>
7db058a7846888b8823fca9e8135f395265ef1d8nilgun</div>
7db058a7846888b8823fca9e8135f395265ef1d8nilgun
d3bd91523e4565551991605fb157fea59c3610e2gryzor
f086b4b402fa9a2fefc7dda85de2a3cc1cd0a654rjung<p>This document supplements the <code class="module"><a href="/mod/mod_rewrite.html">mod_rewrite</a></code>
7db058a7846888b8823fca9e8135f395265ef1d8nilgun<a href="/mod/mod_rewrite.html">reference documentation</a>. It describes
50cb7e2b30597f481fee57bac945190f06ebcc58jortonhow you can use <code class="module"><a href="/mod/mod_rewrite.html">mod_rewrite</a></code> to control access to
7db058a7846888b8823fca9e8135f395265ef1d8nilgunvarious resources, and other related techniques.
7db058a7846888b8823fca9e8135f395265ef1d8nilgunThis includes many examples of common uses of mod_rewrite,
7db058a7846888b8823fca9e8135f395265ef1d8nilgunincluding detailed descriptions of how each works.</p>
7db058a7846888b8823fca9e8135f395265ef1d8nilgun
7db058a7846888b8823fca9e8135f395265ef1d8nilgun<div class="warning">Note that many of these examples won't work unchanged in your
7db058a7846888b8823fca9e8135f395265ef1d8nilgunparticular server configuration, so it's important that you understand
7db058a7846888b8823fca9e8135f395265ef1d8nilgunthem, rather than merely cutting and pasting the examples into your
50cb7e2b30597f481fee57bac945190f06ebcc58jortonconfiguration.</div>
50cb7e2b30597f481fee57bac945190f06ebcc58jorton
e10f97d0097170c9843f6cf335dfeef0b44cd83crbowen</div>
50cb7e2b30597f481fee57bac945190f06ebcc58jorton<div id="quickview"><ul id="toc"><li><img alt="" src="/images/down.gif" /> <a href="#blocked-inline-images">Forbidding Image "Hotlinking"</a></li>
7db058a7846888b8823fca9e8135f395265ef1d8nilgun<li><img alt="" src="/images/down.gif" /> <a href="#blocking-of-robots">Blocking of Robots</a></li>
c9f4eb2763c1d6ba9a3d26828e1729e476d0bb1epctony<li><img alt="" src="/images/down.gif" /> <a href="#host-deny">Denying Hosts in a Blacklist</a></li>
50cb7e2b30597f481fee57bac945190f06ebcc58jorton<li><img alt="" src="/images/down.gif" /> <a href="#referer-deflector">Referer-based Deflector</a></li>
c9f4eb2763c1d6ba9a3d26828e1729e476d0bb1epctony</ul><h3>See also</h3><ul class="seealso"><li><a href="/mod/mod_rewrite.html">Module documentation</a></li><li><a href="intro.html">mod_rewrite introduction</a></li><li><a href="remapping.html">Redirection and remapping</a></li><li><a href="vhosts.html">Virtual hosts</a></li><li><a href="proxy.html">Proxying</a></li><li><a href="rewritemap.html">Using RewriteMap</a></li><li><a href="advanced.html">Advanced techniques</a></li><li><a href="avoid.html">When not to use mod_rewrite</a></li></ul></div>
7db058a7846888b8823fca9e8135f395265ef1d8nilgun<div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
7db058a7846888b8823fca9e8135f395265ef1d8nilgun<div class="section">
7db058a7846888b8823fca9e8135f395265ef1d8nilgun<h2><a name="blocked-inline-images" id="blocked-inline-images">Forbidding Image "Hotlinking"</a></h2>
50cb7e2b30597f481fee57bac945190f06ebcc58jorton
7db058a7846888b8823fca9e8135f395265ef1d8nilgun
7db058a7846888b8823fca9e8135f395265ef1d8nilgun
7db058a7846888b8823fca9e8135f395265ef1d8nilgun <dl>
50cb7e2b30597f481fee57bac945190f06ebcc58jorton <dt>Description:</dt>
7db058a7846888b8823fca9e8135f395265ef1d8nilgun
7db058a7846888b8823fca9e8135f395265ef1d8nilgun <dd>
7db058a7846888b8823fca9e8135f395265ef1d8nilgun <p>The following technique forbids the practice of other sites
50cb7e2b30597f481fee57bac945190f06ebcc58jorton including your images inline in their pages. This practice is
7db058a7846888b8823fca9e8135f395265ef1d8nilgun often referred to as "hotlinking", and results in
7db058a7846888b8823fca9e8135f395265ef1d8nilgun your bandwidth being used to serve content for someone else's
50cb7e2b30597f481fee57bac945190f06ebcc58jorton site.</p>
e10f97d0097170c9843f6cf335dfeef0b44cd83crbowen </dd>
7db058a7846888b8823fca9e8135f395265ef1d8nilgun
7db058a7846888b8823fca9e8135f395265ef1d8nilgun <dt>Solution:</dt>
7db058a7846888b8823fca9e8135f395265ef1d8nilgun
7db058a7846888b8823fca9e8135f395265ef1d8nilgun <dd>
7db058a7846888b8823fca9e8135f395265ef1d8nilgun <p>This technique relies on the value of the
7db058a7846888b8823fca9e8135f395265ef1d8nilgun <code>HTTP_REFERER</code> variable, which is optional. As
7db058a7846888b8823fca9e8135f395265ef1d8nilgun such, it's possible for some people to circumvent this
7db058a7846888b8823fca9e8135f395265ef1d8nilgun limitation. However, most users will experience the failed
7db058a7846888b8823fca9e8135f395265ef1d8nilgun request, which should, over time, result in the image being
7db058a7846888b8823fca9e8135f395265ef1d8nilgun removed from that other site.</p>
7db058a7846888b8823fca9e8135f395265ef1d8nilgun <p>There are several ways that you can handle this
7db058a7846888b8823fca9e8135f395265ef1d8nilgun situation.</p>
30471a4650391f57975f60bbb6e4a90be7b284bfhumbedooh
7db058a7846888b8823fca9e8135f395265ef1d8nilgun <p>In this first example, we simply deny the request, if it didn't
7db058a7846888b8823fca9e8135f395265ef1d8nilgun initiate from a page on our site. For the purpose of this example,
7db058a7846888b8823fca9e8135f395265ef1d8nilgun we assume that our site is <code>www.example.com</code>.</p>
4aa603e6448b99f9371397d439795c91a93637eand
17ade6df5ec233536985eb1c130a906c725dd614humbedooh
17ade6df5ec233536985eb1c130a906c725dd614humbedooh
17ade6df5ec233536985eb1c130a906c725dd614humbedooh<pre class="prettyprint lang-config">
17ade6df5ec233536985eb1c130a906c725dd614humbedoohRewriteCond %{HTTP_REFERER} <strong>!^$</strong>
17ade6df5ec233536985eb1c130a906c725dd614humbedoohRewriteCond %{HTTP_REFERER} !www.example.com [NC]
17ade6df5ec233536985eb1c130a906c725dd614humbedoohRewriteRule <strong>\.(gif|jpg|png)$</strong> - [F,NC]
4aa603e6448b99f9371397d439795c91a93637eand</pre>
e487d6c09669296f94a5190cc34586a98e624a00nd
17ade6df5ec233536985eb1c130a906c725dd614humbedooh
4aa603e6448b99f9371397d439795c91a93637eand <p>In this second example, instead of failing the request, we display
17ade6df5ec233536985eb1c130a906c725dd614humbedooh an alternate image instead.</p>
17ade6df5ec233536985eb1c130a906c725dd614humbedooh
17ade6df5ec233536985eb1c130a906c725dd614humbedooh<pre class="prettyprint lang-config">
17ade6df5ec233536985eb1c130a906c725dd614humbedoohRewriteCond %{HTTP_REFERER} <strong>!^$</strong>
17ade6df5ec233536985eb1c130a906c725dd614humbedoohRewriteCond %{HTTP_REFERER} !www.example.com [NC]
17ade6df5ec233536985eb1c130a906c725dd614humbedoohRewriteRule <strong>\.(gif|jpg|png)$</strong> /images/go-away.png [R,NC]
4aa603e6448b99f9371397d439795c91a93637eand</pre>
e487d6c09669296f94a5190cc34586a98e624a00nd
7db058a7846888b8823fca9e8135f395265ef1d8nilgun
7db058a7846888b8823fca9e8135f395265ef1d8nilgun <p>In the third example, we redirect the request to an image on some
7db058a7846888b8823fca9e8135f395265ef1d8nilgun other site.</p>
7db058a7846888b8823fca9e8135f395265ef1d8nilgun
50cb7e2b30597f481fee57bac945190f06ebcc58jorton<pre class="prettyprint lang-config">
7153ff43420a22c7f6213937b6b210f25d02c464rbowenRewriteCond %{HTTP_REFERER} <strong>!^$</strong>
7db058a7846888b8823fca9e8135f395265ef1d8nilgunRewriteCond %{HTTP_REFERER} !www.example.com [NC]
7db058a7846888b8823fca9e8135f395265ef1d8nilgunRewriteRule <strong>\.(gif|jpg|png)$</strong> http://other.example.com/image.gif [R,NC]
7db058a7846888b8823fca9e8135f395265ef1d8nilgun</pre>
7db058a7846888b8823fca9e8135f395265ef1d8nilgun
50cb7e2b30597f481fee57bac945190f06ebcc58jorton
7db058a7846888b8823fca9e8135f395265ef1d8nilgun <p>Of these techniques, the last two tend to be the most effective
c9f4eb2763c1d6ba9a3d26828e1729e476d0bb1epctony in getting people to stop hotlinking your images, because they will
7db058a7846888b8823fca9e8135f395265ef1d8nilgun simply not see the image that they expected to see.</p>
c9f4eb2763c1d6ba9a3d26828e1729e476d0bb1epctony
7db058a7846888b8823fca9e8135f395265ef1d8nilgun </dd>
50cb7e2b30597f481fee57bac945190f06ebcc58jorton
7db058a7846888b8823fca9e8135f395265ef1d8nilgun <dt>Discussion:</dt>
50cb7e2b30597f481fee57bac945190f06ebcc58jorton
7db058a7846888b8823fca9e8135f395265ef1d8nilgun <dd>
50cb7e2b30597f481fee57bac945190f06ebcc58jorton <p>If all you wish to do is deny access to the resource, rather
7db058a7846888b8823fca9e8135f395265ef1d8nilgun than redirecting that request elsewhere, this can be
7db058a7846888b8823fca9e8135f395265ef1d8nilgun accomplished without the use of mod_rewrite:</p>
7db058a7846888b8823fca9e8135f395265ef1d8nilgun
7db058a7846888b8823fca9e8135f395265ef1d8nilgun <pre class="prettyprint lang-config">
7db058a7846888b8823fca9e8135f395265ef1d8nilgunSetEnvIf Referer example\.com localreferer
50cb7e2b30597f481fee57bac945190f06ebcc58jorton&lt;FilesMatch \.(jpg|png|gif)$&gt;
7db058a7846888b8823fca9e8135f395265ef1d8nilgun Order deny,allow
7db058a7846888b8823fca9e8135f395265ef1d8nilgun Deny from all
7db058a7846888b8823fca9e8135f395265ef1d8nilgun Allow from env=localreferer
7db058a7846888b8823fca9e8135f395265ef1d8nilgun&lt;/FilesMatch&gt;
7db058a7846888b8823fca9e8135f395265ef1d8nilgun </pre>
50cb7e2b30597f481fee57bac945190f06ebcc58jorton
50cb7e2b30597f481fee57bac945190f06ebcc58jorton </dd>
7db058a7846888b8823fca9e8135f395265ef1d8nilgun </dl>
7db058a7846888b8823fca9e8135f395265ef1d8nilgun
7db058a7846888b8823fca9e8135f395265ef1d8nilgun </div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
7db058a7846888b8823fca9e8135f395265ef1d8nilgun<div class="section">
7db058a7846888b8823fca9e8135f395265ef1d8nilgun<h2><a name="blocking-of-robots" id="blocking-of-robots">Blocking of Robots</a></h2>
7db058a7846888b8823fca9e8135f395265ef1d8nilgun
50cb7e2b30597f481fee57bac945190f06ebcc58jorton
7db058a7846888b8823fca9e8135f395265ef1d8nilgun
7db058a7846888b8823fca9e8135f395265ef1d8nilgun <dl>
7db058a7846888b8823fca9e8135f395265ef1d8nilgun <dt>Description:</dt>
7db058a7846888b8823fca9e8135f395265ef1d8nilgun
7db058a7846888b8823fca9e8135f395265ef1d8nilgun <dd>
50cb7e2b30597f481fee57bac945190f06ebcc58jorton <p>
50cb7e2b30597f481fee57bac945190f06ebcc58jorton In this recipe, we discuss how to block persistent requests from
7db058a7846888b8823fca9e8135f395265ef1d8nilgun a particular robot, or user agent.</p>
7db058a7846888b8823fca9e8135f395265ef1d8nilgun
7db058a7846888b8823fca9e8135f395265ef1d8nilgun <p>The standard for robot exclusion defines a file,
7db058a7846888b8823fca9e8135f395265ef1d8nilgun <code>/robots.txt</code> that specifies those portions of your
7db058a7846888b8823fca9e8135f395265ef1d8nilgun website where you which to exclude robots. However, some robots
d3bd91523e4565551991605fb157fea59c3610e2gryzor do not honor these files.
f086b4b402fa9a2fefc7dda85de2a3cc1cd0a654rjung </p>
727872d18412fc021f03969b8641810d8896820bhumbedooh
0d0ba3a410038e179b695446bb149cce6264e0abnd <p>Note that there are methods of accomplishing this which do
727872d18412fc021f03969b8641810d8896820bhumbedooh not use mod_rewrite. Note also that any technique that relies on
cc7e1025de9ac63bd4db6fe7f71c158b2cf09fe4humbedooh the clients <code>USER_AGENT</code> string can be circumvented
0d0ba3a410038e179b695446bb149cce6264e0abnd very easily, since that string can be changed.</p>
cc7e1025de9ac63bd4db6fe7f71c158b2cf09fe4humbedooh </dd>
727872d18412fc021f03969b8641810d8896820bhumbedooh
0d0ba3a410038e179b695446bb149cce6264e0abnd <dt>Solution:</dt>
0d0ba3a410038e179b695446bb149cce6264e0abnd
0d0ba3a410038e179b695446bb149cce6264e0abnd <dd>
ac082aefa89416cbdc9a1836eaf3bed9698201c8humbedooh <p>We use a ruleset that specifies the directory to be
0d0ba3a410038e179b695446bb149cce6264e0abnd protected, and the client <code>USER_AGENT</code> that
0d0ba3a410038e179b695446bb149cce6264e0abnd identifies the malicious or persistent robot.</p>
0d0ba3a410038e179b695446bb149cce6264e0abnd
727872d18412fc021f03969b8641810d8896820bhumbedooh <p>In this example, we are blocking a robot called
0d0ba3a410038e179b695446bb149cce6264e0abnd <code>NameOfBadRobot</code> from a location
0d0ba3a410038e179b695446bb149cce6264e0abnd <code>/secret/files</code>. You may also specify an IP address
30471a4650391f57975f60bbb6e4a90be7b284bfhumbedooh range, if you are trying to block that user agent only from the
07dc96d063d49299da433f84b5c5681da9bbdf68rbowen particular source.</p>
af33a4994ae2ff15bc67d19ff1a7feb906745bf8rbowen
0d0ba3a410038e179b695446bb149cce6264e0abnd<pre class="prettyprint lang-config">
7fec19672a491661b2fe4b29f685bc7f4efa64d4ndRewriteCond %{HTTP_USER_AGENT} ^<strong>NameOfBadRobot</strong>
7fec19672a491661b2fe4b29f685bc7f4efa64d4ndRewriteCond %{REMOTE_ADDR} =<strong>123\.45\.67\.[8-9]</strong>
7fec19672a491661b2fe4b29f685bc7f4efa64d4ndRewriteRule ^<strong>/secret/files/</strong> - [<strong>F</strong>]
7db058a7846888b8823fca9e8135f395265ef1d8nilgun</pre>
</dd>
<dt>Discussion:</dt>
<dd>
<p>
Rather than using mod_rewrite for this, you can accomplish the
same end using alternate means, as illustrated here:
</p>
<pre class="prettyprint lang-config">
SetEnvIfNoCase User-Agent ^NameOfBadRobot goaway
&lt;Location /secret/files&gt;
Order allow,deny
Allow from all
Deny from env=goaway
&lt;/Location&gt;
</pre>
<p>
As noted above, this technique is trivial to circumvent, by simply
modifying the <code>USER_AGENT</code> request header. If you
are experiencing a sustained attack, you should consider blocking
it at a higher level, such as at your firewall.
</p>
</dd>
</dl>
</div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
<div class="section">
<h2><a name="host-deny" id="host-deny">Denying Hosts in a Blacklist</a></h2>
<dl>
<dt>Description:</dt>
<dd>
<p>We wish to maintain a blacklist of hosts, rather like
<code>hosts.deny</code>, and have those hosts blocked from
accessing our server.</p>
</dd>
<dt>Solution:</dt>
<dd>
<pre class="prettyprint lang-config">
RewriteEngine on
RewriteMap hosts-deny txt:/path/to/hosts.deny
RewriteCond ${hosts-deny:%{REMOTE_ADDR}|NOT-FOUND} !=NOT-FOUND [OR]
RewriteCond ${hosts-deny:%{REMOTE_HOST}|NOT-FOUND} !=NOT-FOUND
RewriteRule ^ - [F]
</pre>
<div class="example"><p><code>
##<br />
## hosts.deny<br />
##<br />
## ATTENTION! This is a map, not a list, even when we treat it as such.<br />
## mod_rewrite parses it for key/value pairs, so at least a<br />
## dummy value "-" must be present for each entry.<br />
##<br />
<br />
193.102.180.41 -<br />
bsdti1.sdm.de -<br />
192.76.162.40 -<br />
</code></p></div>
</dd>
<dt>Discussion:</dt>
<dd>
<p>
The second RewriteCond assumes that you have HostNameLookups turned
on, so that client IP addresses will be resolved. If that's not the
case, you should drop the second RewriteCond, and drop the
<code>[OR]</code> flag from the first RewriteCond.
</p>
</dd>
</dl>
</div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
<div class="section">
<h2><a name="referer-deflector" id="referer-deflector">Referer-based Deflector</a></h2>
<dl>
<dt>Description:</dt>
<dd>
<p>Redirect requests based on the Referer from which the request
came, with different targets per Referer.</p>
</dd>
<dt>Solution:</dt>
<dd>
<p>The following ruleset uses a map file to associate each Referer
with a redirection target.</p>
<pre class="prettyprint lang-config">
RewriteMap deflector txt:/path/to/deflector.map
RewriteCond %{HTTP_REFERER} !=""
RewriteCond ${deflector:%{HTTP_REFERER}} =-
RewriteRule ^ %{HTTP_REFERER} [R,L]
RewriteCond %{HTTP_REFERER} !=""
RewriteCond ${deflector:%{HTTP_REFERER}|NOT-FOUND} !=NOT-FOUND
RewriteRule ^ ${deflector:%{HTTP_REFERER}} [R,L]
</pre>
<p>The map file lists redirection targets for each referer, or, if
we just wish to redirect back to where they came from, a "-" is
placed in the map:</p>
<div class="example"><p><code>
##<br />
## deflector.map<br />
##<br />
<br />
http://badguys.example.com/bad/index.html -<br />
http://badguys.example.com/bad/index2.html -<br />
http://badguys.example.com/bad/index3.html http://somewhere.example.com/
</code></p></div>
</dd>
</dl>
</div></div>
<div class="bottomlang">
<p><span>Available Languages: </span><a href="/en/rewrite/access.html" title="English">&nbsp;en&nbsp;</a></p>
</div><div id="footer">
<p class="apache">Copyright 2012 The Apache Software Foundation.<br />Licensed under the <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p>
<p class="menu"><a href="/mod/">Modules</a> | <a href="/mod/directives.html">Directives</a> | <a href="/faq/">FAQ</a> | <a href="/glossary.html">Glossary</a> | <a href="/sitemap.html">Sitemap</a></p></div><script type="text/javascript">
if (typeof(prettyPrint) !== undefined) {
prettyPrint();
}
</script>
</body></html>