<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>AskApache</title>
	<atom:link href="http://www.askapache.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.askapache.com</link>
	<description>Web Development</description>
	<pubDate>Thu, 21 Aug 2008 17:38:27 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.1</generator>
	<language>en</language>
			<item>
		<title>Crazy Advanced Mod_Rewrite Tutorial</title>
		<link>http://www.askapache.com/htaccess/crazy-advanced-mod_rewrite-tutorial.html</link>
		<comments>http://www.askapache.com/htaccess/crazy-advanced-mod_rewrite-tutorial.html#comments</comments>
		<pubDate>Wed, 20 Aug 2008 09:45:32 +0000</pubDate>
		<dc:creator>AskApache</dc:creator>
		
		<category><![CDATA[Apache]]></category>

		<category><![CDATA[Apache Modules]]></category>

		<category><![CDATA[htaccess]]></category>

		<category><![CDATA[mod_rewrite]]></category>

		<guid isPermaLink="false">http://www.askapache.com/?p=1209</guid>
		<description><![CDATA[<p class="anote"><strong>Note:  Extremely Sick Content</strong><br />Undocumented techniques and methods which will allow you to utilize mod_rewrite at an  "expert level" by showing you how to unlock its secrets.</p>
<p><a href="http://www.askapache.com/htaccess/crazy-advanced-mod_rewrite-tutorial.html"><img src="http://z.askapache.com/uploads/2008/08/mod_rewrite_ascii.png" alt="" title="advanced mod_rewrite tutorial" /></a><br class="C" /></p>]]></description>
			<content:encoded><![CDATA[<p><a class="tb" style="width:639px; margin:1em auto;" href="http://z.askapache.com/uploads/2008/08/mod_rewrite_ascii.png"><img src="http://z.askapache.com/uploads/2008/08/mod_rewrite_ascii.png" alt="" title="advanced mod_rewrite tutorial" /></a></p>
<p class="anote"><strong>Note:  Extremely Sick Content</strong><br />What I am about to share with you are undocumented techniques and methods which will allow you to utilize mod_rewrite at an  &#8220;expert level&#8221; by showing you how to unlock its secrets.  Oh and if you are already advanced, you are in for a treat.</p>
<p>Most if not all web developers and server administrators struggle with Apache mod_rewrite.  It&#8217;s very tough and only gets a little easier with practice.  Until Now!  Get ready to explode your learning curve, I figured something out.</p>
<h2>Why mod_rewrite is so tough</h2>
<p>I have come to the conclusion, after many hours of zenful thought, that the reason mod_rewrite is so tough is pretty obvious, people are trying to apply regular-expressions to URLs and Variables that they don&#8217;t really understand.  They understand what they want, but they don&#8217;t understand what the URLS and Variables are that they are trying to rewrite.</p>
<h2>Hit-Or-Miss with mod_rewrite</h2>
<p>A lot of the mod_rewrite &#8220;experts&#8221; and &#8220;gurus&#8221; floating around the net absolutely know their mod_rewrite, but what separates them from a beginner or novice is for the most part an understanding of what the URLS and Variables look like that are tageted by the regular expressions.  Take this simple rewriterule that rewrites requests made without the www to www.</p>

<div class="syntax">
<div class="code"><pre class="apache"><span class="kw1">RewriteEngine</span> <span class="kw2">On</span>
<span class="kw1">RewriteBase</span> /
&nbsp;
<span class="kw1">RewriteCond</span> <span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">HTTP_HOST</span><span class="br0">&#125;</span> <span class="sy1">!^</span>www\.askapache\.com<span class="sy1">$</span> <span class="br0">&#91;</span>NC<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">+</span> http://www.askapache.com<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">REQUEST_URI</span><span class="br0">&#125;</span></pre></div>
</div>

<p>Pretty simple right?  WRONG.  Most people could not figure that out..</p>
<h3>Why?</h3>
<p>The reason intelligent people can&#8217;t figure that out is because they have no idea what HTTP_HOST or REQUEST_URI actually looks like.  How can you write a rule for something if you don&#8217;t know what it looks like?  You can&#8217;t.</p>
<h2>When Not To Use Mod_Rewrite</h2>
<p>Ok so heres an important concept that alot of people haven&#8217;t heard.  You should only use <a href="http://www.askapache.com/htaccess/mod_rewrite-tips-and-tricks.html">mod_rewrite&#8217;s rewriterule </a>when you use a rewritecond or if you are rewriting internally like my <a href="http://www.askapache.com/htaccess/pimp-out-your-feedburner-count.html">feedcount hack</a>.</p>
<p>If you are simply redirecting one url to another, you should definately be using the much easier <a href="http://www.askapache.com/htaccess/seo-search-engine-friendly-redirects-without-mod_rewrite.html">mod_alias&#8217;s redirect and redirectmatch</a>, which is enabled on most Apache servers.</p>
<h2>When To Use Mod_Rewrite</h2>
<p>So then, you should only use mod_rewrite&#8217;s rewriterule when you are checking against one of the Apache Environment Variables to determine whether to rewrite or not.  This is where the Apache Documentation is grossly lacking.  They don&#8217;t tell you what those variables look like, leaving us completely incapable of creating rewrites based on them.  <strong>Not anymore.</strong></p>
<h3>Mod_Rewrite Environment Variables (The Secret)</h3>
<p>Here&#8217;s the variables I have found accessible by <a href="http://httpd.apache.org/docs/trunk/mod/mod_rewrite.html#rewritecond">mod_rewrite</a> (both documented and undocumented).   A thing to note is that you can set these variables early in an .htaccess file using SetEnv, RewriteRule, Header, etc.. and they will be accessible at the end of the .htaccess file.<br class="C" /></p>
<ul class="UL1">
<li><code>API_VERSION</code></li>
<li><code>AUTH_TYPE</code></li>
<li><code>CONTENT_LENGTH</code></li>
<li><code>CONTENT_TYPE</code></li>
<li><code>DOCUMENT_ROOT</code></li>
<li><code>GATEWAY_INTERFACE</code></li>
<li><code>HTTPS</code></li>
<li><code>HTTP_ACCEPT</code></li>
<li><code>HTTP_ACCEPT_CHARSET</code></li>
<li><code>HTTP_ACCEPT_ENCODING</code></li>
<li><code>HTTP_ACCEPT_LANGUAGE</code></li>
<li><code>HTTP_CACHE_CONTROL</code></li>
</ul>
<ul class="UL1">
<li><code>HTTP_CONNECTION</code></li>
<li><code>HTTP_COOKIE</code></li>
<li><code>HTTP_FORWARDED</code></li>
<li><code>HTTP_HOST</code></li>
<li><code>HTTP_KEEP_ALIVE</code></li>
<li><code>HTTP_PROXY_CONNECTION</code></li>
<li><code>HTTP_REFERER</code></li>
<li><code>HTTP_USER_AGENT</code></li>
<li><code>IS_SUBREQ</code></li>
<li><code>ORIG_PATH_INFO</code></li>
<li><code>ORIG_PATH_TRANSLATED</code></li>
<li><code>ORIG_SCRIPT_FILENAME</code></li>
</ul>
<ul class="UL1">
<li><code>ORIG_SCRIPT_NAME</code></li>
<li><code>PATH</code></li>
<li><code>PATH_INFO</code></li>
<li><code>PHP_SELF</code></li>
<li><code>QUERY_STRING</code></li>
<li><code>REDIRECT_QUERY_STRING</code></li>
<li><code>REDIRECT_REMOTE_USER</code></li>
<li><code>REDIRECT_STATUS</code></li>
<li><code>REDIRECT_URL</code></li>
<li><code>REMOTE_ADDR</code></li>
<li><code>REMOTE_HOST</code></li>
<li><code>REMOTE_IDENT</code></li>
</ul>
<ul class="UL1">
<li><code>REMOTE_PORT</code></li>
<li><code>REMOTE_USER</code></li>
<li><code>REQUEST_FILENAME</code></li>
<li><code>REQUEST_METHOD</code></li>
<li><code>REQUEST_TIME</code></li>
<li><code>REQUEST_URI</code></li>
<li><code>SCRIPT_FILENAME</code></li>
<li><code>SCRIPT_GROUP</code></li>
<li><code>SCRIPT_NAME</code></li>
<li><code>SCRIPT_URI</code></li>
<li><code>SCRIPT_URL</code></li>
<li><code>SCRIPT_USER</code></li>
</ul>
<ul class="UL1">
<li><code>SERVER_ADDR</code></li>
<li><code>SERVER_ADMIN</code></li>
<li><code>SERVER_NAME</code></li>
<li><code>SERVER_PORT</code></li>
<li><code>SERVER_PROTOCOL</code></li>
<li><code>SERVER_SIGNATURE</code></li>
<li><code>SERVER_SOFTWARE</code></li>
<li><code>THE_REQUEST</code></li>
<li><code>TIME</code></li>
<li><code>TIME_DAY</code></li>
<li><code>TIME_HOUR</code></li>
<li><code>TIME_MIN</code></li>
</ul>
<ul class="UL1">
<li><code>TIME_MON</code></li>
<li><code>TIME_SEC</code></li>
<li><code>TIME_WDAY</code></li>
<li><code>TIME_YEAR</code></li>
<li><code>TZ</code></li>
<li><code>UNIQUE_ID</code></li>
</ul>
<hr class="C" />
<h2>Decoding Mod_Rewrite Variables</h2>
<p>So when I realized my problem was that I didn&#8217;t know the value of the variable being tested by the RewriteCond, I set out to try and discover how to view those variables..  Keep in mind you can also use RewriteLogging, but its only allowed for root users who can edit the httpd.conf, this is .htaccess.</p>
<h3>Setting Environment Variables with RewriteRule</h3>
<p>I discovered a multitude of methods to set and view apache environment variables, using various modules and some core tricks, but the method that allows me to view the most environment variables is RewriteRule.. I wanted to use <a href="http://www.askapache.com/htaccess/setenvif.html">SetEnvIf</a> more, but its just not as powerful as mod_rewrite, due to programming.</p>
<p>This code sets the variable <code>INFO_REQUEST_URI</code> to have the value of <code>REQUEST_URI</code>.</p>

<div class="syntax">
<div class="code"><pre class="apache"><span class="kw1">RewriteEngine</span> <span class="kw2">On</span>
<span class="kw1">RewriteBase</span> /
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_REQUEST_URI:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">REQUEST_URI</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span></pre></div>
</div>

<h3>Saving The Variable Values</h3>
<p>Now the trick is how to view that environment variable&#8230;  The method I came up with is nice&#8230; We will send the environment variable value in an HTTP Header, as there isn&#8217;t much data manipulation/validation so you get an accurate look at the actual value..  At first I tried adding the variable value to a redirection using the query_string.. but a HTTP_USER_AGENT value doesn&#8217;t play well as a query_string.</p>
<h4>Using RequestHeader</h4>
<p>This code takes advantage of the incredible mod_headers apache module to actually ADD a whole new header to YOUR request.  Seriously one of the coolest tricks I&#8217;ve found yet.. Its almost the same as being able to spoof POST requests!  Since Headers can be protected data&#8230; <em>especially the HTTP_COOKIE header</em>..</p>

<div class="syntax">
<div class="code"><pre class="apache"><span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_REQUEST_URI <span class="st0">&quot;%{INFO_REQUEST_URI}e&quot;</span></pre></div>
</div>

<h3>Viewing The Variable Values</h3>
<p>Now you can use any kind of server-run interpreter like perl, php, ruby, etc., to view all the variable values.  All cgi-script handlers like those are able to view request headers.. </p>
<h3>PHP Code to access Variables</h3>
<p>Works even in safe-mode&#8230; any interpreter can view HTTP Headers!  Note that each of these variables are added as HTTP headers to the request for the script.. kinda confusing.. So each variable sent as a header is prefixed with HTTP_ to denote it was a header.</p>

<div class="syntax">
<div class="code"><pre class="php"><span class="kw2">&lt;?php</span>
<span class="kw3">header</span><span class="br0">&#40;</span><span class="st0">&quot;Content-Type: text/plain&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="re0">$INFO</span><span class="sy0">=</span><span class="re0">$MISS</span><span class="sy0">=</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re0">$_SERVER</span> <span class="kw1">as</span> <span class="re0">$v</span><span class="sy0">=&gt;</span><span class="re0">$r</span><span class="br0">&#41;</span>
<span class="br0">&#123;</span>
	<span class="kw1">if</span><span class="br0">&#40;</span><span class="kw3">substr</span><span class="br0">&#40;</span><span class="re0">$v</span><span class="sy0">,</span><span class="nu0">0</span><span class="sy0">,</span><span class="nu0">9</span><span class="br0">&#41;</span><span class="sy0">==</span><span class="st0">'HTTP_INFO'</span><span class="br0">&#41;</span>	
	<span class="br0">&#123;</span>
		<span class="kw1">if</span><span class="br0">&#40;</span><span class="sy0">!</span><span class="kw3">empty</span><span class="br0">&#40;</span><span class="re0">$r</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="re0">$INFO</span><span class="br0">&#91;</span><span class="kw3">substr</span><span class="br0">&#40;</span><span class="re0">$v</span><span class="sy0">,</span><span class="nu0">10</span><span class="br0">&#41;</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="re0">$r</span><span class="sy0">;</span>
		<span class="kw1">else</span> <span class="re0">$MISS</span><span class="br0">&#91;</span><span class="kw3">substr</span><span class="br0">&#40;</span><span class="re0">$v</span><span class="sy0">,</span><span class="nu0">10</span><span class="br0">&#41;</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="re0">$r</span><span class="sy0">;</span>
	<span class="br0">&#125;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="kw3">sort</span><span class="br0">&#40;</span><span class="re0">$INFO</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="kw3">sort</span><span class="br0">&#40;</span><span class="re0">$MISS</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="kw3">sort</span><span class="br0">&#40;</span><span class="re0">$_SERVER</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="kw3">echo</span> <span class="st0">&quot;Received These Variables:<span class="es0">\n</span>&quot;</span><span class="sy0">;</span>
<span class="kw3">print_r</span><span class="br0">&#40;</span><span class="re0">$INFO</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="kw3">echo</span> <span class="st0">&quot;Missed These Variables:<span class="es0">\n</span>&quot;</span><span class="sy0">;</span>
<span class="kw3">print_r</span><span class="br0">&#40;</span><span class="re0">$MISS</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="kw3">echo</span> <span class="st0">&quot;ALL Variables:<span class="es0">\n</span>&quot;</span><span class="sy0">;</span>
<span class="kw3">print_r</span><span class="br0">&#40;</span><span class="re0">$_SERVER</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="kw2">?&gt;</span></pre></div>
</div>

<h2>Time to Get Crazy</h2>
<p>Ok, so I&#8217;ve prepared the .htaccess code you can use to view the values of all these variables.  Just add it to a .htaccess file and make a request.  For this test I created an index.php file that printed out all the $_SERVER variables, and made requests to it.</p>

<div class="syntax">
<div class="code"><pre class="apache"><span class="kw1">RewriteEngine</span> <span class="kw2">On</span>
<span class="kw1">RewriteBase</span> /
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_API_VERSION:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">API_VERSION</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_AUTH_TYPE:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">AUTH_TYPE</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_CONTENT_LENGTH:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">CONTENT_LENGTH</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_CONTENT_TYPE:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">CONTENT_TYPE</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_DOCUMENT_ROOT:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">DOCUMENT_ROOT</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_GATEWAY_INTERFACE:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">GATEWAY_INTERFACE</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_HTTPS:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">HTTPS</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_HTTP_ACCEPT:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">HTTP_ACCEPT</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_HTTP_ACCEPT_CHARSET:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">HTTP_ACCEPT_CHARSET</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_HTTP_ACCEPT_ENCODING:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">HTTP_ACCEPT_ENCODING</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_HTTP_ACCEPT_LANGUAGE:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">HTTP_ACCEPT_LANGUAGE</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_HTTP_CACHE_CONTROL:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">HTTP_CACHE_CONTROL</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_HTTP_CONNECTION:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">HTTP_CONNECTION</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_HTTP_COOKIE:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">HTTP_COOKIE</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_HTTP_FORWARDED:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">HTTP_FORWARDED</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_HTTP_HOST:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">HTTP_HOST</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_HTTP_KEEP_ALIVE:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">HTTP_KEEP_ALIVE</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_HTTP_MOD_SECURITY_MESSAGE:<span class="sy1">%</span><span class="br0">&#123;</span>HTTP_MOD_SECURITY_MESSAGE<span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_HTTP_PROXY_CONNECTION:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">HTTP_PROXY_CONNECTION</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_HTTP_REFERER:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">HTTP_REFERER</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_HTTP_USER_AGENT:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">HTTP_USER_AGENT</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_IS_SUBREQ:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">IS_SUBREQ</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_ORIG_PATH_INFO:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">ORIG_PATH_INFO</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_ORIG_PATH_TRANSLATED:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">ORIG_PATH_TRANSLATED</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_ORIG_SCRIPT_FILENAME:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">ORIG_SCRIPT_FILENAME</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_ORIG_SCRIPT_NAME:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">ORIG_SCRIPT_NAME</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_PATH:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">PATH</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_PATH_INFO:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">PATH_INFO</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_PHP_SELF:<span class="sy1">%</span><span class="br0">&#123;</span>PHP_SELF<span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_QUERY_STRING:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">QUERY_STRING</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_REDIRECT_QUERY_STRING:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">REDIRECT_QUERY_STRING</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_REDIRECT_REMOTE_USER:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">REDIRECT_REMOTE_USER</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_REDIRECT_STATUS:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">REDIRECT_STATUS</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_REDIRECT_URL:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">REDIRECT_URL</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_REMOTE_ADDR:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">REMOTE_ADDR</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_REMOTE_HOST:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">REMOTE_HOST</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_REMOTE_IDENT:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">REMOTE_IDENT</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_REMOTE_PORT:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">REMOTE_PORT</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_REMOTE_USER:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">REMOTE_USER</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_REQUEST_FILENAME:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">REQUEST_FILENAME</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_REQUEST_METHOD:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">REQUEST_METHOD</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_REQUEST_TIME:<span class="sy1">%</span><span class="br0">&#123;</span>REQUEST_TIME<span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_REQUEST_URI:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">REQUEST_URI</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_SCRIPT_FILENAME:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">SCRIPT_FILENAME</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_SCRIPT_GROUP:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">SCRIPT_GROUP</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_SCRIPT_NAME:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">SCRIPT_NAME</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_SCRIPT_URI:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">SCRIPT_URI</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_SCRIPT_URL:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">SCRIPT_URL</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_SCRIPT_USER:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">SCRIPT_USER</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_SERVER_ADDR:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">SERVER_ADDR</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_SERVER_ADMIN:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">SERVER_ADMIN</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_SERVER_NAME:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">SERVER_NAME</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_SERVER_PORT:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">SERVER_PORT</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_SERVER_PROTOCOL:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">SERVER_PROTOCOL</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_SERVER_SIGNATURE:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">SERVER_SIGNATURE</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_SERVER_SOFTWARE:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">SERVER_SOFTWARE</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_THE_REQUEST:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">THE_REQUEST</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_TIME:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">TIME</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_TIME_DAY:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">TIME_DAY</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_TIME_HOUR:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">TIME_HOUR</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_TIME_MIN:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">TIME_MIN</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_TIME_MON:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">TIME_MON</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_TIME_SEC:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">TIME_SEC</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_TIME_WDAY:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">TIME_WDAY</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_TIME_YEAR:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">TIME_YEAR</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_TZ:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">TZ</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> <span class="sy1">-</span> <span class="br0">&#91;</span>E<span class="sy1">=</span>INFO_UNIQUE_ID:<span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">UNIQUE_ID</span><span class="br0">&#125;</span>,NE<span class="br0">&#93;</span>
&nbsp;
&nbsp;
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_API_VERSION <span class="st0">&quot;%{INFO_API_VERSION}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_AUTH_TYPE <span class="st0">&quot;%{INFO_AUTH_TYPE}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_CONTENT_LENGTH <span class="st0">&quot;%{INFO_CONTENT_LENGTH}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_CONTENT_TYPE <span class="st0">&quot;%{INFO_CONTENT_TYPE}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_DOCUMENT_ROOT <span class="st0">&quot;%{INFO_DOCUMENT_ROOT}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_GATEWAY_INTERFACE <span class="st0">&quot;%{INFO_GATEWAY_INTERFACE}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_HTTPS <span class="st0">&quot;%{INFO_HTTPS}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_HTTP_ACCEPT <span class="st0">&quot;%{INFO_HTTP_ACCEPT}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_HTTP_ACCEPT_CHARSET <span class="st0">&quot;%{INFO_HTTP_ACCEPT_CHARSET}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_HTTP_ACCEPT_ENCODING <span class="st0">&quot;%{INFO_HTTP_ACCEPT_ENCODING}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_HTTP_ACCEPT_LANGUAGE <span class="st0">&quot;%{INFO_HTTP_ACCEPT_LANGUAGE}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_HTTP_CACHE_CONTROL <span class="st0">&quot;%{INFO_HTTP_CACHE_CONTROL}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_HTTP_CONNECTION <span class="st0">&quot;%{INFO_HTTP_CONNECTION}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_HTTP_COOKIE <span class="st0">&quot;%{INFO_HTTP_COOKIE}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_HTTP_FORWARDED <span class="st0">&quot;%{INFO_HTTP_FORWARDED}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_HTTP_HOST <span class="st0">&quot;%{INFO_HTTP_HOST}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_HTTP_KEEP_ALIVE <span class="st0">&quot;%{INFO_HTTP_KEEP_ALIVE}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_HTTP_MOD_SECURITY_MESSAGE <span class="st0">&quot;%{INFO_HTTP_MOD_SECURITY_MESSAGE}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_HTTP_PROXY_CONNECTION <span class="st0">&quot;%{INFO_HTTP_PROXY_CONNECTION}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_HTTP_REFERER <span class="st0">&quot;%{INFO_HTTP_REFERER}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_HTTP_USER_AGENT <span class="st0">&quot;%{INFO_HTTP_USER_AGENT}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_IS_SUBREQ <span class="st0">&quot;%{INFO_IS_SUBREQ}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_ORIG_PATH_INFO <span class="st0">&quot;%{INFO_ORIG_PATH_INFO}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_ORIG_PATH_TRANSLATED <span class="st0">&quot;%{INFO_ORIG_PATH_TRANSLATED}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_ORIG_SCRIPT_FILENAME <span class="st0">&quot;%{INFO_ORIG_SCRIPT_FILENAME}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_ORIG_SCRIPT_NAME <span class="st0">&quot;%{INFO_ORIG_SCRIPT_NAME}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_PATH <span class="st0">&quot;%{INFO_PATH}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_PATH_INFO <span class="st0">&quot;%{INFO_PATH_INFO}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_PHP_SELF <span class="st0">&quot;%{INFO_PHP_SELF}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_QUERY_STRING <span class="st0">&quot;%{INFO_QUERY_STRING}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_REDIRECT_QUERY_STRING <span class="st0">&quot;%{INFO_REDIRECT_QUERY_STRING}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_REDIRECT_REMOTE_USER <span class="st0">&quot;%{INFO_REDIRECT_REMOTE_USER}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_REDIRECT_STATUS <span class="st0">&quot;%{INFO_REDIRECT_STATUS}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_REDIRECT_URL <span class="st0">&quot;%{INFO_REDIRECT_URL}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_REMOTE_ADDR <span class="st0">&quot;%{INFO_REMOTE_ADDR}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_REMOTE_HOST <span class="st0">&quot;%{INFO_REMOTE_HOST}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_REMOTE_IDENT <span class="st0">&quot;%{INFO_REMOTE_IDENT}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_REMOTE_PORT <span class="st0">&quot;%{INFO_REMOTE_PORT}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_REMOTE_USER <span class="st0">&quot;%{INFO_REMOTE_USER}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_REQUEST_FILENAME <span class="st0">&quot;%{INFO_REQUEST_FILENAME}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_REQUEST_METHOD <span class="st0">&quot;%{INFO_REQUEST_METHOD}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_REQUEST_TIME <span class="st0">&quot;%{INFO_REQUEST_TIME}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_REQUEST_URI <span class="st0">&quot;%{INFO_REQUEST_URI}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_SCRIPT_FILENAME <span class="st0">&quot;%{INFO_SCRIPT_FILENAME}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_SCRIPT_GROUP <span class="st0">&quot;%{INFO_SCRIPT_GROUP}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_SCRIPT_NAME <span class="st0">&quot;%{INFO_SCRIPT_NAME}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_SCRIPT_URI <span class="st0">&quot;%{INFO_SCRIPT_URI}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_SCRIPT_URL <span class="st0">&quot;%{INFO_SCRIPT_URL}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_SCRIPT_USER <span class="st0">&quot;%{INFO_SCRIPT_USER}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_SERVER_ADDR <span class="st0">&quot;%{INFO_SERVER_ADDR}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_SERVER_ADMIN <span class="st0">&quot;%{INFO_SERVER_ADMIN}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_SERVER_NAME <span class="st0">&quot;%{INFO_SERVER_NAME}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_SERVER_PORT <span class="st0">&quot;%{INFO_SERVER_PORT}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_SERVER_PROTOCOL <span class="st0">&quot;%{INFO_SERVER_PROTOCOL}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_SERVER_SIGNATURE <span class="st0">&quot;%{INFO_SERVER_SIGNATURE}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_SERVER_SOFTWARE <span class="st0">&quot;%{INFO_SERVER_SOFTWARE}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_THE_REQUEST <span class="st0">&quot;%{INFO_THE_REQUEST}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_TIME <span class="st0">&quot;%{INFO_TIME}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_TIME_DAY <span class="st0">&quot;%{INFO_TIME_DAY}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_TIME_HOUR <span class="st0">&quot;%{INFO_TIME_HOUR}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_TIME_MIN <span class="st0">&quot;%{INFO_TIME_MIN}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_TIME_MON <span class="st0">&quot;%{INFO_TIME_MON}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_TIME_SEC <span class="st0">&quot;%{INFO_TIME_SEC}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_TIME_WDAY <span class="st0">&quot;%{INFO_TIME_WDAY}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_TIME_YEAR <span class="st0">&quot;%{INFO_TIME_YEAR}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_TZ <span class="st0">&quot;%{INFO_TZ}e&quot;</span>
<span class="kw1">RequestHeader</span> <span class="kw2">set</span> INFO_UNIQUE_ID <span class="st0">&quot;%{INFO_UNIQUE_ID}e&quot;</span></pre></div>
</div>

<h2>Mod_Rewrite Variables Decoded!</h2>

<div class="syntax">
<div class="code"><pre class="apache"><span class="br0">&#91;</span><span class="kw2">API_VERSION</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; <span class="nu0">20020903</span>:<span class="nu0">12</span>
<span class="br0">&#91;</span><span class="kw2">AUTH_TYPE</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; Digest
<span class="br0">&#91;</span><span class="kw2">DOCUMENT_ROOT</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; /home/<span class="kw1">user</span>/www_root/askapache.com
<span class="br0">&#91;</span><span class="kw2">HTTPS</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; <span class="kw2">off</span>
<span class="br0">&#91;</span><span class="kw2">HTTP_ACCEPT</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; text/xml,application/xml,application/xhtml<span class="sy1">+</span>xml,text/html;q<span class="sy1">=</span><span class="nu0">0.9</span>,text/plain;q<span class="sy1">=</span><span class="nu0">0.8</span>,image/png,<span class="sy1">*</span>/<span class="sy1">*</span>;q<span class="sy1">=</span><span class="nu0">0.5</span>
<span class="br0">&#91;</span><span class="kw2">HTTP_COOKIE</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; PHPSESSID<span class="sy1">=</span>752ee6d56e15f305233e30045987e5ce568c034; __qca<span class="sy1">=</span><span class="nu0">1176541225</span><span class="nu0">-59967328</span><span class="nu0">-5223185</span>;
<span class="br0">&#91;</span><span class="kw2">HTTP_HOST</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; www.askapache.com
<span class="br0">&#91;</span><span class="kw2">HTTP_REFERER</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; http://www.askapache.com/protest/index.php?askapache<span class="sy1">=</span>awesomeness&amp;you<span class="sy1">=</span>rock
<span class="br0">&#91;</span><span class="kw2">HTTP_USER_AGENT</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; Mozilla/<span class="nu0">5.0</span> <span class="br0">&#40;</span>Windows; U; Windows NT <span class="nu0">5.1</span>; en<span class="sy1">-</span>US; rv:<span class="nu0">1.8</span><span class="nu0">.1</span><span class="nu0">.16</span><span class="br0">&#41;</span> Gecko/<span class="nu0">20080702</span> Firefox/<span class="nu0">2.0</span><span class="nu0">.0</span><span class="nu0">.16</span>
<span class="br0">&#91;</span><span class="kw2">IS_SUBREQ</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; false
<span class="br0">&#91;</span><span class="kw2">QUERY_STRING</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; e<span class="sy1">=</span><span class="nu0">404</span>
<span class="br0">&#91;</span><span class="kw2">REMOTE_ADDR</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; <span class="nu0">22.162</span><span class="nu0">.144</span><span class="nu0">.211</span>
<span class="br0">&#91;</span><span class="kw2">REMOTE_HOST</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; <span class="nu0">22.162</span><span class="nu0">.144</span><span class="nu0">.211</span>
<span class="br0">&#91;</span><span class="kw2">REMOTE_PORT</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; <span class="nu0">4511</span>
<span class="br0">&#91;</span><span class="kw2">REMOTE_USER</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; administrator
<span class="br0">&#91;</span><span class="kw2">REQUEST_FILENAME</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; /home/<span class="kw1">user</span>/www_root/askapache.com/protest/index.php
<span class="br0">&#91;</span><span class="kw2">REQUEST_METHOD</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; GET
<span class="br0">&#91;</span><span class="kw2">REQUEST_URI</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; /protest/index.php
<span class="br0">&#91;</span><span class="kw2">SCRIPT_FILENAME</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; /home/<span class="kw1">user</span>/www_root/askapache.com/protest/index.php
<span class="br0">&#91;</span><span class="kw2">SCRIPT_GROUP</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; daemonu
<span class="br0">&#91;</span><span class="kw2">SCRIPT_USER</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; askapache
<span class="br0">&#91;</span><span class="kw2">SERVER_ADDR</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; <span class="nu0">208.113</span><span class="nu0">.134</span><span class="nu0">.190</span>
<span class="br0">&#91;</span><span class="kw2">SERVER_ADMIN</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; webmaster<span class="sy1">@</span>askapache.com
<span class="br0">&#91;</span><span class="kw2">SERVER_NAME</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; www.askapache.com
<span class="br0">&#91;</span><span class="kw2">SERVER_PORT</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; <span class="nu0">80</span>
<span class="br0">&#91;</span><span class="kw2">SERVER_PROTOCOL</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; HTTP/<span class="nu0">1.1</span>
<span class="br0">&#91;</span><span class="kw2">SERVER_SOFTWARE</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; Apache/<span class="nu0">2.0</span><span class="nu0">.61</span> <span class="br0">&#40;</span>Unix<span class="br0">&#41;</span> PHP/<span class="nu0">4.4</span><span class="nu0">.7</span> mod_ssl/<span class="nu0">2.0</span><span class="nu0">.61</span> OpenSSL/<span class="nu0">0.9</span>.7e mod_fastcgi/<span class="nu0">2.4</span><span class="nu0">.2</span> <span class="kw1">DAV</span>/<span class="nu0">2</span>
<span class="br0">&#91;</span><span class="kw2">THE_REQUEST</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; GET /protest/adf HTTP/<span class="nu0">1.1</span>
<span class="br0">&#91;</span><span class="kw2">TIME</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; <span class="nu0">20080820014309</span>
<span class="br0">&#91;</span><span class="kw2">TIME_DAY</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; <span class="nu0">20</span>
<span class="br0">&#91;</span><span class="kw2">TIME_HOUR</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; <span class="nu0">01</span>
<span class="br0">&#91;</span><span class="kw2">TIME_MIN</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; <span class="nu0">43</span>
<span class="br0">&#91;</span><span class="kw2">TIME_MON</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; <span class="nu0">08</span>
<span class="br0">&#91;</span><span class="kw2">TIME_SEC</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; <span class="nu0">09</span>
<span class="br0">&#91;</span><span class="kw2">TIME_WDAY</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; <span class="nu0">3</span>
<span class="br0">&#91;</span><span class="kw2">TIME_YEAR</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; <span class="nu0">2008</span></pre></div>
</div>

<h3>Request using HTTPS</h3>

<div class="syntax">
<div class="code"><pre class="apache"><span class="br0">&#91;</span><span class="kw2">API_VERSION</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; <span class="nu0">20020903</span>:<span class="nu0">12</span>
<span class="br0">&#91;</span><span class="kw2">AUTH_TYPE</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; Digest
<span class="br0">&#91;</span><span class="kw2">DOCUMENT_ROOT</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; /home/<span class="kw1">user</span>/www_root/askapache.com
<span class="br0">&#91;</span><span class="kw2">HTTPS</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; <span class="kw2">on</span>
<span class="br0">&#91;</span><span class="kw2">HTTP_ACCEPT</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; text/xml,application/xml,application/xhtml<span class="sy1">+</span>xml,text/html;q<span class="sy1">=</span><span class="nu0">0.9</span>,text/plain;q<span class="sy1">=</span><span class="nu0">0.8</span>,image/png,<span class="sy1">*</span>/<span class="sy1">*</span>;q<span class="sy1">=</span><span class="nu0">0.5</span>
<span class="br0">&#91;</span><span class="kw2">HTTP_COOKIE</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; PHPSESSID<span class="sy1">=</span>752ee6d56e15f305233e30045987e5ce568c034; __qca<span class="sy1">=</span><span class="nu0">1176541225</span><span class="nu0">-59967328</span><span class="nu0">-5223185</span>;
<span class="br0">&#91;</span><span class="kw2">HTTP_HOST</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; www.askapache.com
<span class="br0">&#91;</span><span class="kw2">HTTP_REFERER</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; http://www.askapache.com/protest/index.php?askapache<span class="sy1">=</span>awesomeness&amp;you<span class="sy1">=</span>rock
<span class="br0">&#91;</span><span class="kw2">HTTP_USER_AGENT</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; Mozilla/<span class="nu0">5.0</span> <span class="br0">&#40;</span>Windows; U; Windows NT <span class="nu0">5.1</span>; en<span class="sy1">-</span>US; rv:<span class="nu0">1.8</span><span class="nu0">.1</span><span class="nu0">.16</span><span class="br0">&#41;</span> Gecko/<span class="nu0">20080702</span> Firefox/<span class="nu0">2.0</span><span class="nu0">.0</span><span class="nu0">.16</span>
<span class="br0">&#91;</span><span class="kw2">IS_SUBREQ</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; false
<span class="br0">&#91;</span><span class="kw2">QUERY_STRING</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; hi<span class="sy1">=</span>you&amp;whats<span class="sy1">=</span>&amp;amp;you
<span class="br0">&#91;</span><span class="kw2">REMOTE_ADDR</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; <span class="nu0">22.162</span><span class="nu0">.144</span><span class="nu0">.211</span>
<span class="br0">&#91;</span><span class="kw2">REMOTE_HOST</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; <span class="nu0">22.162</span><span class="nu0">.144</span><span class="nu0">.211</span>
<span class="br0">&#91;</span><span class="kw2">REMOTE_PORT</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; <span class="nu0">4605</span>
<span class="br0">&#91;</span><span class="kw2">REMOTE_USER</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; administrator
<span class="br0">&#91;</span><span class="kw2">REQUEST_FILENAME</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; /home/<span class="kw1">user</span>/www_root/askapache.com/protest/index.php
<span class="br0">&#91;</span><span class="kw2">REQUEST_METHOD</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; GET
<span class="br0">&#91;</span><span class="kw2">REQUEST_URI</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; /protest/index.php
<span class="br0">&#91;</span><span class="kw2">SCRIPT_FILENAME</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; /home/<span class="kw1">user</span>/www_root/askapache.com/protest/index.php
<span class="br0">&#91;</span><span class="kw2">SCRIPT_GROUP</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; daemonu
<span class="br0">&#91;</span><span class="kw2">SCRIPT_USER</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; askapache
<span class="br0">&#91;</span><span class="kw2">SERVER_ADDR</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; <span class="nu0">208.113</span><span class="nu0">.134</span><span class="nu0">.190</span>
<span class="br0">&#91;</span><span class="kw2">SERVER_ADMIN</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; webmaster<span class="sy1">@</span>askapache.com
<span class="br0">&#91;</span><span class="kw2">SERVER_NAME</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; www.askapache.com
<span class="br0">&#91;</span><span class="kw2">SERVER_PORT</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; <span class="nu0">443</span>
<span class="br0">&#91;</span><span class="kw2">SERVER_PROTOCOL</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; HTTP/<span class="nu0">1.1</span>
<span class="br0">&#91;</span><span class="kw2">SERVER_SOFTWARE</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; Apache/<span class="nu0">2.0</span><span class="nu0">.61</span> <span class="br0">&#40;</span>Unix<span class="br0">&#41;</span> PHP/<span class="nu0">4.4</span><span class="nu0">.7</span> mod_ssl/<span class="nu0">2.0</span><span class="nu0">.61</span> OpenSSL/<span class="nu0">0.9</span>.7e mod_fastcgi/<span class="nu0">2.4</span><span class="nu0">.2</span> <span class="kw1">DAV</span>/<span class="nu0">2</span>
<span class="br0">&#91;</span><span class="kw2">THE_REQUEST</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; GET /protest/index.php?hi<span class="sy1">=</span>you&amp;whats<span class="sy1">=</span>&amp;amp;you HTTP/<span class="nu0">1.1</span>
<span class="br0">&#91;</span><span class="kw2">TIME</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; <span class="nu0">20080820015016</span>
<span class="br0">&#91;</span><span class="kw2">TIME_DAY</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; <span class="nu0">20</span>
<span class="br0">&#91;</span><span class="kw2">TIME_HOUR</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; <span class="nu0">01</span>
<span class="br0">&#91;</span><span class="kw2">TIME_MIN</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; <span class="nu0">50</span>
<span class="br0">&#91;</span><span class="kw2">TIME_MON</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; <span class="nu0">08</span>
<span class="br0">&#91;</span><span class="kw2">TIME_SEC</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; <span class="nu0">16</span>
<span class="br0">&#91;</span><span class="kw2">TIME_WDAY</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; <span class="nu0">3</span>
<span class="br0">&#91;</span><span class="kw2">TIME_YEAR</span><span class="br0">&#93;</span> <span class="sy1">=</span>&gt; <span class="nu0">2008</span></pre></div>
</div>

<h2>Emulating ErrorDocuments with Mod_Rewrite</h2>
<p>The ErrorDocument directive is helpful because an errordocument is called differently then a normal file, and it contains special variables to help an admin debug.</p>
<p>I&#8217;ve wanted to use a RewriteCond + a RewriteRule to cause an Apache ErrorDocument to be displayed for a long time&#8230; I finally figured it out.  Simply use the <a href="http://www.askapache.com/htaccess/apache-status-code-headers-errordocument.html">HTTP STATUS CODE trick</a> in combination with a simple RewriteRule to trigger an Apache ErrorDocument.</p>
<p>This code emulates the internal 404 process Apache goes through.. If the file is not found it requests the /test/trigger-error/404 internally which triggers the 404 ErrorDocument.</p>

<div class="syntax">
<div class="code"><pre class="apache"><span class="kw1">ErrorDocument</span> <span class="nu0">404</span> /test/<span class="kw1">errordocument</span>/<span class="nu0">404</span>.html
<span class="kw1">Redirect</span> <span class="nu0">404</span> /test/trigger<span class="sy1">-</span>error/<span class="nu0">404</span>
&nbsp;
<span class="kw1">RewriteEngine</span> <span class="kw2">On</span>
<span class="kw1">RewriteBase</span> /
<span class="kw1">RewriteCond</span> <span class="sy1">%</span><span class="br0">&#123;</span>ENV:<span class="kw2">REDIRECT_STATUS</span><span class="br0">&#125;</span> <span class="sy1">!=</span><span class="nu0">404</span>
<span class="kw1">RewriteCond</span> <span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">REQUEST_FILENAME</span><span class="br0">&#125;</span> <span class="sy1">!-</span>f
<span class="kw1">RewriteCond</span> <span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">REQUEST_FILENAME</span><span class="br0">&#125;</span> <span class="sy1">!-</span>d
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> /test/trigger<span class="sy1">-</span>error/<span class="nu0">404</span> <span class="br0">&#91;</span>L<span class="br0">&#93;</span></pre></div>
</div>

<p><strong>Big Deal..</strong> you might say&#8230; well consider that this works with any status code, and using this method you now have the power to trigger any errordocument page based on any kind of rewritecond.  I&#8217;ll be writing about some practical uses for this powerful method in the coming weeks, but heres a good example now so you can see how it can be used.</p>
<p>This bit of code Triggers the <a href="http://www.askapache.com/htaccess/apache-status-code-headers-errordocument.html#status-505">505 HTTP Version Not Supported</a> When a request is made to the server with a protocol other than 1.1.</p>

<div class="syntax">
<div class="code"><pre class="apache"><span class="kw1">ErrorDocument</span> <span class="nu0">505</span> /test/<span class="kw1">errordocument</span>/<span class="nu0">505</span>.html
<span class="kw1">Redirect</span> <span class="nu0">505</span> /test/trigger<span class="sy1">-</span>error/<span class="nu0">505</span>
&nbsp;
<span class="kw1">RewriteEngine</span> <span class="kw2">On</span>
<span class="kw1">RewriteBase</span> /
&nbsp;
<span class="kw1">RewriteCond</span> <span class="sy1">%</span><span class="br0">&#123;</span>ENV:<span class="kw2">REDIRECT_STATUS</span><span class="br0">&#125;</span> <span class="sy1">!=</span><span class="nu0">505</span>
<span class="kw1">RewriteCond</span> <span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">THE_REQUEST</span><span class="br0">&#125;</span> <span class="sy1">!^$</span>
<span class="kw1">RewriteCond</span> <span class="sy1">%</span><span class="br0">&#123;</span>ENV:<span class="kw2">SERVER_PROTOCOL</span><span class="br0">&#125;</span> <span class="sy1">!^</span>HTTP/<span class="nu0">1</span>\.<span class="nu0">1</span><span class="sy1">$</span>
<span class="kw1">RewriteRule</span> .<span class="sy1">*</span> /test/trigger<span class="sy1">-</span>error/<span class="nu0">505</span> <span class="br0">&#91;</span>L<span class="br0">&#93;</span></pre></div>
</div>

<p class="anote"><strong>YES!</strong> I realize I didn&#8217;t explain that very well, I didn&#8217;t realize it was that complicated..  I wanted to go into how to use these advanced tricks and methods to achieve some really cool stuff, but explaining just this little bit took me awhile and I&#8217;m out of page space!</p>
<p>So play around with this and I&#8217;ll post back some of the untapped sicknesses you can give a website with such powerful methods at your disposal.</p>

<div class="syntax">
<div class="code"><pre class="apache">/<span class="sy1">*</span>
 <span class="sy1">*</span>  URL Rewriting Module
 <span class="sy1">*</span>
 <span class="sy1">*</span>  This module uses a rule<span class="sy1">-</span>based rewriting engine <span class="br0">&#40;</span>based <span class="kw2">on</span> a
 <span class="sy1">*</span>  regular<span class="sy1">-</span>expression parser<span class="br0">&#41;</span> to rewrite requested URLs <span class="kw2">on</span> the fly.
 <span class="sy1">*</span>
 <span class="sy1">*</span>  It supports an unlimited number of additional rule conditions <span class="br0">&#40;</span>which can
 <span class="sy1">*</span>  operate <span class="kw2">on</span> a lot of variables, even <span class="kw2">on</span> HTTP headers<span class="br0">&#41;</span> for granular
 <span class="sy1">*</span>  matching and even external database lookups <span class="br0">&#40;</span>either via plain text
 <span class="sy1">*</span>  tables, DBM hash <span class="kw1">files</span> or even external processes<span class="br0">&#41;</span> for advanced URL
 <span class="sy1">*</span>  substitution.
 <span class="sy1">*</span>
 <span class="sy1">*</span>  It operates <span class="kw2">on</span> the <span class="kw2">full</span> URLs <span class="br0">&#40;</span>including the <span class="kw2">PATH_INFO</span> part<span class="br0">&#41;</span> both in
 <span class="sy1">*</span>  per<span class="sy1">-</span>server context <span class="br0">&#40;</span>httpd.conf<span class="br0">&#41;</span> and per<span class="sy1">-</span>dir context <span class="br0">&#40;</span>.htaccess<span class="br0">&#41;</span> and even
 <span class="sy1">*</span>  can generate <span class="kw2">QUERY_STRING</span> parts <span class="kw2">on</span> result.   The rewriting result finally
 <span class="sy1">*</span>  can lead to internal subprocessing, external request redirection or even
 <span class="sy1">*</span>  to internal <span class="kw1">proxy</span> throughput.
 <span class="sy1">*</span>
 <span class="sy1">*</span>  This module was originally written in April <span class="nu0">1996</span> and
 <span class="sy1">*</span>  gifted exclusively to the The Apache Software Foundation in July <span class="nu0">1997</span> by
 <span class="sy1">*</span>
 <span class="sy1">*</span>      Ralf S. Engelschall
 <span class="sy1">*</span>      rse engelschall.com
 <span class="sy1">*</span>      www.engelschall.com
 <span class="sy1">*</span>/</pre></div>
</div>

<h3>Random Posts</h3>
<ul class="related_post">
<li><a href="http://www.askapache.com/dreamhost/custom-phpini-with-fastcgi-on-dreamhost.html" title="Custom PHP.ini with FastCGI on DreamHost">Custom PHP.ini with FastCGI on DreamHost</a></li>
<li><a href="http://www.askapache.com/tools/css-browser-screenshots.html" title="CSS Cross-Browser Compatibility Tip">CSS Cross-Browser Compatibility Tip</a></li>
<li><a href="http://www.askapache.com/htaccess/apache-ssl-in-htaccess-examples.html" title="Apache SSL in htaccess examples">Apache SSL in htaccess examples</a></li>
<li><a href="http://www.askapache.com/tools/tracking-spam-and-email.html" title="Tracking Spam and email">Tracking Spam and email</a></li>
<li><a href="http://www.askapache.com/tools/wget-header-trick.html" title="Wget Trick to Download from Restrictive Sites">Wget Trick to Download from Restrictive Sites</a></li>
<li><a href="http://www.askapache.com/seo/search-engine-verification-plugin-updated.html" title="Updated: AskApache Search Engine Verify">Updated: AskApache Search Engine Verify</a></li>
<li><a href="http://www.askapache.com/htaccess/using-filesmatch-and-files-in-htaccess.html" title="Using FilesMatch and Files in htaccess">Using FilesMatch and Files in htaccess</a></li>
<li><a href="http://www.askapache.com/seo/seo-with-robotstxt.html" title="SEO with Robots.txt">SEO with Robots.txt</a></li>
<li><a href="http://www.askapache.com/htaccess/apache-speed-compression.html" title="Speed Tips: Turn On Compression ">Speed Tips: Turn On Compression </a></li>
<li><a href="http://www.askapache.com/htaccess/apache-httpd-google-cse.html" title="Apache HTTPD Google CSE">Apache HTTPD Google CSE</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.askapache.com/htaccess/crazy-advanced-mod_rewrite-tutorial.html/feed/</wfw:commentRss>
		</item>
		<item>
		<title>New Version of Password Protection Plugin</title>
		<link>http://www.askapache.com/wordpress/new-version-of-password-protection-plugin.html</link>
		<comments>http://www.askapache.com/wordpress/new-version-of-password-protection-plugin.html#comments</comments>
		<pubDate>Tue, 19 Aug 2008 13:08:39 +0000</pubDate>
		<dc:creator>AskApache</dc:creator>
		
		<category><![CDATA[WordPress]]></category>

		<category><![CDATA[WordPress Plugins]]></category>

		<guid isPermaLink="false">http://www.askapache.com/?p=1084</guid>
		<description><![CDATA[<p><a class="IFL" href="http://z.askapache.com/uploads/2008/08/screenshot-3.png"><img src="http://z.askapache.com/uploads/2008/08/screenshot-3-131x200.png" alt="" title="screenshot-3" /></a>4.6 just released.... <a href="http://wordpress.org/extend/plugins/askapache-password-protect/screenshots/">Check It Out.</a><br /><br /><strong style="font-size:19px; text-align:center;">:p</strong><br class="C" /></p>]]></description>
			<content:encoded><![CDATA[<p>I added file revisioning support to .htaccess files, so that every time you update or change the .htaccess files it saves the old copy.  The next release will provide a DIFF view of the differences.</p>
<p>Also fixed all the bugs I was notified about or found, and provided the option to bypass some of the testing if you know your server supports something.</p>
<p>I have to get back to my real job now :)  but for the next release I&#8217;m going to add a whole user-management area to add and remove users and groups from .htpasswd files. </p>
<p>Then it will be ready to start using the advanced SID&#8217;s like mod_security.. </p>
<h2>ScreenShots</h2>
<p><a class="tb" href="http://z.askapache.com/uploads/2008/08/screenshot-1.png"><br />
<img src="http://z.askapache.com/uploads/2008/08/screenshot-1.png" alt="" /><br />
</a></p>
<p><a href="http://z.askapache.com/uploads/2008/08/screenshot-2.png"><br />
<img class="tb" src="http://z.askapache.com/uploads/2008/08/screenshot-2.png" alt="" /><br />
</a></p>
<p><a rel="tb" href="http://z.askapache.com/uploads/2008/08/screenshot-3.png"><br />
<img src="http://z.askapache.com/uploads/2008/08/screenshot-3.png" alt="" /><br />
</a></p>
<p><a href="http://z.askapache.com/uploads/2008/08/screenshot-4.png"><br />
<img src="http://z.askapache.com/uploads/2008/08/screenshot-4.png" alt="" /><br />
</a></p>
<p><a href="http://z.askapache.com/uploads/2008/08/screenshot-5.png"><br />
<img src="http://z.askapache.com/uploads/2008/08/screenshot-5.png" alt="" /><br />
</a></p>
<p><a href="http://z.askapache.com/uploads/2008/08/screenshot-6.png"><br />
<img src="http://z.askapache.com/uploads/2008/08/screenshot-6.png" alt="" /><br />
</a></p>
<p style="font-size:19px;"><strong>:p</strong></p>
<h3>Random Posts</h3>
<ul class="related_post">
<li><a href="http://www.askapache.com/security/hacking-vlan-switched-networks.html" title="Hacking VLAN switched networks">Hacking VLAN switched networks</a></li>
<li><a href="http://www.askapache.com/htaccess/setenvif.html" title="SetEnvIf and SetEnvIfNoCase Examples">SetEnvIf and SetEnvIfNoCase Examples</a></li>
<li><a href="http://www.askapache.com/security/anti-virus-spyware-rootkit.html" title="Freshen your Anti-virus, Anti-Rootkits, and Anti-Spyware">Freshen your Anti-virus, Anti-Rootkits, and Anti-Spyware</a></li>
<li><a href="http://www.askapache.com/seo/seo-secrets.html" title="SEO Secrets of AskApache.com">SEO Secrets of AskApache.com</a></li>
<li><a href="http://www.askapache.com/security/changing-any-password-on-xp.html" title="Changing Any Password On XP">Changing Any Password On XP</a></li>
<li><a href="http://www.askapache.com/wordpress/wp-plugin-rewriterules-updated.html" title="Updated: WordPress RewriteRules Viewer Plugin">Updated: WordPress RewriteRules Viewer Plugin</a></li>
<li><a href="http://www.askapache.com/seo/search-engine-verification-plugin-updated.html" title="Updated: AskApache Search Engine Verify">Updated: AskApache Search Engine Verify</a></li>
<li><a href="http://www.askapache.com/css/speedy-sites-with-image-sprites-and-css.html" title="Speedier Sites use CSS Sprites">Speedier Sites use CSS Sprites</a></li>
<li><a href="http://www.askapache.com/htaccess/caching-tutorial-for-webmasters.html" title="Caching Tutorial for Webmasters">Caching Tutorial for Webmasters</a></li>
<li><a href="http://www.askapache.com/wordpress/register-user-registration-form.html" title="Fast and Easy Custom WordPress New User Registration">Fast and Easy Custom WordPress New User Registration</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.askapache.com/wordpress/new-version-of-password-protection-plugin.html/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Pimp out your FeedBurner Count</title>
		<link>http://www.askapache.com/htaccess/pimp-out-your-feedburner-count.html</link>
		<comments>http://www.askapache.com/htaccess/pimp-out-your-feedburner-count.html#comments</comments>
		<pubDate>Tue, 19 Aug 2008 08:50:18 +0000</pubDate>
		<dc:creator>AskApache</dc:creator>
		
		<category><![CDATA[SEO]]></category>

		<category><![CDATA[Shell Scripting]]></category>

		<category><![CDATA[htaccess]]></category>

		<guid isPermaLink="false">http://www.askapache.com/?p=1154</guid>
		<description><![CDATA[<p><a class="IFL" href="http://feeds.askapache.com/apache/htaccess"><img src="http://feeds.askapache.com/~fc/apache/htaccess?bg=3366CC&#038;fg=FFFFFF&#038;anim=10&#038;label=%20%20%20%20%20;%20)" width="176" height="52" /></a>I've had a lot of people ask about the FeedBurner FeedCount image on AskApache.   Specifically how to set it up with custom messages and different colors each page view... It is pretty sweet..<br class="C" /></p>]]></description>
			<content:encoded><![CDATA[<p><a href="http://feeds.askapache.com/apache/htaccess"><img src="http://feeds.askapache.com/~fc/apache/htaccess?bg=228800&#038;fg=FFFFFF&#038;anim=10&#038;label=%20%20%20%20%20;%20)" width="176" height="52" alt="wink" /></a></p>
<p>Alot of you have contacted me about the <a href="http://www.feedburner.com/">FeedBurner</a> <a href="http://feeds.askapache.com/apache/htaccess">FeedCount image on AskApache</a>.  Most people are curious as to how I can display custom text and colors.  Also there have been alot of questions about how I get it to <em>change colors with every page view</em>.  Here you go!</p>
<h2>Customizing the FeedCount Image</h2>
<p>There are several parameters that can manipulate the feedcount image by adding them onto the feedcount image url.  For example, my image url is <code>http://feeds.askapache.com/~fc/apache/htaccess</code>, so I just add on any of the following&#8230;  Play around with them, they aren&#8217;t documented officially.</p>
<dl>
<dt><a title="feedcount background color" id="feedcount-bg"><dfn title="feedcount background">bg</dfn></a></dt>
<dd>Specify the background color for the feedcount image, like <code>bg=3366CC</code></dd>
<dt><a title="feedcount foreground color" id="feedcount-fg"><dfn title="feedcount foreground">fg</dfn></a></dt>
<dd>The font color for feed count <code>fg=333333</code></dd>
<dt><a title="feedcount animation" id="feedcount-anim"><dfn title="feedcount animation">anim</dfn></a></dt>
<dd>If 0, it won&#8217;t animate.  If 10, it will animate 10 times.. or 50  <code>anim=50</code></dd>
<dt><a title="feedcount custom label" id="feedcount-label"><dfn title="feedcount custom message">label</dfn></a></dt>
<dd>This lets you specify a custom label built in to the image, instead of &#8220;readers&#8221;.. like <code>label=AxeApache</code></dd>
</dl>
<h2>Loading Different FeedCount Images</h2>
<p>I simply came up with 4 image configurations I liked using the GET parameters above, then I wrote a script to download all 4 of them to my server every 15 minutes.   Next I setup a simple <a href="http://www.askapache.com/htaccess/mod_rewrite-tips-and-tricks.html">mod_rewrite rule in .htaccess</a> that allows me to serve any of the 4 images using 1 url.</p>
<p>So when a user requests my feed image at http://z.askapache.com/feed.gif, they will in fact be seeing 1 of the 4 images, because their is no /feed.gif image.</p>
<h3>Making /feed.gif Never Cache</h3>
<p>In order for the image to be reloaded on each page-view of the site, I set up some anti-caching headers in my .htaccess file.</p>
<p>First I unset the far-future Expires headers that I normally send with images, and then I instruct browsers to check the image every request to see if it has been modified.</p>

<div class="syntax">
<div class="code"><pre class="apache"><span class="kw3">&lt;FilesMatch</span> <span class="st0">&quot;^feed(1|2|3|4)?<span class="es0">\.</span>gif$&quot;</span>&gt;
<span class="kw1">Header</span> <span class="kw2">unset</span> Expires
<span class="kw1">Header</span> <span class="kw2">set</span> Cache<span class="sy1">-</span>Control <span class="st0">&quot;no-cache, must-revalidate&quot;</span>
<span class="kw3">&lt;/FilesMatch&gt;</span></pre></div>
</div>

<h3>Rewriting /feed.gif to feed1-4.gif</h3>
<p>I save the 4 images in their own folder, so the rewrites only apply to them. This loads a different image file depending on the second of the request.</p>

<div class="syntax">
<div class="code"><pre class="apache"><span class="kw1">RewriteEngine</span> <span class="kw2">On</span>
<span class="kw1">RewriteBase</span> /
<span class="kw1">RewriteRule</span> <span class="sy1">!</span>\.gif <span class="sy1">-</span> <span class="br0">&#91;</span>S<span class="sy1">=</span><span class="nu0">4</span><span class="br0">&#93;</span>
&nbsp;
<span class="kw1">RewriteCond</span> <span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">TIME_SEC</span><span class="br0">&#125;</span> <span class="sy1">^</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="sy1">|</span><span class="nu0">4</span><span class="sy1">|</span><span class="nu0">8</span><span class="sy1">|</span><span class="nu0">12</span><span class="sy1">|</span><span class="nu0">16</span><span class="sy1">|</span><span class="nu0">22</span><span class="sy1">|</span><span class="nu0">26</span><span class="sy1">|</span><span class="nu0">30</span><span class="sy1">|</span><span class="nu0">34</span><span class="sy1">|</span><span class="nu0">38</span><span class="sy1">|</span><span class="nu0">42</span><span class="sy1">|</span><span class="nu0">46</span><span class="sy1">|</span><span class="nu0">50</span><span class="sy1">|</span><span class="nu0">54</span><span class="sy1">|</span><span class="nu0">58</span><span class="br0">&#41;</span><span class="sy1">$</span>
<span class="kw1">RewriteCond</span> <span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">REQUEST_FILENAME</span><span class="br0">&#125;</span> <span class="sy1">!-</span>f
<span class="kw1">RewriteRule</span> <span class="sy1">^</span>feed\.gif<span class="sy1">$</span> /zi/feed1.gif <span class="br0">&#91;</span>S<span class="sy1">=</span><span class="nu0">3</span><span class="br0">&#93;</span>
&nbsp;
<span class="kw1">RewriteCond</span> <span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">TIME_SEC</span><span class="br0">&#125;</span> <span class="sy1">^</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="sy1">|</span><span class="nu0">5</span><span class="sy1">|</span><span class="nu0">9</span><span class="sy1">|</span><span class="nu0">13</span><span class="sy1">|</span><span class="nu0">17</span><span class="sy1">|</span><span class="nu0">23</span><span class="sy1">|</span><span class="nu0">27</span><span class="sy1">|</span><span class="nu0">31</span><span class="sy1">|</span><span class="nu0">35</span><span class="sy1">|</span><span class="nu0">39</span><span class="sy1">|</span><span class="nu0">43</span><span class="sy1">|</span><span class="nu0">47</span><span class="sy1">|</span><span class="nu0">51</span><span class="sy1">|</span><span class="nu0">55</span><span class="sy1">|</span><span class="nu0">59</span><span class="br0">&#41;</span><span class="sy1">$</span>
<span class="kw1">RewriteCond</span> <span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">REQUEST_FILENAME</span><span class="br0">&#125;</span> <span class="sy1">!-</span>f
<span class="kw1">RewriteRule</span> <span class="sy1">^</span>feed\.gif<span class="sy1">$</span> /zi/feed2.gif <span class="br0">&#91;</span>S<span class="sy1">=</span><span class="nu0">2</span><span class="br0">&#93;</span>
&nbsp;
<span class="kw1">RewriteCond</span> <span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">TIME_SEC</span><span class="br0">&#125;</span> <span class="sy1">^</span><span class="br0">&#40;</span><span class="nu0">2</span><span class="sy1">|</span><span class="nu0">6</span><span class="sy1">|</span><span class="nu0">10</span><span class="sy1">|</span><span class="nu0">14</span><span class="sy1">|</span><span class="nu0">18</span><span class="sy1">|</span><span class="nu0">24</span><span class="sy1">|</span><span class="nu0">28</span><span class="sy1">|</span><span class="nu0">32</span><span class="sy1">|</span><span class="nu0">36</span><span class="sy1">|</span><span class="nu0">40</span><span class="sy1">|</span><span class="nu0">44</span><span class="sy1">|</span><span class="nu0">48</span><span class="sy1">|</span><span class="nu0">52</span><span class="sy1">|</span><span class="nu0">56</span><span class="sy1">|</span><span class="nu0">60</span><span class="br0">&#41;</span><span class="sy1">$</span>
<span class="kw1">RewriteCond</span> <span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">REQUEST_FILENAME</span><span class="br0">&#125;</span> <span class="sy1">!-</span>f
<span class="kw1">RewriteRule</span> <span class="sy1">^</span>feed\.gif<span class="sy1">$</span> /zi/feed3.gif <span class="br0">&#91;</span>S<span class="sy1">=</span><span class="nu0">1</span><span class="br0">&#93;</span>
&nbsp;
<span class="kw1">RewriteCond</span> <span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">TIME_SEC</span><span class="br0">&#125;</span> <span class="sy1">^</span><span class="br0">&#40;</span><span class="nu0">3</span><span class="sy1">|</span><span class="nu0">7</span><span class="sy1">|</span><span class="nu0">11</span><span class="sy1">|</span><span class="nu0">15</span><span class="sy1">|</span><span class="nu0">19</span><span class="sy1">|</span><span class="nu0">25</span><span class="sy1">|</span><span class="nu0">29</span><span class="sy1">|</span><span class="nu0">33</span><span class="sy1">|</span><span class="nu0">37</span><span class="sy1">|</span><span class="nu0">41</span><span class="sy1">|</span><span class="nu0">45</span><span class="sy1">|</span><span class="nu0">49</span><span class="sy1">|</span><span class="nu0">53</span><span class="sy1">|</span><span class="nu0">57</span><span class="br0">&#41;</span><span class="sy1">$</span>
<span class="kw1">RewriteCond</span> <span class="sy1">%</span><span class="br0">&#123;</span><span class="kw2">REQUEST_FILENAME</span><span class="br0">&#125;</span> <span class="sy1">!-</span>f
<span class="kw1">RewriteRule</span> <span class="sy1">^</span>feed\.gif<span class="sy1">$</span> /zi/feed4.gif</pre></div>
</div>

<h2>Bash Shell Script</h2>
<p>This simple shell script is what I use, it downloads 4 different feedcount images with different background/foreground colors and with custom labels.  It saves them to the BASE folder.</p>

<div class="syntax">
<div class="code"><pre class="bash"><span class="co0">#!/bin/bash</span>
<span class="kw2">umask</span> <span class="nu0">022</span>
&nbsp;
<span class="re2">BASE=</span><span class="st0">&quot;/home/askapache.com/i/feed&quot;</span>
<span class="re2">FEEDURL=</span><span class="st0">&quot;http://feeds.askapache.com/~fc/apache/htaccess<span class="es0">\?</span>bg=&quot;</span>
<span class="re2">FEEDOPT=</span><span class="st0">&quot;<span class="es0">\&amp;</span>fg=FFFFFF<span class="es0">\&amp;</span>anim=1<span class="es0">\&amp;</span>label=&quot;</span>
<span class="re2">CURLOPTS=</span><span class="st0">&quot;-s -S -L -A 'Mozilla/5.0' -m 400&quot;</span>
&nbsp;
<span class="kw2">curl</span> <span class="re1">$CURLOPTS</span> -o <span class="co1">${BASE}</span><span class="nu0">1</span>.gif <span class="co1">${FEEDURL}</span>3366CC<span class="co1">${FEEDOPT}</span>chilling
<span class="kw2">curl</span> <span class="re1">$CURLOPTS</span> -o <span class="co1">${BASE}</span><span class="nu0">2</span>.gif <span class="co1">${FEEDURL}</span><span class="nu0">333333</span><span class="co1">${FEEDOPT}</span>smoking
<span class="kw2">curl</span> <span class="re1">$CURLOPTS</span> -o <span class="co1">${BASE}</span><span class="nu0">3</span>.gif <span class="co1">${FEEDURL}</span><span class="nu0">228800</span><span class="co1">${FEEDOPT}</span>on\<span class="sy0">%</span>20fire
<span class="kw2">curl</span> <span class="re1">$CURLOPTS</span> -o <span class="co1">${BASE}</span><span class="nu0">4</span>.gif <span class="co1">${FEEDURL}</span>BB0000<span class="co1">${FEEDOPT}</span>loving
&nbsp;
<span class="kw2">exit</span> <span class="nu0">0</span></pre></div>
</div>

<h2>Crontab Entry</h2>
<p>This crontab runs the above shell script every 15 minutes, ensuring you have an up-to-date feed count.</p>

<div class="syntax">
<div class="code"><pre class="bash"><span class="sy0">*/</span><span class="nu0">15</span> <span class="sy0">*</span> <span class="sy0">*</span> <span class="sy0">*</span> <span class="sy0">*</span> <span class="sy0">/</span>home<span class="sy0">/</span>cron<span class="sy0">/</span>feedcount.<span class="kw2">sh</span> <span class="sy0">&amp;&gt;/</span>dev<span class="sy0">/</span>null</pre></div>
</div>

<blockquote cite="http://www.feedburner.com/fb/a/feedcount" title="FeedCount"><h2>FeedCount</h2>
<p>FeedCount is another cool way to promote your feed. It is a dynamic graphic that always displays your feed&#8217;s current circulation, as calculated by FeedBurner. Choose its color scheme and an animated or static appearance; it is yours to customize!</p>
</blockquote>
<p><a href="http://feeds.feedburner.com/apache/htaccess">See how this looks.</a></p>
<p><a href="http://z.askapache.com/uploads/2008/08/feedcount1.png"><img src="http://z.askapache.com/uploads/2008/08/feedcount1-400x310.png" alt="" title="feedcount1" width="400" height="310" class="alignnone size-medium wp-image-1173" /></a></p>
<blockquote cite="http://www.feedburner.com/fb/a/feedimage"><h2>Feed Image Burner</h2>
<p>Add some color to your feed. Place a special image in your feed so that it stands out from the pack when displayed in many popular RSS news readers. This service Adds an image tag block to your feed, which refers to the web location of the image you choose below. Most RSS readers display this image in either individual or grouped views of the news items in a feed. If you provide your own image, it is recommended to be no more than 144 pixels tall or wide.</p>
</blockquote>
<p><a href="http://z.askapache.com/uploads/2008/08/feedimage.png"><img src="http://z.askapache.com/uploads/2008/08/feedimage-400x372.png" alt="" title="Feed Image Burner" width="400" height="372" class="alignnone size-medium wp-image-1174" /></a></p>
<p><img src="http://feeds.askapache.com/~fc/apache/htaccess?bg=336600&amp;anim=0&amp;label=FFFFFF&amp;fg=000000" alt="" /> <img src="http://feeds.askapache.com/~fc/apache/htaccess?bg=ff0000&amp;anim=0&amp;label=FFFFCC&amp;fg=000000" alt="" /> <img src="http://feeds.askapache.com/~fc/apache/htaccess?bg=228800&amp;anim=0&amp;label=FFFF99&amp;fg=000000" alt="" /> <img src="http://feeds.askapache.com/~fc/apache/htaccess?bg=003300&amp;anim=0&amp;label=FFFF66&amp;fg=000000" alt="" /> <img src="http://feeds.askapache.com/~fc/apache/htaccess?bg=333&amp;anim=0&amp;label=FFFF33&amp;fg=000000" alt="" /> <img src="http://feeds.askapache.com/~fc/apache/htaccess?bg=880000&amp;anim=0&amp;label=FFFF00&amp;fg=000000" alt="" /></p>
<h2>Advanced FeedBurner Stats</h2>
<ul>
<li><a href="http://api.feedburner.com/awareness/1.0/GetItemData?uri=http://feeds.feedburner.com/apache/htaccess">GetItemData</a></li>
<li><a href="http://api.feedburner.com/awareness/1.0/GetFeedData?uri=http://feeds.feedburner.com/apache/htaccess">GetFeedData</a></li>
<li><a href="http://api.feedburner.com/awareness/1.0/GetResyndicationData?uri=http://feeds.feedburner.com/apache/htaccess">GetResyndicationData</a></li>
</ul>
<p>Thats it!  Not very impressive technically, but a cool thing to have on your site.. the changing colors and custom labels work great at grabbing peoples attention.</p>
<h3>Random Posts</h3>
<ul class="related_post">
<li><a href="http://www.askapache.com/htaccess/dreamhost-modules-directives.html" title="Apache Directives and Modules on DreamHost">Apache Directives and Modules on DreamHost</a></li>
<li><a href="http://www.askapache.com/htaccess/crazy-advanced-mod_rewrite-tutorial.html" title="Crazy Advanced Mod_Rewrite Tutorial">Crazy Advanced Mod_Rewrite Tutorial</a></li>
<li><a href="http://www.askapache.com/css/pullquotes-using-css-and_or-javascript.html" title="PullQuotes using CSS">PullQuotes using CSS</a></li>
<li><a href="http://www.askapache.com/htaccess/mod_rewrite-tips-and-tricks.html" title="htaccess rewrite, Mod_rewrite tricks">htaccess rewrite, Mod_rewrite tricks</a></li>
<li><a href="http://www.askapache.com/htaccess/mod_rewrite-basic-examples.html" title="Mod_Rewrite Basic Examples">Mod_Rewrite Basic Examples</a></li>
<li><a href="http://www.askapache.com/htaccess/htaccess-plugin-blocks-spam-hackers-and-password-protects-blog.html" title=".htaccess Plugin Blocks Spam, Hackers, and Password Protects Blog">.htaccess Plugin Blocks Spam, Hackers, and Password Protects Blog</a></li>
<li><a href="http://www.askapache.com/security/hacking-vlan-switched-networks.html" title="Hacking VLAN switched networks">Hacking VLAN switched networks</a></li>
<li><a href="http://www.askapache.com/htaccess/apache-speed-expires.html" title="Speed Tips: Add Future Expires Headers">Speed Tips: Add Future Expires Headers</a></li>
<li><a href="http://www.askapache.com/security/php-captcha-anti-spam-example.html" title="Simple PHP Anti-Spam Captcha Script">Simple PHP Anti-Spam Captcha Script</a></li>
<li><a href="http://www.askapache.com/htaccess/setting-charset-in-htaccess.html" title="Setting charset in htaccess">Setting charset in htaccess</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.askapache.com/htaccess/pimp-out-your-feedburner-count.html/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Notes from Apache HTTPD Source Code</title>
		<link>http://www.askapache.com/htaccess/notes-apache-httpd-source.html</link>
		<comments>http://www.askapache.com/htaccess/notes-apache-httpd-source.html#comments</comments>
		<pubDate>Tue, 12 Aug 2008 07:08:35 +0000</pubDate>
		<dc:creator>AskApache</dc:creator>
		
		<category><![CDATA[Apache]]></category>

		<category><![CDATA[htaccess]]></category>

		<guid isPermaLink="false">http://www.askapache.com/?p=1094</guid>
		<description><![CDATA[<p>thought I'd take a break from coding and post about how open-source is such a great tool for finding the best answers to the toughest questions,</p>
<pre style="background-color:#111111;font-size:11px;"><span style="color: rgb(0, 255, 255);">/*</span><span style="color: rgb(0, 255, 255);">* is the status code informational </span><span style="color: rgb(0, 255, 255);">*/</span>
<span style="color: rgb(128, 128, 255);">#define ap_is_HTTP_INFO(x)         (((x) &#62;= </span><span style="color: rgb(255, 64, 255);">100</span><span style="color: rgb(128, 128, 255);">)&#38;&#38;((x) &#60; </span><span style="color: rgb(255, 64, 255);">200</span><span style="color: rgb(128, 128, 255);">))</span>
<span style="color: rgb(0, 255, 255);">/*</span><span style="color: rgb(0, 255, 255);">* is the status code OK ?</span><span style="color: rgb(0, 255, 255);">*/</span>

<span style="color: rgb(128, 128, 255);">#define ap_is_HTTP_SUCCESS(x)      (((x) &#62;= </span><span style="color: rgb(255, 64, 255);">200</span><span style="color: rgb(128, 128, 255);">)&#38;&#38;((x) &#60; </span><span style="color: rgb(255, 64, 255);">300</span><span style="color: rgb(128, 128, 255);">))</span>
<span style="color: rgb(0, 255, 255);">/*</span><span style="color: rgb(0, 255, 255);">* is the status code a redirect </span><span style="color: rgb(0, 255, 255);">*/</span>
<span style="color: rgb(128, 128, 255);">#define ap_is_HTTP_REDIRECT(x)     (((x) &#62;= </span><span style="color: rgb(255, 64, 255);">300</span><span style="color: rgb(128, 128, 255);">)&#38;&#38;((x) &#60; </span><span style="color: rgb(255, 64, 255);">400</span><span style="color: rgb(128, 128, 255);">))</span>

<span style="color: rgb(0, 255, 255);">/*</span><span style="color: rgb(0, 255, 255);">* is the status code a error (client or server) </span><span style="color: rgb(0, 255, 255);">*/</span>
<span style="color: rgb(128, 128, 255);">#define ap_is_HTTP_ERROR(x)        (((x) &#62;= </span><span style="color: rgb(255, 64, 255);">400</span><span style="color: rgb(128, 128, 255);">)&#38;&#38;((x) &#60; </span><span style="color: rgb(255, 64, 255);">600</span><span style="color: rgb(128, 128, 255);">))</span>
<span style="color: rgb(0, 255, 255);">/*</span><span style="color: rgb(0, 255, 255);">* is the status code a client error  </span><span style="color: rgb(0, 255, 255);">*/</span>

<span style="color: rgb(128, 128, 255);">#define ap_is_HTTP_CLIENT_ERROR(x) (((x) &#62;= </span><span style="color: rgb(255, 64, 255);">400</span><span style="color: rgb(128, 128, 255);">)&#38;&#38;((x) &#60; </span><span style="color: rgb(255, 64, 255);">500</span><span style="color: rgb(128, 128, 255);">))</span>
<span style="color: rgb(0, 255, 255);">/*</span><span style="color: rgb(0, 255, 255);">* is the status code a server error  </span><span style="color: rgb(0, 255, 255);">*/</span>
<span style="color: rgb(128, 128, 255);">#define ap_is_HTTP_SERVER_ERROR(x) (((x) &#62;= </span><span style="color: rgb(255, 64, 255);">500</span><span style="color: rgb(128, 128, 255);">)&#38;&#38;((x) &#60; </span><span style="color: rgb(255, 64, 255);">600</span><span style="color: rgb(128, 128, 255);">))</span>

<span style="color: rgb(0, 255, 255);">/*</span><span style="color: rgb(0, 255, 255);">* is the status code a (potentially) valid response code?  </span><span style="color: rgb(0, 255, 255);">*/</span>
<span style="color: rgb(128, 128, 255);">#define ap_is_HTTP_VALID_RESPONSE(x) (((x) &#62;= </span><span style="color: rgb(255, 64, 255);">100</span><span style="color: rgb(128, 128, 255);">)&#38;&#38;((x) &#60; </span><span style="color: rgb(255, 64, 255);">600</span><span style="color: rgb(128, 128, 255);">))</span></pre>]]></description>
			<content:encoded><![CDATA[<p>A nameless tech company leads the world in the anti-piracy / anti-personal-privacy movement while being the 6th most cash rich in the USA. And they&#8217;ve given me.. $499 Upgrades of the same product 15 years in a row?  I bought a laptop yesterday so my brush with piracy is still very fresh.</p>
<p class="cnote">Don&#8217;t let the economic vultures steal your dreams.  <a href="http://www.gnu.org/">Contribute to the open-source software movement.</a></p>
<p>A shortcut past difficult coding questions is by looking for someone else who&#8217;s already done it.  The best.  So when I am dealing with technical questions that just don&#8217;t have published answers.. I want to look at the code and see for myself what is going on.  I almost always have one editor or another running to paste bits of code or comments I find in, to look at in more detail later.  I&#8217;m all about finding solutions as fast as I can, I&#8217;m used to obstacles on the net.</p>
<p>For many years I learned about networking technology from the outside in.  Instead of say learning about Apache by administrating servers like I do today, I learned about them in reverse. I wasn&#8217;t building servers or programming daemons, I was learning about the flaws they had and what made them work.</p>
<p>Open source is the best learning tool on the planet, and some of the best can be found in all the various work done by Apache&#8230; Especially the Server project, which has a lonnnnnnng history of the best programmers and researchers on the planet helping to build a free product that single-handedly sparked a revolution that has powered our world the last 15 years.  <strong>Free.</strong>  <strong>Open Source.</strong> Copied by others.   This organization is responsible in large part for the evolution of the Internet and our interaction with it daily.. Apache servers are exhanging bitts and transmitting bytes at this very second.</p>
<h3>So I found these notes</h3>
<p>15min ago I was asking the Apache source code for some answers for the this password plugin, and thought I&#8217;d take a break from coding and post about how open-source is such a great tool for finding the best answers to the toughest questions, for me and this site only apache can answer many of the questions and answers dealth with here.</p>
<p class="anote">In fact, that&#8217;s exactly the reason I&#8217;m so fond of saying, <strong>Ask</strong> <strong>Apache</strong>.  Just check out these Notes!</p>
<hr class="C" />
<pre style="background-color: #111111; color: #ffffff; font-size: 12px;">
request_rec
    ap_regmatch_t regmatch[AP_MAX_REG_MATCH];
    apr_array_header_t *rewriteconds;
    rewritecond_entry *conds;
    <span style="color: #0f0;">int</span> i, rc;
    <span style="color: #0f0;">char</span> *newuri = <span style="color: #ff40ff;">NULL</span>;
    request_rec *r = ctx-&gt;r;
    <span style="color: #0f0;">int</span> is_proxyreq = <span style="color: #ff40ff;">0</span>;

<span style="color: #0ff;">/*</span><span style="color: #0ff;"> Information to which an extension can be mapped</span>
<span style="color: #0ff;"> </span><span style="color: #0ff;">*/</span>
<span style="color: #0f0;">typedef</span> <span style="color: #0f0;">struct</span> extension_info {
    <span style="color: #0f0;">char</span> *forced_type;                <span style="color: #0ff;">/*</span><span style="color: #0ff;"> Additional AddTyped stuff </span><span style="color: #0ff;">*/</span>
    <span style="color: #0f0;">char</span> *encoding_type;              <span style="color: #0ff;">/*</span><span style="color: #0ff;"> Added with AddEncoding... </span><span style="color: #0ff;">*/</span>
    <span style="color: #0f0;">char</span> *language_type;              <span style="color: #0ff;">/*</span><span style="color: #0ff;"> Added with AddLanguage... </span><span style="color: #0ff;">*/</span>
    <span style="color: #0f0;">char</span> *handler;                    <span style="color: #0ff;">/*</span><span style="color: #0ff;"> Added with AddHandler... </span><span style="color: #0ff;">*/</span>
    <span style="color: #0f0;">char</span> *charset_type;               <span style="color: #0ff;">/*</span><span style="color: #0ff;"> Added with AddCharset... </span><span style="color: #0ff;">*/</span>
    <span style="color: #0f0;">char</span> *input_filters;              <span style="color: #0ff;">/*</span><span style="color: #0ff;"> Added with AddInputFilter... </span><span style="color: #0ff;">*/</span>
    <span style="color: #0f0;">char</span> *output_filters;             <span style="color: #0ff;">/*</span><span style="color: #0ff;"> Added with AddOutputFilter... </span><span style="color: #0ff;">*/</span>

<span style="color: #0f0;">static</span> <span style="color: #0f0;">const</span> command_rec mime_cmds[] =
{
    AP_INIT_ITERATE2(<span style="color: #ff40ff;">"AddCharset"</span>, add_extension_info,
        (<span style="color: #0f0;">void</span> *)APR_OFFSETOF(extension_info, charset_type), OR_FILEINFO,
        <span style="color: #ff40ff;">"a charset (e.g., iso-2022-jp), followed by one or more "</span>
        <span style="color: #ff40ff;">"file extensions"</span>),
    AP_INIT_ITERATE2(<span style="color: #ff40ff;">"AddEncoding"</span>, add_extension_info,
        (<span style="color: #0f0;">void</span> *)APR_OFFSETOF(extension_info, encoding_type), OR_FILEINFO,
        <span style="color: #ff40ff;">"an encoding (e.g., gzip), followed by one or more file extensions"</span>),
    AP_INIT_ITERATE2(<span style="color: #ff40ff;">"AddHandler"</span>, add_extension_info,
        (<span style="color: #0f0;">void</span> *)APR_OFFSETOF(extension_info, handler), OR_FILEINFO,
        <span style="color: #ff40ff;">"a handler name followed by one or more file extensions"</span>),
    AP_INIT_ITERATE2(<span style="color: #ff40ff;">"AddInputFilter"</span>, add_extension_info,
        (<span style="color: #0f0;">void</span> *)APR_OFFSETOF(extension_info, input_filters), OR_FILEINFO,
        <span style="color: #ff40ff;">"input filter name (or ; delimited names) followed by one or "</span>
        <span style="color: #ff40ff;">"more file extensions"</span>),
    AP_INIT_ITERATE2(<span style="color: #ff40ff;">"AddLanguage"</span>, add_extension_info,
        (<span style="color: #0f0;">void</span> *)APR_OFFSETOF(extension_info, language_type), OR_FILEINFO,
        <span style="color: #ff40ff;">"a language (e.g., fr), followed by one or more file extensions"</span>),
    AP_INIT_ITERATE2(<span style="color: #ff40ff;">"AddOutputFilter"</span>, add_extension_info,
        (<span style="color: #0f0;">void</span> *)APR_OFFSETOF(extension_info, output_filters), OR_FILEINFO,
        <span style="color: #ff40ff;">"output filter name (or ; delimited names) followed by one or "</span>
        <span style="color: #ff40ff;">"more file extensions"</span>),
    AP_INIT_ITERATE2(<span style="color: #ff40ff;">"AddType"</span>, add_extension_info,
        (<span style="color: #0f0;">void</span> *)APR_OFFSETOF(extension_info, forced_type), OR_FILEINFO,
        <span style="color: #ff40ff;">"a mime type followed by one or more file extensions"</span>),
    AP_INIT_TAKE1(<span style="color: #ff40ff;">"DefaultLanguage"</span>, ap_set_string_slot,
        (<span style="color: #0f0;">void</span>*)APR_OFFSETOF(mime_dir_config, default_language), OR_FILEINFO,
        <span style="color: #ff40ff;">"language to use for documents with no other language file extension"</span>),
    AP_INIT_ITERATE(<span style="color: #ff40ff;">"MultiviewsMatch"</span>, multiviews_match, <span style="color: #ff40ff;">NULL</span>, OR_FILEINFO,
        <span style="color: #ff40ff;">"NegotiatedOnly (default), Handlers and/or Filters, or Any"</span>),
    AP_INIT_ITERATE(<span style="color: #ff40ff;">"RemoveCharset"</span>, remove_extension_info,
        (<span style="color: #0f0;">void</span> *)APR_OFFSETOF(extension_info, charset_type), OR_FILEINFO,
        <span style="color: #ff40ff;">"one or more file extensions"</span>),
    AP_INIT_ITERATE(<span style="color: #ff40ff;">"RemoveEncoding"</span>, remove_extension_info,
        (<span style="color: #0f0;">void</span> *)APR_OFFSETOF(extension_info, encoding_type), OR_FILEINFO,
        <span style="color: #ff40ff;">"one or more file extensions"</span>),
    AP_INIT_ITERATE(<span style="color: #ff40ff;">"RemoveHandler"</span>, remove_extension_info,
        (<span style="color: #0f0;">void</span> *)APR_OFFSETOF(extension_info, handler), OR_FILEINFO,
        <span style="color: #ff40ff;">"one or more file extensions"</span>),
    AP_INIT_ITERATE(<span style="color: #ff40ff;">"RemoveInputFilter"</span>, remove_extension_info,
        (<span style="color: #0f0;">void</span> *)APR_OFFSETOF(extension_info, input_filters), OR_FILEINFO,
        <span style="color: #ff40ff;">"one or more file extensions"</span>),
    AP_INIT_ITERATE(<span style="color: #ff40ff;">"RemoveLanguage"</span>, remove_extension_info,
        (<span style="color: #0f0;">void</span> *)APR_OFFSETOF(extension_info, language_type), OR_FILEINFO,
        <span style="color: #ff40ff;">"one or more file extensions"</span>),
    AP_INIT_ITERATE(<span style="color: #ff40ff;">"RemoveOutputFilter"</span>, remove_extension_info,
        (<span style="color: #0f0;">void</span> *)APR_OFFSETOF(extension_info, output_filters), OR_FILEINFO,
        <span style="color: #ff40ff;">"one or more file extensions"</span>),
    AP_INIT_ITERATE(<span style="color: #ff40ff;">"RemoveType"</span>, remove_extension_info,
        (<span style="color: #0f0;">void</span> *)APR_OFFSETOF(extension_info, forced_type), OR_FILEINFO,
        <span style="color: #ff40ff;">"one or more file extensions"</span>),
    AP_INIT_TAKE1(<span style="color: #ff40ff;">"TypesConfig"</span>, set_types_config, <span style="color: #ff40ff;">NULL</span>, RSRC_CONF,
        <span style="color: #ff40ff;">"the MIME types config file"</span>),
    AP_INIT_FLAG(<span style="color: #ff40ff;">"ModMimeUsePathInfo"</span>, ap_set_flag_slot,
        (<span style="color: #0f0;">void</span> *)APR_OFFSETOF(mime_dir_config, use_path_info), ACCESS_CONF,
        <span style="color: #ff40ff;">"Set to 'yes' to allow mod_mime to use path info for type checking"</span>),
    {<span style="color: #ff40ff;">NULL</span>}
};

   <span style="color: #0ff;">/*</span><span style="color: #0ff;">*</span>
<span style="color: #0ff;">     *  'allowed' is a bitvector of the allowed methods.</span>
<span style="color: #0ff;">     *</span>
<span style="color: #0ff;">     *  A handler must ensure that the request method is one that</span>
<span style="color: #0ff;">     *  it is capable of handling.  Generally modules should DECLINE</span>
<span style="color: #0ff;">     *  any request methods they do not handle.  Prior to aborting the</span>
<span style="color: #0ff;">     *  handler like this the handler should set r-&gt;allowed to the list</span>
<span style="color: #0ff;">     *  of methods that it is willing to handle.  This bitvector is used</span>
<span style="color: #0ff;">     *  to construct the "Allow:" header required for OPTIONS requests,</span>
<span style="color: #0ff;">     *  and HTTP_METHOD_NOT_ALLOWED and HTTP_NOT_IMPLEMENTED status codes.</span>
<span style="color: #0ff;">     *</span>
<span style="color: #0ff;">     *  Since the default_handler deals with OPTIONS, all modules can</span>
<span style="color: #0ff;">     *  usually decline to deal with OPTIONS.  TRACE is always allowed,</span>
<span style="color: #0ff;">     *  modules don't need to set it explicitly.</span>
<span style="color: #0ff;">     *</span>
<span style="color: #0ff;">     *  Since the default_handler will always handle a GET, a</span>
<span style="color: #0ff;">     *  module which does *not* implement GET should probably return</span>
<span style="color: #0ff;">     *  HTTP_METHOD_NOT_ALLOWED.  Unfortunately this means that a Script GET</span>
<span style="color: #0ff;">     *  handler can't be installed by mod_actions.</span>
<span style="color: #0ff;">     </span><span style="color: #0ff;">*/</span>

<span style="color: #0ff;">/*</span><span style="color: #0ff;">*</span>
<span style="color: #0ff;"> * @defgroup Methods List of Methods recognized by the server</span>
<span style="color: #0ff;"> * @ingroup APACHE_CORE_DAEMON</span>
<span style="color: #0ff;"> * @{</span>
<span style="color: #0ff;"> *</span>
<span style="color: #0ff;"> * @brief Methods recognized (but not necessarily handled) by the server.</span>
<span style="color: #0ff;"> *</span>
<span style="color: #0ff;"> * These constants are used in bit shifting masks of size int, so it is</span>
<span style="color: #0ff;"> * unsafe to have more methods than bits in an int.  HEAD == M_GET.</span>
<span style="color: #0ff;"> * This list must be tracked by the list in http_protocol.c in routine</span>
<span style="color: #0ff;"> * ap_method_name_of().</span>
<span style="color: #0ff;"> *</span>
<span style="color: #0ff;"> </span><span style="color: #0ff;">*/</span>

<span style="color: #8080ff;">#define M_GET                   </span><span style="color: #ff40ff;">0</span><span style="color: #8080ff;">       </span><span style="color: #0ff;">/*</span><span style="color: #0ff;">* RFC 2616: HTTP </span><span style="color: #0ff;">*/</span>
<span style="color: #8080ff;">#define M_PUT                   </span><span style="color: #ff40ff;">1</span><span style="color: #8080ff;">       </span><span style="color: #0ff;">/*</span><span style="color: #0ff;">  :             </span><span style="color: #0ff;">*/</span>
<span style="color: #8080ff;">#define M_POST                  </span><span style="color: #ff40ff;">2</span>
<span style="color: #8080ff;">#define M_DELETE                </span><span style="color: #ff40ff;">3</span>
<span style="color: #8080ff;">#define M_CONNECT               </span><span style="color: #ff40ff;">4</span>
<span style="color: #8080ff;">#define M_OPTIONS               </span><span style="color: #ff40ff;">5</span>
<span style="color: #8080ff;">#define M_TRACE                 </span><span style="color: #ff40ff;">6</span><span style="color: #8080ff;">       </span><span style="color: #0ff;">/*</span><span style="color: #0ff;">* RFC 2616: HTTP </span><span style="color: #0ff;">*/</span>
<span style="color: #8080ff;">#define M_PATCH                 </span><span style="color: #ff40ff;">7</span><span style="color: #8080ff;">       </span><span style="color: #0ff;">/*</span><span style="color: #0ff;">* no rfc(!)  ### remove this one? </span><span style="color: #0ff;">*/</span>
<span style="color: #8080ff;">#define M_PROPFIND              </span><span style="color: #ff40ff;">8</span><span style="color: #8080ff;">       </span><span style="color: #0ff;">/*</span><span style="color: #0ff;">* RFC 2518: WebDAV </span><span style="color: #0ff;">*/</span>
<span style="color: #8080ff;">#define M_PROPPATCH             </span><span style="color: #ff40ff;">9</span><span style="color: #8080ff;">       </span><span style="color: #0ff;">/*</span><span style="color: #0ff;">  :               </span><span style="color: #0ff;">*/</span>
<span style="color: #8080ff;">#define M_MKCOL                 </span><span style="color: #ff40ff;">10</span>
<span style="color: #8080ff;">#define M_COPY                  </span><span style="color: #ff40ff;">11</span>
<span style="color: #8080ff;">#define M_MOVE                  </span><span style="color: #ff40ff;">12</span>
<span style="color: #8080ff;">#define M_LOCK                  </span><span style="color: #ff40ff;">13</span>
<span style="color: #8080ff;">#define M_UNLOCK                </span><span style="color: #ff40ff;">14</span><span style="color: #8080ff;">      </span><span style="color: #0ff;">/*</span><span style="color: #0ff;">* RFC 2518: WebDAV </span><span style="color: #0ff;">*/</span>
<span style="color: #8080ff;">#define M_VERSION_CONTROL       </span><span style="color: #ff40ff;">15</span><span style="color: #8080ff;">      </span><span style="color: #0ff;">/*</span><span style="color: #0ff;">* RFC 3253: WebDAV Versioning </span><span style="color: #0ff;">*/</span>
<span style="color: #8080ff;">#define M_CHECKOUT              </span><span style="color: #ff40ff;">16</span><span style="color: #8080ff;">      </span><span style="color: #0ff;">/*</span><span style="color: #0ff;">  :                          </span><span style="color: #0ff;">*/</span>
<span style="color: #8080ff;">#define M_UNCHECKOUT            </span><span style="color: #ff40ff;">17</span>
<span style="color: #8080ff;">#define M_CHECKIN               </span><span style="color: #ff40ff;">18</span>
<span style="color: #8080ff;">#define M_UPDATE                </span><span style="color: #ff40ff;">19</span>
<span style="color: #8080ff;">#define M_LABEL                 </span><span style="color: #ff40ff;">20</span>
<span style="color: #8080ff;">#define M_REPORT                </span><span style="color: #ff40ff;">21</span>
<span style="color: #8080ff;">#define M_MKWORKSPACE           </span><span style="color: #ff40ff;">22</span>
<span style="color: #8080ff;">#define M_MKACTIVITY            </span><span style="color: #ff40ff;">23</span>
<span style="color: #8080ff;">#define M_BASELINE_CONTROL      </span><span style="color: #ff40ff;">24</span>
<span style="color: #8080ff;">#define M_MERGE                 </span><span style="color: #ff40ff;">25</span>
<span style="color: #8080ff;">#define M_INVALID               </span><span style="color: #ff40ff;">26</span><span style="color: #8080ff;">      </span><span style="color: #0ff;">/*</span><span style="color: #0ff;">* RFC 3253: WebDAV Versioning </span><span style="color: #0ff;">*/</span>

{
    methods_registry = apr_hash_make(p);
    apr_pool_cleanup_register(p, <span style="color: #ff40ff;">NULL</span>,
                              ap_method_registry_destroy,
                              apr_pool_cleanup_null);

    <span style="color: #0ff;">/*</span><span style="color: #0ff;"> put all the standard methods into the registry hash to ease the</span>
<span style="color: #0ff;">       mapping operations between name and number </span><span style="color: #0ff;">*/</span>
    register_one_method(p, <span style="color: #ff40ff;">"GET"</span>, M_GET);
    register_one_method(p, <span style="color: #ff40ff;">"PUT"</span>, M_PUT);
    register_one_method(p, <span style="color: #ff40ff;">"POST"</span>, M_POST);
    register_one_method(p, <span style="color: #ff40ff;">"DELETE"</span>, M_DELETE);
    register_one_method(p, <span style="color: #ff40ff;">"CONNECT"</span>, M_CONNECT);
    register_one_method(p, <span style="color: #ff40ff;">"OPTIONS"</span>, M_OPTIONS);
    register_one_method(p, <span style="color: #ff40ff;">"TRACE"</span>, M_TRACE);
    register_one_method(p, <span style="color: #ff40ff;">"PATCH"</span>, M_PATCH);
    register_one_method(p, <span style="color: #ff40ff;">"PROPFIND"</span>, M_PROPFIND);
    register_one_method(p, <span style="color: #ff40ff;">"PROPPATCH"</span>, M_PROPPATCH);
    register_one_method(p, <span style="color: #ff40ff;">"MKCOL"</span>, M_MKCOL);
    register_one_method(p, <span style="color: #ff40ff;">"COPY"</span>, M_COPY);
    register_one_method(p, <span style="color: #ff40ff;">"MOVE"</span>, M_MOVE);
    register_one_method(p, <span style="color: #ff40ff;">"LOCK"</span>, M_LOCK);
    register_one_method(p, <span style="color: #ff40ff;">"UNLOCK"</span>, M_UNLOCK);
    register_one_method(p, <span style="color: #ff40ff;">"VERSION-CONTROL"</span>, M_VERSION_CONTROL);
    register_one_method(p, <span style="color: #ff40ff;">"CHECKOUT"</span>, M_CHECKOUT);
    register_one_method(p, <span style="color: #ff40ff;">"UNCHECKOUT"</span>, M_UNCHECKOUT);
    register_one_method(p, <span style="color: #ff40ff;">"CHECKIN"</span>, M_CHECKIN);
    register_one_method(p, <span style="color: #ff40ff;">"UPDATE"</span>, M_UPDATE);
    register_one_method(p, <span style="color: #ff40ff;">"LABEL"</span>, M_LABEL);
    register_one_method(p, <span style="color: #ff40ff;">"REPORT"</span>, M_REPORT);
    register_one_method(p, <span style="color: #ff40ff;">"MKWORKSPACE"</span>, M_MKWORKSPACE);
    register_one_method(p, <span style="color: #ff40ff;">"MKACTIVITY"</span>, M_MKACTIVITY);
    register_one_method(p, <span style="color: #ff40ff;">"BASELINE-CONTROL"</span>, M_BASELINE_CONTROL);
    register_one_method(p, <span style="color: #ff40ff;">"MERGE"</span>, M_MERGE);

<span style="color: #0ff;">/*</span><span style="color: #0ff;">*</span>
<span style="color: #0ff;"> * @defgroup HTTP_Status HTTP Status Codes</span>
<span style="color: #0ff;"> * @{</span>
<span style="color: #0ff;"> </span><span style="color: #0ff;">*/</span>
<span style="color: #0ff;">/*</span><span style="color: #0ff;">*</span>
<span style="color: #0ff;"> * The size of the static array in http_protocol.c for storing</span>
<span style="color: #0ff;"> * all of the potential response status-lines (a sparse table).</span>
<span style="color: #0ff;"> * A future version should dynamically generate the apr_table_t at startup.</span>
<span style="color: #0ff;"> </span><span style="color: #0ff;">*/</span>
<span style="color: #8080ff;">#define RESPONSE_CODES </span><span style="color: #ff40ff;">57</span>

<span style="color: #8080ff;">#define HTTP_CONTINUE                      </span><span style="color: #ff40ff;">100</span>
<span style="color: #8080ff;">#define HTTP_SWITCHING_PROTOCOLS           </span><span style="color: #ff40ff;">101</span>
<span style="color: #8080ff;">#define HTTP_PROCESSING                    </span><span style="color: #ff40ff;">102</span>
<span style="color: #8080ff;">#define HTTP_OK                            </span><span style="color: #ff40ff;">200</span>
<span style="color: #8080ff;">#define HTTP_CREATED                       </span><span style="color: #ff40ff;">201</span>
<span style="color: #8080ff;">#define HTTP_ACCEPTED                      </span><span style="color: #ff40ff;">202</span>
<span style="color: #8080ff;">#define HTTP_NON_AUTHORITATIVE             </span><span style="color: #ff40ff;">203</span>
<span style="color: #8080ff;">#define HTTP_NO_CONTENT                    </span><span style="color: #ff40ff;">204</span>
<span style="color: #8080ff;">#define HTTP_RESET_CONTENT                 </span><span style="color: #ff40ff;">205</span>
<span style="color: #8080ff;">#define HTTP_PARTIAL_CONTENT               </span><span style="color: #ff40ff;">206</span>
<span style="color: #8080ff;">#define HTTP_MULTI_STATUS                  </span><span style="color: #ff40ff;">207</span>
<span style="color: #8080ff;">#define HTTP_MULTIPLE_CHOICES              </span><span style="color: #ff40ff;">300</span>
<span style="color: #8080ff;">#define HTTP_MOVED_PERMANENTLY             </span><span style="color: #ff40ff;">301</span>
<span style="color: #8080ff;">#define HTTP_MOVED_TEMPORARILY             </span><span style="color: #ff40ff;">302</span>
<span style="color: #8080ff;">#define HTTP_SEE_OTHER                     </span><span style="color: #ff40ff;">303</span>
<span style="color: #8080ff;">#define HTTP_NOT_MODIFIED                  </span><span style="color: #ff40ff;">304</span>
<span style="color: #8080ff;">#define HTTP_USE_PROXY                     </span><span style="color: #ff40ff;">305</span>
<span style="color: #8080ff;">#define HTTP_TEMPORARY_REDIRECT            </span><span style="color: #ff40ff;">307</span>
<span style="color: #8080ff;">#define HTTP_BAD_REQUEST                   </span><span style="color: #ff40ff;">400</span>
<span style="color: #8080ff;">#define HTTP_UNAUTHORIZED                  </span><span style="color: #ff40ff;">401</span>
<span style="color: #8080ff;">#define HTTP_PAYMENT_REQUIRED              </span><span style="color: #ff40ff;">402</span>
<span style="color: #8080ff;">#define HTTP_FORBIDDEN                     </span><span style="color: #ff40ff;">403</span>
<span style="color: #8080ff;">#define HTTP_NOT_FOUND                     </span><span style="color: #ff40ff;">404</span>
<span style="color: #8080ff;">#define HTTP_METHOD_NOT_ALLOWED            </span><span style="color: #ff40ff;">405</span>
<span style="color: #8080ff;">#define HTTP_NOT_ACCEPTABLE                </span><span style="color: #ff40ff;">406</span>
<span style="color: #8080ff;">#define HTTP_PROXY_AUTHENTICATION_REQUIRED </span><span style="color: #ff40ff;">407</span>
<span style="color: #8080ff;">#define HTTP_REQUEST_TIME_OUT              </span><span style="color: #ff40ff;">408</span>
<span style="color: #8080ff;">#define HTTP_CONFLICT                      </span><span style="color: #ff40ff;">409</span>
<span style="color: #8080ff;">#define HTTP_GONE                          </span><span style="color: #ff40ff;">410</span>
<span style="color: #8080ff;">#define HTTP_LENGTH_REQUIRED               </span><span style="color: #ff40ff;">411</span>
<span style="color: #8080ff;">#define HTTP_PRECONDITION_FAILED           </span><span style="color: #ff40ff;">412</span>
<span style="color: #8080ff;">#define HTTP_REQUEST_ENTITY_TOO_LARGE      </span><span style="color: #ff40ff;">413</span>
<span style="color: #8080ff;">#define HTTP_REQUEST_URI_TOO_LARGE         </span><span style="color: #ff40ff;">414</span>
<span style="color: #8080ff;">#define HTTP_UNSUPPORTED_MEDIA_TYPE        </span><span style="color: #ff40ff;">415</span>
<span style="color: #8080ff;">#define HTTP_RANGE_NOT_SATISFIABLE         </span><span style="color: #ff40ff;">416</span>
<span style="color: #8080ff;">#define HTTP_EXPECTATION_FAILED            </span><span style="color: #ff40ff;">417</span>
<span style="color: #8080ff;">#define HTTP_UNPROCESSABLE_ENTITY          </span><span style="color: #ff40ff;">422</span>
<span style="color: #8080ff;">#define HTTP_LOCKED                        </span><span style="color: #ff40ff;">423</span>
<span style="color: #8080ff;">#define HTTP_FAILED_DEPENDENCY             </span><span style="color: #ff40ff;">424</span>
<span style="color: #8080ff;">#define HTTP_UPGRADE_REQUIRED              </span><span style="color: #ff40ff;">426</span>
<span style="color: #8080ff;">#define HTTP_INTERNAL_SERVER_ERROR         </span><span style="color: #ff40ff;">500</span>
<span style="color: #8080ff;">#define HTTP_NOT_IMPLEMENTED               </span><span style="color: #ff40ff;">501</span>
<span style="color: #8080ff;">#define HTTP_BAD_GATEWAY                   </span><span style="color: #ff40ff;">502</span>
<span style="color: #8080ff;">#define HTTP_SERVICE_UNAVAILABLE           </span><span style="color: #ff40ff;">503</span>
<span style="color: #8080ff;">#define HTTP_GATEWAY_TIME_OUT              </span><span style="color: #ff40ff;">504</span>
<span style="color: #8080ff;">#define HTTP_VERSION_NOT_SUPPORTED         </span><span style="color: #ff40ff;">505</span>
<span style="color: #8080ff;">#define HTTP_VARIANT_ALSO_VARIES           </span><span style="color: #ff40ff;">506</span>
<span style="color: #8080ff;">#define HTTP_INSUFFICIENT_STORAGE          </span><span style="color: #ff40ff;">507</span>
<span style="color: #8080ff;">#define HTTP_NOT_EXTENDED                  </span><span style="color: #ff40ff;">510</span>

<span style="color: #0ff;">/*</span><span style="color: #0ff;"> The max method number. Method numbers are used to shift bitmasks,</span>
<span style="color: #0ff;"> * so this cannot exceed 63, and all bits high is equal to -1, which is a</span>
<span style="color: #0ff;"> * special flag, so the last bit used has index 62.</span>
<span style="color: #0ff;"> </span><span style="color: #0ff;">*/</span>
<span style="color: #8080ff;">#define METHOD_NUMBER_LAST  </span><span style="color: #ff40ff;">62</span>

<span style="color: #0f0;">static</span> <span style="color: #0f0;">const</span> <span style="color: #0f0;">char</span> * status_lines[RESPONSE_CODES] =
<span style="color: #8080ff;">#else</span>
<span style="color: #0f0;">static</span> <span style="color: #0f0;">const</span> <span style="color: #0f0;">char</span> * <span style="color: #0f0;">const</span> status_lines[RESPONSE_CODES] =
<span style="color: #8080ff;">#endif</span>
{
    <span style="color: #ff40ff;">"100 Continue"</span>,
    <span style="color: #ff40ff;">"101 Switching Protocols"</span>,
    <span style="color: #ff40ff;">"102 Processing"</span>,
<span style="color: #8080ff;">#define LEVEL_200  </span><span style="color: #ff40ff;">3</span>
    <span style="color: #ff40ff;">"200 OK"</span>,
    <span style="color: #ff40ff;">"201 Created"</span>,
    <span style="color: #ff40ff;">"202 Accepted"</span>,
    <span style="color: #ff40ff;">"203 Non-Authoritative Information"</span>,
    <span style="color: #ff40ff;">"204 No Content"</span>,
    <span style="color: #ff40ff;">"205 Reset Content"</span>,
    <span style="color: #ff40ff;">"206 Partial Content"</span>,
    <span style="color: #ff40ff;">"207 Multi-Status"</span>,
<span style="color: #8080ff;">#define LEVEL_300 </span><span style="color: #ff40ff;">11</span>
    <span style="color: #ff40ff;">"300 Multiple Choices"</span>,
    <span style="color: #ff40ff;">"301 Moved Permanently"</span>,
    <span style="color: #ff40ff;">"302 Found"</span>,
    <span style="color: #ff40ff;">"303 See Other"</span>,
    <span style="color: #ff40ff;">"304 Not Modified"</span>,
    <span style="color: #ff40ff;">"305 Use Proxy"</span>,
    <span style="color: #ff40ff;">"306 unused"</span>,
    <span style="color: #ff40ff;">"307 Temporary Redirect"</span>,
<span style="color: #8080ff;">#define LEVEL_400 </span><span style="color: #ff40ff;">19</span>
    <span style="color: #ff40ff;">"400 Bad Request"</span>,
    <span style="color: #ff40ff;">"401 Authorization Required"</span>,
    <span style="color: #ff40ff;">"402 Payment Required"</span>,
    <span style="color: #ff40ff;">"403 Forbidden"</span>,
    <span style="color: #ff40ff;">"404 Not Found"</span>,
    <span style="color: #ff40ff;">"405 Method Not Allowed"</span>,
    <span style="color: #ff40ff;">"406 Not Acceptable"</span>,
    <span style="color: #ff40ff;">"407 Proxy Authentication Required"</span>,
    <span style="color: #ff40ff;">"408 Request Time-out"</span>,
    <span style="color: #ff40ff;">"409 Conflict"</span>,
    <span style="color: #ff40ff;">"410 Gone"</span>,
    <span style="color: #ff40ff;">"411 Length Required"</span>,
    <span style="color: #ff40ff;">"412 Precondition Failed"</span>,
    <span style="color: #ff40ff;">"413 Request Entity Too Large"</span>,
    <span style="color: #ff40ff;">"414 Request-URI Too Large"</span>,
    <span style="color: #ff40ff;">"415 Unsupported Media Type"</span>,
    <span style="color: #ff40ff;">"416 Requested Range Not Satisfiable"</span>,
    <span style="color: #ff40ff;">"417 Expectation Failed"</span>,
    <span style="color: #ff40ff;">"418 unused"</span>,
    <span style="color: #ff40ff;">"419 unused"</span>,
    <span style="color: #ff40ff;">"420 unused"</span>,
    <span style="color: #ff40ff;">"421 unused"</span>,
    <span style="color: #ff40ff;">"422 Unprocessable Entity"</span>,
    <span style="color: #ff40ff;">"423 Locked"</span>,
    <span style="color: #ff40ff;">"424 Failed Dependency"</span>,
    <span style="color: #0ff;">/*</span><span style="color: #0ff;"> This is a hack, but it is required for ap_index_of_response</span>
<span style="color: #0ff;">     * to work with 426.</span>
<span style="color: #0ff;">     </span><span style="color: #0ff;">*/</span>
    <span style="color: #ff40ff;">"425 No code"</span>,
    <span style="color: #ff40ff;">"426 Upgrade Required"</span>,
<span style="color: #8080ff;">#define LEVEL_500 </span><span style="color: #ff40ff;">46</span>
    <span style="color: #ff40ff;">"500 Internal Server Error"</span>,
    <span style="color: #ff40ff;">"501 Method Not Implemented"</span>,
    <span style="color: #ff40ff;">"502 Bad Gateway"</span>,
    <span style="color: #ff40ff;">"503 Service Temporarily Unavailable"</span>,
    <span style="color: #ff40ff;">"504 Gateway Time-out"</span>,
    <span style="color: #ff40ff;">"505 HTTP Version Not Supported"</span>,
    <span style="color: #ff40ff;">"506 Variant Also Negotiates"</span>,
    <span style="color: #ff40ff;">"507 Insufficient Storage"</span>,
    <span style="color: #ff40ff;">"508 unused"</span>,
    <span style="color: #ff40ff;">"509 unused"</span>,
    <span style="color: #ff40ff;">"510 Not Extended"</span>
};
</pre>
<pre style="background-color: #111111; color: #ffffff; font-size: 12px;">
<span style="color: #0ff;">/*</span><span style="color: #0ff;">* is the status code informational </span><span style="color: #0ff;">*/</span>
<span style="color: #8080ff;">#define ap_is_HTTP_INFO(x)         (((x) &gt;= </span><span style="color: #ff40ff;">100</span><span style="color: #8080ff;">)&amp;&amp;((x) &lt; </span><span style="color: #ff40ff;">200</span><span style="color: #8080ff;">))</span>
<span style="color: #0ff;">/*</span><span style="color: #0ff;">* is the status code OK ?</span><span style="color: #0ff;">*/</span>
<span style="color: #8080ff;">#define ap_is_HTTP_SUCCESS(x)      (((x) &gt;= </span><span style="color: #f