<?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"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>AskApache &#187; Search Results  &#187;  admin</title>
	<atom:link href="http://www.askapache.com/search/admin/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.askapache.com</link>
	<description>Advanced Web Development</description>
	<lastBuildDate>Thu, 26 Apr 2012 11:29:28 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Show or Hide WordPress Admin Bar Plugin</title>
		<link>http://www.askapache.com/wordpress/hide-admin-bar.html</link>
		<comments>http://www.askapache.com/wordpress/hide-admin-bar.html#comments</comments>
		<pubDate>Thu, 19 Apr 2012 06:15:14 +0000</pubDate>
		<dc:creator>AskApache</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[WordPress Plugin]]></category>

		<guid isPermaLink="false">http://www.askapache.com/?p=7121</guid>
		<description><![CDATA[<p><a class="IFL" href="http://www.askapache.com/wordpress/hide-admin-bar.html"><img src="http://uploads.askapache.com/2012/04/profile-no-admin-bar-300x258.png" alt="WordPress No Admin Bar" title="WordPress No Admin Bar" width="300" height="258" /></a>The Admin Bar in WordPress is always shown when in the backend administration area no matter what.<br /><br />You are given the option to show/hide the admin bar when <em>viewing the site</em>, but there is no option to show/hide the admin bar when <em>using the backend</em>... So I created a plugin to provide that option on profile pages.<br /><br /><em>Why hide the admin bar in backend?</em><br />Normally I like the admin-bar and usually have it enabled, but it's nice to be able to switch it on/off from the "Edit Profile" page.  The biggest reason for not loading/showing the admin_bar in the backend is <strong>SPEED</strong>.  Here are 2 instances where I hide it-<br /><br /> &#160;&#160;&#160;&#160;&#183; <strong>Sites with many authors/admins</strong><br /> &#160;&#160;&#160;&#160;&#183; <strong>Moderating Comments on a Mobile Phone</strong><br /><br />]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.askapache.com/wordpress/hide-admin-bar.html"></a><a href="http://www.askapache.com/wordpress/hide-admin-bar.html"><cite>AskApache.com</cite></a></p><p><a class="IFL" href="http://uploads.askapache.com/2012/04/profile-no-admin-bar.png"><img src="http://uploads.askapache.com/2012/04/profile-no-admin-bar.png" alt="WordPress No Admin Bar" title="WordPress No Admin Bar" width="537" height="462" /></a>The Admin Bar in WordPress is always shown when in the backend administration area no matter what.<br /><br />You are given the option to show/hide the admin bar when <em>viewing the site</em>, but there is no option to show/hide the admin bar when <em>using the backend</em>... So I created a plugin to provide that option on profile pages.<br /><br /><em>Why hide the admin bar in backend?</em><br />Normally I like the admin-bar and usually have it enabled, but it's nice to be able to switch it on/off from the "Edit Profile" page.  The biggest reason for not loading/showing the admin_bar in the backend is <strong>SPEED</strong>.  Here are 2 instances where I hide it-<br /><br /> &nbsp;&nbsp;&nbsp;&nbsp;&middot; <strong>Sites with many authors/admins</strong><br /> &nbsp;&nbsp;&nbsp;&nbsp;&middot; <strong>Moderating Comments on a Mobile Phone</strong><br /><br />
I occasionally enjoy moderating blog comments using my Android mobile phone and a browser like Opera or Dolphin.... hiding the admin_bar improves Load Speed, Page Rendering Speed, and Scroll Speed. Basically everything.<br /><br />The wp-admin-bar causes additional CSS, JavaScript, and HTML to be added to every page, increasing request size and time of every request!  The jQuery used for the admin_bar keeps it floating at the top using javascript, meaning it gets executed on resize/scroll/load - MAJOR PAIN!<br class="C" /></p>


<h2>Plugin for Hiding/Showing the WP AdminBar</h2>
<p><img class="IFL" src="http://uploads.askapache.com/2012/04/profile-with-adminbar.png" alt="WordPress with Admin Bar" title="WordPress with Admin Bar" width="537" height="462" /><br /><br /><br /><br /><br /><br />This plugin provides the option of hiding the admin bar when in_admin.  It not only hides the admin_bar, it actually prevents the admin_bar class from even loading, at least in WP version 3.4-beta2-20509 thanks to the <code>wp_admin_bar_class</code> filter.<br /><br />Follow the Installation steps below and/or read on to see how it works.. it's an incredibly simple plugin and easy to extend for other purposes.<br class="C" /></p>


<h3>Installation Steps</h3>
<ol>
<li>Download the plugin file: <a href='http://uploads.askapache.com/2012/04/askapache-adminbar-prefs.txt'>askapache-adminbar-prefs.txt</a></li>
<li>Save to <code>/wp-content/plugins/askapache-adminbar-prefs/askapache-adminbar-prefs.php</code></li>
<li>Enable/Disable the plugin from the Plugins Page</li>
<li>Show/Hide admin_bar from the 'Edit Profile' Page</li>
</ol>

<h3>Add Checkbox Option to Profile Page</h3>
<pre>
function askapache_adminbar_personal_options( $profileuser )
{
 global $wpdb, $wp_query;
 $show_admin_bar_backend=_get_admin_bar_pref( &#039;backend&#039;, $profileuser-&gt;ID );
?&gt;
&lt;tr class="show-admin-bar-backend"&gt;
&lt;th scope="row"&gt;Toolbar2&lt;/th&gt;
&lt;td&gt;&lt;fieldset&gt;&lt;legend class="screen-reader-text"&gt;&lt;span&gt;Toolbar2&lt;/span&gt;&lt;/legend&gt;
&lt;label for="admin_bar_backend"&gt;
&lt;input name="admin_bar_backend" type="checkbox" id="admin_bar_backend" value="1"&lt;?php checked( _get_admin_bar_pref( &#039;backend&#039;, $profileuser-&gt;ID ) ); ?&gt; /&gt;
Show Toolbar when in backend&lt;/label&gt;&lt;br /&gt;
&lt;/fieldset&gt;
&lt;/td&gt;
&lt;/tr&gt;&lt;?php
}
add_action( &#039;personal_options&#039;, &#039;askapache_adminbar_personal_options&#039;, 10, 1 );
</pre>



<h3>Save preference when a profile updated</h3>
<pre>
function askapache_adminbar_handle_post($useridtoedit)
{
 global $wpdb, $wp_query, $current_user;
 $show_admin_bar_backend=_get_admin_bar_pref( &#039;backend&#039;, $useridtoedit );
 
 $userID=(int)$useridtoedit;
 if ( !current_user_can(&#039;edit_user&#039;, $userID) ) wp_die(__(&#039;You do not have permission to edit this user.&#039;));
 
 $show_admin_bar_backend=(isset( $_POST[&#039;admin_bar_backend&#039;] ) ? &#039;true&#039; : &#039;false&#039;);
 update_user_option($userID, "show_admin_bar_backend", $show_admin_bar_backend);
}
add_action( &#039;personal_options_update&#039;, &#039;askapache_adminbar_handle_post&#039;, 10, 1);
add_action( &#039;edit_user_profile_update&#039;, &#039;askapache_adminbar_handle_post&#039;, 10, 1);
</pre>




<h3>Remove admin_bar from backend</h3>
<p>Now we need to hook into <code>init</code> to either show/hide the admin_bar while in the backend (<code>in_admin()</code>) based on the users preference.</p>
<ol>
<li>Fetches the users preference for showing the admin_bar in the backend</li>
<li>Removes the wp_admin_bar class from even loading (<code>wp_admin_bar_class</code> filter)</li>
<li>Returns false to the <code>show_admin_bar</code> filter</li>
<li>Overrules the <code>admin-bar</code> css applied to the body</li>
</ol>
<pre>
function askapache_adminbar_personal_options_init()
{
 global $wpdb, $wp_query, $current_user;
 $show_admin_bar_backend=_get_admin_bar_pref( &#039;backend&#039;, $current_user-&gt;ID );
 if(!$show_admin_bar_backend &amp;&amp; is_admin())
 {
  add_filter(&#039;wp_admin_bar_class&#039;, create_function(&#039;&#039;, &#039;return "none".rand(1000,666666);&#039;), 9999999);
  add_filter(&#039;show_admin_bar&#039;, create_function(&#039;&#039;, &#039;return false;&#039;), 999999);
  add_action(&#039;admin_head&#039;, create_function(&#039;&#039;, &#039;echo \&#039;&lt;style type="text/css"&gt;body.admin-bar {padding-top:0 !important;}&lt;/style&gt;\&#039;;&#039;));
 }
}
add_action( &#039;init&#039;, &#039;askapache_adminbar_personal_options_init&#039;,0); 
</pre>

<h2>Add to Core WordPress</h2>
<p>I'm sure this will be added to the dev version of WordPress by someone (volunteers?) and eventually integrated into stable.  Note this was built and used on WordPress 3.4-beta2-20509.</p><p><a href="http://www.askapache.com/wordpress/hide-admin-bar.html"></a><a href="http://www.askapache.com/wordpress/hide-admin-bar.html">Show or Hide WordPress Admin Bar Plugin</a> originally appeared on <cite>AskApache.com</cite> </p>]]></content:encoded>
			<wfw:commentRss>http://www.askapache.com/wordpress/hide-admin-bar.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mod_Rewrite Security</title>
		<link>http://www.askapache.com/security/mod_rewrite.html</link>
		<comments>http://www.askapache.com/security/mod_rewrite.html#comments</comments>
		<pubDate>Sat, 18 Feb 2012 06:54:18 +0000</pubDate>
		<dc:creator>AskApache</dc:creator>
				<category><![CDATA[Security]]></category>
		<category><![CDATA[Htaccess]]></category>
		<category><![CDATA[mod_rewrite]]></category>
		<category><![CDATA[RewriteCond]]></category>
		<category><![CDATA[RewriteRule]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://www.askapache.com/?p=7045</guid>
		<description><![CDATA[<p><a class="hs hs13" href="http://www.askapache.com/security/mod_rewrite.html" title="Mod_Rewrite Artwork"></a>These are a few of the mod_rewrite uses that <a href="http://blogsecurity.net/">BlogSecurity</a> declared <strong>pushed the boundaries of Mod_Rewrite!</strong>  Some of these snippets are quite exotic and unlike anything you may have seen before, also only for those who understand them as they can kill a website pretty quick.<br class="C" /></p>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.askapache.com/security/mod_rewrite.html"></a><a href="http://www.askapache.com/security/mod_rewrite.html"><cite>AskApache.com</cite></a></p><p>Here are some <a href="http://www.askapache.com/htaccess/htaccess.html" title="Htaccess Tutorial">specific htaccess</a> examples taken mostly from my WordPress Password Protection plugin, which does alot more than password protection as you will see from the following mod_rewrite examples. These are a few of the mod_rewrite uses that <a href="http://blogsecurity.net/">BlogSecurity</a> declared <strong>pushed the boundaries of Mod_Rewrite!</strong>  Some of these snippets are quite exotic and unlike anything you may have seen before, also only for those who understand them as they can kill a website pretty quick.</p>

<h4>Directory Protection</h4>
<p>Enable the DirectoryIndex Protection, preventing directory index listings and defaulting. [<a href="/htaccess/htaccess.html">Disable</a>]</p>
<pre>
Options -Indexes
DirectoryIndex index.html index.php /index.php
</pre>

<h4>Password Protect wp-login.php</h4>
<p>Requires a valid user/pass to access the login page[<a href="/htaccess/apache-status-code-headers-errordocument.html#status-401">401</a>]</p>
<pre>
&lt;Files wp-login.php&gt;
Order Deny,Allow
Deny from All
Satisfy Any
AuthName "Protected By AskApache"
AuthUserFile /home/askapache.com/.htpasswda1
AuthType Basic
Require valid-user
&lt;/Files&gt;
</pre>


<h4>Password Protect wp-admin</h4>
<p>Requires a valid user/pass to access any non-static (css, js, images) file in this directory.[<a href="/htaccess/apache-status-code-headers-errordocument.html#status-401">401</a>]</p>
<pre>
Options -ExecCGI -Indexes +FollowSymLinks -Includes
DirectoryIndex index.php /index.php
Order Deny,Allow
Deny from All
Satisfy Any
AuthName "Protected By AskApache"
AuthUserFile /home/askapache.com/.htpasswda1
AuthType Basic
Require valid-user
&lt;FilesMatch "\.(ico|pdf|flv|jpg|jpeg|mp3|mpg|mp4|mov|wav|wmv|png|gif|swf|css|js)$"&gt;
Allow from All
&lt;/FilesMatch&gt;
&lt;FilesMatch "(async-upload)\.php$"&gt;
&lt;IfModule mod_security.c&gt;
SecFilterEngine Off
&lt;/IfModule&gt;
Allow from All
&lt;/FilesMatch&gt;
</pre>

<h4>Protect wp-content</h4>
<p>Denies any Direct request for files ending in .php with a 403 Forbidden.. May break plugins/themes [<a href="/htaccess/apache-status-code-headers-errordocument.html#status-401">401</a>]</p>
<pre>
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /wp-content/.*$ [NC]
RewriteCond %{REQUEST_FILENAME} !^.+flexible-upload-wp25js.php$
RewriteCond %{REQUEST_FILENAME} ^.+\.(php|html|htm|txt)$
RewriteRule .* - [F,NS,L]
</pre>

<h4>Protect wp-includes</h4>
<p>Denies any Direct request for files ending in .php with a 403 Forbidden.. May break plugins/themes [<a href="/htaccess/apache-status-code-headers-errordocument.html#status-403">403</a>]</p>
<pre>
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /wp-includes/.*$ [NC]
RewriteCond %{THE_REQUEST} !^[A-Z]{3,9}\ /wp-includes/js/.+/.+\ HTTP/ [NC]
RewriteCond %{REQUEST_FILENAME} ^.+\.php$
RewriteRule .* - [F,NS,L]
</pre>

<h4>Common Exploits</h4>
<p>Block common exploit requests with 403 Forbidden. These can help alot, may break some plugins. [<a href="/htaccess/apache-status-code-headers-errordocument.html#status-403">403</a>]</p>
<pre>
RewriteCond %{REQUEST_URI} !^/(wp-login.php|wp-admin/|wp-content/plugins/|wp-includes/).* [NC]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ ///.*\ HTTP/ [NC,OR]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /.*\?\=?(http|ftp|ssl|https):/.*\ HTTP/ [NC,OR]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /.*\?\?.*\ HTTP/ [NC,OR]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /.*\.(asp|ini|dll).*\ HTTP/ [NC,OR]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /.*\.(htpasswd|htaccess|aahtpasswd).*\ HTTP/ [NC]
RewriteRule .* - [F,NS,L]
</pre>

<h4>Stop Hotlinking</h4>
<p>Denies any request for static files (images, css, etc) if referrer is not local site or empty. [<a href="/htaccess/apache-status-code-headers-errordocument.html#status-403">403</a>]</p>
<pre>
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{REQUEST_URI} !^/(wp-login.php|wp-admin/|wp-content/plugins/|wp-includes/).* [NC]
RewriteCond %{HTTP_REFERER} !^http://www.askapache.com.*$ [NC]
RewriteRule \.(ico|pdf|flv|jpg|jpeg|mp3|mpg|mp4|mov|wav|wmv|png|gif|swf|css|js)$ - [F,NS,L]
</pre>

<h4>Safe Request Methods</h4>
<p>Denies any request not using <a href="http://www.askapache.com/online-tools/request-method-scanner/">GET,PROPFIND,POST,OPTIONS,PUT,HEAD</a>[<a href="/htaccess/apache-status-code-headers-errordocument.html#status-403">403</a>]</p>
<pre>
RewriteCond %{REQUEST_METHOD} !^(GET|HEAD|POST|PROPFIND|OPTIONS|PUT)$ [NC]
RewriteRule .* - [F,NS,L]
</pre>

<h4>Forbid Proxies</h4>
<p>Denies any POST Request using a Proxy Server. Can still access site, but not comment.  See <a href="http://perishablepress.com/press/2008/04/20/how-to-block-proxy-servers-via-htaccess/">Perishable Press</a> [<a href="/htaccess/apache-status-code-headers-errordocument.html#status-403">403</a>]</p>
<pre>
RewriteCond %{REQUEST_METHOD} =POST
RewriteCond %{HTTP:VIA}%{HTTP:FORWARDED}%{HTTP:USERAGENT_VIA}%{HTTP:X_FORWARDED_FOR}%{HTTP:PROXY_CONNECTION} !^$ [OR]
RewriteCond %{HTTP:XPROXY_CONNECTION}%{HTTP:HTTP_PC_REMOTE_ADDR}%{HTTP:HTTP_CLIENT_IP} !^$
RewriteCond %{REQUEST_URI} !^/(wp-login.php|wp-admin/|wp-content/plugins/|wp-includes/).* [NC]
RewriteRule .* - [F,NS,L]
</pre>

<h4>Real wp-comments-post.php</h4>
<p>Denies any POST attempt made to a non-existing wp-comments-post.php[<a href="/htaccess/apache-status-code-headers-errordocument.html#status-403">403</a>]</p>
<pre>
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /.*/wp-comments-post\.php.*\ HTTP/ [NC]
RewriteRule .* - [F,NS,L]
</pre>

<h4>HTTP PROTOCOL</h4>
<p>Denies any badly formed HTTP PROTOCOL in the request, 0.9, 1.0, and 1.1 only[<a href="/htaccess/apache-status-code-headers-errordocument.html#status-403">403</a>]</p>
<pre>
RewriteCond %{THE_REQUEST} !^[A-Z]{3,9}\ .+\ HTTP/(0\.9|1\.0|1\.1) [NC]
RewriteRule .* - [F,NS,L]
</pre>

<h4>SPECIFY CHARACTERS</h4>
<p>Denies any request for a url containing characters other than "a-zA-Z0-9.+/-?=&amp;"  - REALLY helps but may break your site depending on your links. [<a href="/htaccess/apache-status-code-headers-errordocument.html#status-403">403</a>]</p>
<pre>
RewriteCond %{REQUEST_URI} !^/(wp-login.php|wp-admin/|wp-content/plugins/|wp-includes/).* [NC]
RewriteCond %{THE_REQUEST} !^[A-Z]{3,9}\ [a-zA-Z0-9\.\+_/\-\?\=\&amp;amp;]+\ HTTP/ [NC]
RewriteRule .* - [F,NS,L]
</pre>

<h4>BAD Content Length</h4>
<p>Denies any POST request that doesnt have a Content-Length Header[<a href="/htaccess/apache-status-code-headers-errordocument.html#status-403">403</a>]</p>
<pre>
RewriteCond %{REQUEST_METHOD} =POST
RewriteCond %{HTTP:Content-Length} ^$
RewriteCond %{REQUEST_URI} !^/(wp-admin/|wp-content/plugins/|wp-includes/).* [NC]
RewriteRule .* - [F,NS,L]
</pre>

<h4>BAD Content Type</h4>
<p>Denies any POST request with a content type other than application/x-www-form-urlencoded|multipart/form-data[<a href="/htaccess/apache-status-code-headers-errordocument.html#status-403">403</a>]</p>
<pre>
RewriteCond %{REQUEST_METHOD} =POST
RewriteCond %{HTTP:Content-Type} !^(application/x-www-form-urlencoded|multipart/form-data.*(boundary.*)?)$ [NC]
RewriteCond %{REQUEST_URI} !^/(wp-login.php|wp-admin/|wp-content/plugins/|wp-includes/).* [NC]
RewriteRule .* - [F,NS,L]
</pre>

<h4>Missing HTTP_HOST</h4>
<p>Denies requests that dont contain a HTTP HOST Header.[<a href="/htaccess/apache-status-code-headers-errordocument.html#status-403">403</a>]</p>
<pre>
RewriteCond %{REQUEST_URI} !^/(wp-login.php|wp-admin/|wp-content/plugins/|wp-includes/).* [NC]
RewriteCond %{HTTP_HOST} ^$
RewriteRule .* - [F,NS,L]
</pre>

<h4>Bogus Graphics Exploit</h4>
<p>Denies obvious exploit using bogus graphics[<a href="/htaccess/apache-status-code-headers-errordocument.html#status-403">403</a>]</p>
<pre>
RewriteCond %{HTTP:Content-Disposition} \.php [NC]
RewriteCond %{HTTP:Content-Type} image/.+ [NC]
RewriteRule .* - [F,NS,L]
</pre>

<h4>No UserAgent, Not POST</h4>
<p>Denies POST requests by blank user-agents.  May prevent a small number of visitors from POSTING. [<a href="/htaccess/apache-status-code-headers-errordocument.html#status-403">403</a>]</p>
<pre>
RewriteCond %{REQUEST_METHOD} =POST
RewriteCond %{HTTP_USER_AGENT} ^-?$
RewriteCond %{REQUEST_URI} !^/(wp-login.php|wp-admin/|wp-content/plugins/|wp-includes/).* [NC]
RewriteRule .* - [F,NS,L]
</pre>

<h4>No Referer, No Comment</h4>
<p>Denies any comment attempt with a blank HTTP_REFERER field, highly indicative of spam.  May prevent some visitors from POSTING. [<a href="/htaccess/apache-status-code-headers-errordocument.html#status-403">403</a>]</p>
<pre>
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /.*/wp-comments-post\.php.*\ HTTP/ [NC]
RewriteCond %{HTTP_REFERER} ^-?$
RewriteRule .* - [F,NS,L]
</pre>

<h4>Trackback Spam</h4>
<p>Denies obvious trackback spam.  See Holy Shmoly! [<a href="/htaccess/apache-status-code-headers-errordocument.html#status-403">403</a>]</p>
<pre>
RewriteCond %{REQUEST_METHOD} =POST
RewriteCond %{HTTP_USER_AGENT} ^.*(opera|mozilla|firefox|msie|safari).*$ [NC]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /.+/trackback/?\ HTTP/ [NC]
RewriteRule .* - [F,NS,L]
</pre>

<h4>Map all URIs except those corresponding to existing files to a handler</h4>
<pre>
RewriteEngine On
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteRule . /script.php
</pre>

<h4>Map any request to a handler</h4>
<p>In the case where all URIs should be sent to the same place (including potentially requests for static content) the method to use depends on the type of the handler. For php scripts, use:
For other handlers such as php scripts, use:</p>
<pre>
RewriteEngine On
RewriteCond %{REQUEST_URI} !=/script.php
RewriteRule .* /script.php
</pre>

<h4>And for CGI scripts:</h4>
<pre>
ScriptAliasMatch .* /var/www/script.cgi
</pre>

<h4>Map URIs corresponding to existing files to a handler instead</h4>
<pre>
RewriteEngine On
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f
RewriteCond %{REQUEST_URI} !=/script.php
RewriteRule .* /script.php
</pre>
<p>If the existing files you wish to have handled by your script have a common set of file extensions distinct from that of the hander, you can bypass mod_rewrite and use instead mod_actions. Let's say you want all .html and .tpl files to be dealt with by your script:</p>
<pre>
Action foo-action /script.php
AddHandler foo-action html tpl
</pre>

<h4>Deny access if var=val contains the string foo.</h4>
<pre>
RewriteCond %{QUERY_STRING} foo
RewriteRule ^/url - [F]
</pre>

<h4>Removing the Query String</h4>
<pre>
RewriteRule ^/url /url?
</pre>

<h4>Adding to the Query String</h4>
<p>Keep the existing query string using the Query String Append flag, but add var=val to the end.</p>
<pre>
RewriteRule ^/url /url?var=val [QSA]
</pre>

<h4>Rewriting For Certain Query Strings</h4>
<p>Rewrite URLs like http://askapache.com/url1?var=val to http://askapache.com/url2?var=val but don't rewrite if val isn't present.</p>
<pre>
RewriteCond %{QUERY_STRING} val
RewriteRule ^/url1 /url2
</pre>

<h4>Modifying the Query String</h4>
<p>Change any single instance of val in the query string to other_val when accessing /path. Note that %1 and %2 are back-references to the matched part of the regular expression in the previous RewriteCond.</p>
<pre>
RewriteCond %{QUERY_STRING} ^(.*)val(.*)$
RewriteRule /path /path?%1other_val%2
</pre>
<hr class="C" />
<p><a href="http://www.askapache.com/security/mod_rewrite.html"></a><a href="http://www.askapache.com/security/mod_rewrite.html">Mod_Rewrite Security</a> originally appeared on <cite>AskApache.com</cite> </p>]]></content:encoded>
			<wfw:commentRss>http://www.askapache.com/security/mod_rewrite.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Sample Page</title>
		<link>http://www.askapache.com/sample-page</link>
		<comments>http://www.askapache.com/sample-page#comments</comments>
		<pubDate>Fri, 13 Jan 2012 23:17:45 +0000</pubDate>
		<dc:creator>admin-</dc:creator>
		
		<guid isPermaLink="false">http://www.askapache.com/?page_id=2</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.askapache.com/sample-page"></a><a href="http://www.askapache.com/sample-page"><cite>AskApache.com</cite></a></p>This is an example page. It's different from a blog post because it will stay in one place and will show up in your site navigation (in most themes). Most people start with an About page that introduces them to potential site visitors. It might say something like this:

<blockquote>Hi there! I'm a bike messenger by day, aspiring actor by night, and this is my blog. I live in Los Angeles, have a great dog named Jack, and I like pi&#241;a coladas. (And gettin' caught in the rain.)</blockquote>

...or something like this:

<blockquote>The XYZ Doohickey Company was founded in 1971, and has been providing quality doohickies to the public ever since. Located in Gotham City, XYZ employs over 2,000 people and does all kinds of awesome things for the Gotham community.</blockquote>

As a new WordPress user, you should go to <a href="https://www.askapache.com/wp-admin/">your dashboard</a> to delete this page and create new pages for your content. Have fun!<p><a href="http://www.askapache.com/sample-page"></a><a href="http://www.askapache.com/sample-page">Sample Page</a> originally appeared on <cite>AskApache.com</cite> </p>]]></content:encoded>
			<wfw:commentRss>http://www.askapache.com/sample-page/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HOWTO: Uninstall CPANEL over SSH</title>
		<link>http://www.askapache.com/hacking/uninstall-cpanel.html</link>
		<comments>http://www.askapache.com/hacking/uninstall-cpanel.html#comments</comments>
		<pubDate>Mon, 04 Jul 2011 18:55:40 +0000</pubDate>
		<dc:creator>AskApache</dc:creator>
				<category><![CDATA[Hacking]]></category>

		<guid isPermaLink="false">http://www.askapache.com/?p=4404</guid>
		<description><![CDATA[<p>The following is just a quick reference of some of the commands I used to successfully uninstall cpanel.  This is for advanced users of the shell.  If you aren't that advanced and you run a single one of these commands without fully understanding it, you will probably kill your server, probably lose everything on it permanently, probably not have a website or email for weeks..  So backup all your data FIRST.  Also, if you aren't 100% sure you won't run into problems, you should contact your hosts technical support - but be prepared for some MAJOR negativity..  cpanel makes things very easy for hosts, you are just a drop in their bucket.</p>

<blockquote cite="http://www.askapache.com/server-administration/uninstall-cpanel.html#comment-168222">
<p><strong>Wow!</strong></p>
<p>You sure gotta bigger set that *I* do. . . . - for real! I've been known to do some abysmally stupid things in my day - and actually had them work the way I wanted them to! - but this takes the <strong>titanium, gadolinium, rhodium alloy cake</strong>!</p>
<p>Me, I'd try something like that and find out later that the fire-trucks showed up right after I hit the "Enter" key. It's a REALLY interesting post, and a real eye-opener - especially for someone who is relatively new to the whole web-hosting-service paradigm.  I know, no guts, no glory - but THIS is WAY over the top!  I'm reading this and thinking <em>"Why not just put a couple of sticks of dynamite under the thing?"</em></p>
<p>Seriously now, this was an excellent read - and for someone who is just now looking into the whole web-hosting paradigm, it's a real eye-opener.  Though I think I'll just tiptoe past this <strong>REAL QUIETLY</strong> for now. . . .  (laughing!)</p>
<p><a href="http://www.qatechtips.com/">Jim</a></p>
</blockquote>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.askapache.com/hacking/uninstall-cpanel.html"></a><a href="http://www.askapache.com/hacking/uninstall-cpanel.html"><cite>AskApache.com</cite></a></p><p><strong>WARNING!</strong> This is for advanced users of the shell, this is NOT a howto or tutorial.  The thing is, I googled <strong>how to uninstall cpanel</strong> and for once in my life I came up empty.. And certainly the cpanel official sites themselves don't provide any instructions other than to say "Dont uninstall it, reinstall your entire operating system without it."..   they sure don't seem confident that they know exactly what their code is doing.  Cpanel is great for most people, perfect for many situations, so don't get me wrong.. this is just for fun.</p>

<h2>Why Uninstall?</h2>
<p>Why?  Because I have always built my servers, php installations, perl installs, ruby, iptables, everything from source.  I read the INSTALL/README docs, I read the man pages, and I read the info pages as well.  I google for configuration advice, I google for tips, and I don't need a web-based perl script messing my stuff up!</p>
<p>The main problems I had with cpanel, which really is a great bit of software for millions of website developers, is that it was incredibly sneaky!  I used it for about 6 months and spent that entire time trying to figure out what the heck it was doing.  A couple issues that I really disliked, it takes over your bind install, it takes over your apache install, it takes over your php install.  And although it does let you configure some things (very few) for custom configurations and the like, I just don't need any of that.  By removing the darn thing I am saving GIGS of space on my server, tons of bandwidth, and most importantly to me I am saving CPU and processing time along with RAM and IO speed.</p>
<h3>Anything Else</h3>
<p>Please.. I could go on for DAYS!  Another reason I have wanted to be rid of cpanel is that I like my servers to be as lean and mean as possible.  This means I like as few files and processes as possible.  There are many benefits to this, like it's much easier for my integrity checking software and rootkit/antivirus software to run and drastically reduces the false positives.  And there is that glaring security issue of constantly having cpanel run it's own software to create the WHM/Cpanel web interface, which is accessible online.  I haven't researched cpanel security at all, it's possible that it never has security problems that are published, but for me, why take the chance?</p>


<h2>Warning - Caution!</h2>
<p>The following is just a quick reference of some of the commands I used to uninstall cpanel.  This is for advanced users of the shell.  If you aren't that advanced and you run a single one of these commands without fully understanding it, you will probably kill your server, probably lose everything on it permanently, probably not have a website or email for weeks..  So backup all your data FIRST.  Also, if you aren't 100% sure you won't run into problems, you should contact your hosts technical support - but be prepared for some MAJOR negativity..  cpanel makes things very easy for hosts, and the last thing tech support wants is to fix a server broken by someone who doesn't know what they are doing.</p>

<h2>Last Warning!</h2>
<p>Unless you understand what theses commands do and the purpose they serve, do not try any of this.  These are not the exact commands I used verbatim, they are also not in order.  I only put them up here because I was so amazed that google didn't have any uninstall cpanel intructions.  Hopefully it's not a conspiracy that will get my site taken down.. ;)</p>
<p>That said and out of the way, it really only took me about 10 minutes to uninstall cpanel completely.  But keep in mind I have been closely monitoring and debugging cpanel for 6 months, so I knew what I was doing.  And finally, I do apologize for not having better instructions.. but hey, if you don't get this then you have no business trying to figure out how to uninstall cpanel!  It's great software and shouldn't be removed unless you are fully capable of managing email/dns/www/ftp and any/all other servers and services on your machine by hand.</p>

<h2>Do This First</h2>
<p>I have a few drafts I'm working on at the moment with specifics, but for now you will have to figure it out with google.  Basically you want to make sure you don't totally knock your machine offline without being able to reconnect.  What I do is compile a static version of openssh and a few other security-type shell tools, and configure this binary sshd to run by using inittab, which is the file run by init (pid 1) and makes sure if it dies it is restarted.  Here is my /etc/inittab to run the static sshd binary:</p>
<pre>hh:12345:respawn:/failover/os/sbin/aassh -D -q -u0 -f /failover/os/etc/aassh</pre>

<p>Another trick is to keep a detached screen logged in to root.  That way if you mess up your sudoers or securetty or pam or whatever, you can just reattach and fix it.</p>
<p>Finally, you may want to setup your syslog to start earlier than usual, and set up more than normal verbosity.  ( I take it to the max ).  Then you should setup a 2nd server or machine somewhere to act as a syslog server.  Lastly, configure your web server syslog to copy all messages to the remote syslog you set up.  I use a reverse ssh tunnel to encrypt the syslog packets, but when I do something serious like reboot after uninstalling cpanel, I prepare for it by adding additional networking routes on my machine to make sure I will get some logs even if sshd cant start or even if my network addresses aren't brought up correctly.</p>
<p>If that sounds easy to you, please continue.   If you are saying: Wha??? Continue in read-only mode.</p>

<p class="cnote">Also, you can't just uninstall cpanel, I have replaced a lot of cpanel already, like building my own bind, apache, php, syslog and making sure they work and aren't being tampered with by cpanel.  Basically cpanel runs everything on your server in most cases, so you should prepare by creating your own static software to replace cpanel, and make sure it works.</p>


<h2>Find files Accessing /var/cpanel</h2>
<p>More than likely these will need to be killed.</p>
<pre>lsof +w -Rg -nP +c15 -x f +D /var/cpanel
lsof +w -Rg -nP +c15 -x f +D /usr/local/cpanel</pre>

<h2>Killing cpanel</h2>
<p>Just an example, your machine may have a lot more than these, I have been slowly taking control of my machine back from cpanel for 6 months, so it was easier for me.</p>
<pre>for P in tailwatchd queueprocd cpanellogd exim; do pkill -9 $P; done</pre>

<h2>Commands and Shortcuts</h2>
<pre>alias NF=&#039;nice find $PWD -mount -depth ! -type d&#039;
alias NFF=&#039;nice find $PWD -mount -depth ! -type d | xargs -IF87 file F87&#039;
alias NA=&#039;nice find $PWD -mount -depth&#039;
alias NAF=&#039;nice find $PWD -mount -depth | xargs -IF87 file F87&#039;</pre>


<h2>Watch out for crontab</h2>
<p>An example of the sneakiness (from my POV, from most it's called builtin robustness) that cpanel does is automagically adding crontab entries that make it behave similarly to a self-propagating virus.  If you don't disable the cronjobs and kill the right processes within a short period of time, be prepared for a magic resurrection.</p>

<p>Here's my awesome crontab information function, you will need to check every file, it lists the default crons on my box, and every users crontab, but it can't account for other cron software like at and other crons.</p>
<pre>function askapache_crontab()
{
  local GG i;
  for i in `getent passwd|cut -d ":" -f1`;
  do
    GG=$(sudo crontab -u $i -l 2&gt;$N6 | tr -s &#039;\n\000&#039; | sed &#039;/^#/d&#039;);
    [[ ${#GG} -gt 3 ]] &amp;&amp; sleep 1 &amp;&amp; echo -e "$i \n\n${GG}"
  done;
   sleep 4;
   ls -aLls1ch --color=always /etc/cron.{hourly,daily,weekly,monthly,d} | sed &#039;/^total/d; /\ drwxr-xr-x/d&#039;;
}</pre>



<pre>grep -ir /var/spool cpan</pre>
<pre>#6 3 * * * /scripts/upcp
#0 1 * * * /scripts/cpbackup
#0 2 * * * /scripts/mailman_chown_archives
#35 * * * * /usr/bin/test -x /usr/local/cpanel/bin/tail-check &amp;&amp; /usr/local/cpanel/bin/tail-check
#11,26,41,56 * * * * /usr/local/cpanel/whostmgr/bin/dnsqueue &gt; /dev/null 2&gt;&amp;1
#30 */4 * * * /usr/bin/test -x /scripts/update_db_cache &amp;&amp; /scripts/update_db_cache
#45 */8 * * * /usr/bin/test -x /usr/local/cpanel/bin/optimizefs &amp;&amp; /usr/local/cpanel/bin/optimizefs
#*/5 * * * * /usr/local/cpanel/bin/dcpumon &gt;/dev/null 2&gt;&amp;1
#25 1 * * * /usr/local/cpanel/whostmgr/docroot/cgi/cpaddons_report.pl --notify</pre>



<h2>Delete Crontabs</h2>
<pre>sudo crontab -u mailman -r</pre>


<h2>Find INIT scripts with cpanel</h2>
<p>This is the main startup script: <code>/usr/local/cpanel/etc/init/startup</code></p>
<p>I had no idea ruby-on-rails was being controlled by cpanel.. sneaky bugger.  You can tell by all of these advanced unix commands just how difficult it would be to uninstall cpanel, its totally like the Alien!</p>
<pre>(1:3744)# find . ! -type d -print0|xargs -0 -I&#039;F87&#039; grep -Hi "cpan\|tailwat\|chkser" F87
./fastmail:# Author:       cPanel, Inc. &lt;nick@cpanel.net&gt;
./httpd:        HTTPD=/usr/local/cpanel/bin/chroothttpd
./cpanel:# cpanel8       Start Cpanel Services
./cpanel:# Author:       cPanel, Inc. &lt;nick@cpanel.net&gt;
./cpanel:# description: This is the cpanel webserver and chat.
./cpanel:# processname: cpaneld
./cpanel:# pidfile: /var/run/cpanel.pid
./cpanel:[ -f /usr/local/cpanel/etc/init/startup ] || exit 0
./cpanel:       if [ -f "/var/cpanel/smtpgidonlytweak" ]; then
./cpanel:       echo -n "Starting cPanel services: "
./cpanel:       daemon /usr/local/cpanel/etc/init/startcpsrvd
./cpanel:       echo -n "Starting cPanel brute force detector services: "
./cpanel:       daemon /usr/local/cpanel/etc/init/startcphulkd
./cpanel:    echo -n "Starting cPanel dav services: "
./cpanel:       daemon /usr/local/cpanel/etc/init/startcpdavd
./cpanel:               daemon /usr/local/cpanel/etc/init/startcppop
./cpanel:       echo -n "Starting cPanel Chat services: "
./cpanel:               daemon /usr/local/cpanel/entropychat/entropychat
./cpanel:               daemon /usr/local/cpanel/bin/startmelange
./cpanel:                       /usr/local/cpanel/bin/startinterchange
./cpanel:       echo -n "Starting cPanel ssl services: "
./cpanel:       daemon /usr/local/cpanel/startstunnel
./cpanel:    echo -n "Starting cPanel Queue services: "
./cpanel:       daemon /usr/local/cpanel/etc/init/startqueueprocd
./cpanel:    echo -n "Starting tailwatchd: "
./cpanel:    daemon /usr/local/cpanel/libexec/tailwatchd --start
./cpanel:       echo -n "Starting cPanel Log services: "
./cpanel:       daemon /usr/local/cpanel/cpanellogd
./cpanel:    action "Starting mailman services: " /usr/local/cpanel/etc/init/startmailman
./cpanel:    action "Stopping tailwatchd: " /usr/local/cpanel/libexec/tailwatchd --stop
./cpanel:    action "Stopping cPanel services: " /usr/local/cpanel/etc/init/stopcpsrvd
./cpanel:       action "Stopping cPanel dav services: " /usr/local/cpanel/etc/init/stopcpdavd
./cpanel:       action "Stopping cPanel queue services: " /usr/local/cpanel/etc/init/stopqueueprocd
./cpanel:       action "Stopping cPanel brute force detector services: " /usr/local/cpanel/etc/init/stopcphulkd
./cpanel:               action "Stopping pop3 services: " /usr/local/cpanel/etc/init/stopcppop
./cpanel:       echo -n "Stopping cPanel log services: "
./cpanel:       killproc cpanellogd
./cpanel:       echo -n "Stopping cPanel Chat services: "
./cpanel:       action "Stopping cPanel ssl services: " /usr/local/cpanel/etc/init/stopstunnel
./cpanel:       action "Stopping mailman services: " /usr/local/cpanel/etc/init/stopmailman
./cpanel:       if [ -e "/usr/local/cpanel/3rdparty/mailman/bin/mailmanctl" ]; then
./exim:if [ -e "/etc/chkserv.d" ]; then
./exim:        for file in `ls /etc/chkserv.d`
./exim:            if [ ! -e "/usr/local/cpanel/libexec/tailwatchd" ]; then
./exim:    if [ -x "/usr/local/cpanel/etc/init/startspamd" ]; then
./exim:        /usr/local/cpanel/etc/init/startspamd
./exim:        if [ ! -e "/usr/local/cpanel/libexec/tailwatchd" ]; then
./ror:  /usr/local/cpanel/bin/rormgr --startboot
./ror:  /usr/local/cpanel/bin/rormgr --stopall
./ror:  /usr/local/cpanel/bin/rormgr --stopall
./ror:  /usr/local/cpanel/bin/rormgr --startboot
./ror:  /usr/local/cpanel/bin/rormgr --statusall
./securetmp:# Author:       cPanel, Inc. &lt;copyright@cpanel.net&gt;</pre>

<h3>Turn off cpanel services</h3>
<p>You should remove the below delete command and start by just disabling the inits by turning them off.  Then reboot. Then delete.  If your machine won't reboot, I told you so, Cpanel told you so, and likely your host told you so.</p>
<pre>for S in cpanel ror securetmp fastmail exim; do R=$(command chkconfig --level 123456 $S off ||echo); R=$(command chkconfig --del $S ||echo); done</pre>


<h4>HTTPD</h4>
<p>If you are running chrooted httpd then you'll need to make sure you don't delete your entire webserver on accident.  Here's a relevant part from the /etc/init.d/httpd script.</p>
<pre># the path to your httpd binary, including options if necessary
if [ -e "/etc/chroothttpd" ]; then
        HTTPD=/usr/local/cpanel/bin/chroothttpd
else
        HTTPD=/usr/local/apache/bin/httpd
fi</pre>




<h2>Finding files owned by cpanel</h2>
<p>Some super cool bash commands in this post.. let's start with one to find all the files and folders on your machine owned by cpanel.  Check your /etc/passwd file for your machines specific usernames and groups.  This command saves all the filenames to ~/cpanel-files-backup.txt, which is used by tar next to create a backup of all of them.</p>
<pre>{ find / -mount -depth -maxdepth 150 \( -group cpanel -o   -group cpanel-phpmyadmin -o -group cpanel-phppgadmin   -o -group cpanelphpmyadmin   -o -group cpanelphppgadmin   -o -group cpanelhorde   -o -group cpanelroundcube \) -print; find / -mount -depth -maxdepth 150 \( -user cpanel -o   -user cpanel-phpmyadmin -o -user cpanel-phppgadmin   -o -user cpanelphpmyadmin   -o -user cpanelphppgadmin   -o -user cpanelhorde   -o -user cpanelroundcube \) -print; } &gt; ~/cpanel-files-backup.txt</pre>

<p>Here's another way to search directories.</p>
<pre> grep --color=always -Hir cpanel /var</pre>

<h2>Create the Backup</h2>
<p>Note that you must have the latest version of tar for this exact command, also you should backup /var/cpanel and /usr/local/cpanel and /etc and heck the whole machine why dontcha!</p>
<pre>tar -T ~/cpanel-files-backup.txt -cvz --checkpoint=1000 --checkpoint-action="ttyout=\rHit %s checkpoint #%u" -f /cpanel-files-backup.tgz --totals</pre>


<h2>Remove Files</h2>
<p>Once you do this your upstream without a paddle, you better make sure you know what you're doing with this.  This removes all those files.</p>
<pre>cat ~/cpanel-files-backup.txt | xargs -I&#039;F87&#039; rm -vfr F87</pre>

<p>Additionally you will want to remove /usr/local/cpanel and /var/cpanel - What I always do when running as root is alias my rm command to instead simply move the files to a .trash folder.  That way if something goes bork you have a better chance at fixing it.</p>


<h2>Find Group-Owned Files</h2>
<pre>find / -mount -depth -maxdepth 150 \
\(  -group cpanel -o \
  -group cpanel-phpmyadmin \
  -o -group cpanel-phppgadmin \
  -o -group cpanelphpmyadmin \
  -o -group cpanelphppgadmin \
  -o -group mailman \
  -o -group cpanelhorde \
  -o -group cpanelroundcube \
\) -fprintf /root/cpanel-group-files.log &#039;%#8k %#5m %11M %#10u:%-10g %-5U:%-5G %p %f %Y %F\n&#039;</pre>

<h2>Find User-Owned Files</h2>
<pre>find / -mount -depth -maxdepth 150 \(
  -user cpanel \
  -o -user cpanel-phpmyadmin \
  -o -user cpanel-phppgadmin \
  -o -user cpanelphpmyadmin \
  -o -user cpanelphppgadmin \
  -o -user mailman \
  -o -user cpanelhorde \
  -o -user cpanelroundcube
\) -fprintf /root/cpanel-users-files.log &#039;%#8k %#5m %11M %#10u:%-10g %-5U:%-5G %p %f %Y %F\n&#039;</pre>



<pre>       4  0755  drwxr-xr-x     cpanel:cpanel     32002:32004 /var/cpanel/userhomes/cpanel cpanel d reiserfs
       4  0700  drwx------ cpanel-phpmyadmin:cpanel-phpmyadmin 32005:32007 /var/cpanel/userhomes/cpanel-phpmyadmin/tmp tmp d reiserfs
       4  0644  -rw-r--r-- cpanel-phpmyadmin:cpanel-phpmyadmin 32005:32007 /var/cpanel/userhomes/cpanel-phpmyadmin/.cpanel/caches/featurelists/default.cache default.cache f reiserfs
       4  0700  drwx------ cpanel-phpmyadmin:cpanel-phpmyadmin 32005:32007 /var/cpanel/userhomes/cpanel-phpmyadmin/.cpanel/caches/featurelists featurelists d reiserfs
       4  0700  drwx------ cpanel-phpmyadmin:cpanel-phpmyadmin 32005:32007 /var/cpanel/userhomes/cpanel-phpmyadmin/.cpanel/caches caches d reiserfs
       4  0700  drwx------ cpanel-phpmyadmin:cpanel-phpmyadmin 32005:32007 /var/cpanel/userhomes/cpanel-phpmyadmin/.cpanel .cpanel d reiserfs
       4  0750  drwxr-x--- cpanel-phpmyadmin:cpanel-phpmyadmin 32005:32007 /var/cpanel/userhomes/cpanel-phpmyadmin/mail mail d reiserfs
       4  0711  drwx--x--x cpanel-phpmyadmin:cpanel-phpmyadmin 32005:32007 /var/cpanel/userhomes/cpanel-phpmyadmin cpanel-phpmyadmin d reiserfs
       4  0700  drwx------ cpanelphppgadmin:cpanelphppgadmin 32009:32011 /var/cpanel/userhomes/cpanelphppgadmin/sessions sessions d reiserfs
       4  0644  -rw-r--r-- cpanelphppgadmin:cpanelphppgadmin 32009:32011 /var/cpanel/userhomes/cpanelphppgadmin/.cpanel/caches/featurelists/default.cache default.cache f reiserfs
       4  0700  drwx------ cpanelphppgadmin:cpanelphppgadmin 32009:32011 /var/cpanel/userhomes/cpanelphppgadmin/.cpanel/caches/featurelists featurelists d reiserfs
       4  0700  drwx------ cpanelphppgadmin:cpanelphppgadmin 32009:32011 /var/cpanel/userhomes/cpanelphppgadmin/.cpanel/caches caches d reiserfs
       4  0700  drwx------ cpanelphppgadmin:cpanelphppgadmin 32009:32011 /var/cpanel/userhomes/cpanelphppgadmin/.cpanel .cpanel d reiserfs
       4  0750  drwxr-x--- cpanelphppgadmin:cpanelphppgadmin 32009:32011 /var/cpanel/userhomes/cpanelphppgadmin/mail mail d reiserfs
       4  0711  drwx--x--x cpanelphppgadmin:cpanelphppgadmin 32009:32011 /var/cpanel/userhomes/cpanelphppgadmin cpanelphppgadmin d reiserfs
       4  0750  drwxr-x--- cpanelroundcube:cpanelroundcube 514  :514   /var/cpanel/userhomes/cpanelroundcube/mail mail d reiserfs
       4  0700  drwx------ cpanelroundcube:cpanelroundcube 514  :514   /var/cpanel/userhomes/cpanelroundcube/sessions sessions d reiserfs
       4  0711  drwx--x--x cpanelroundcube:cpanelroundcube 514  :514   /var/cpanel/userhomes/cpanelroundcube cpanelroundcube d reiserfs
       4  0644  -rw-r--r--     cpanel:cpanel     32002:32004 /var/cpanel/.cpanel/caches/featurelists/default.cache default.cache f reiserfs
       4  0700  drwx------     cpanel:cpanel     32002:32004 /var/cpanel/.cpanel/caches/featurelists featurelists d reiserfs
       4  0700  drwx------     cpanel:cpanel     32002:32004 /var/cpanel/.cpanel/caches caches d reiserfs
       4  0700  drwx------     cpanel:cpanel     32002:32004 /var/cpanel/.cpanel .cpanel d reiserfs
       4  0700  drwx------ cpanelroundcube:cpanelroundcube 514  :514   /var/cpanel/roundcube/tmp tmp d reiserfs
       4  0700  drwx------ cpanelroundcube:cpanelroundcube 514  :514   /var/cpanel/roundcube/log log d reiserfs</pre>


<h3>Find Permissions</h3>
<pre>cat ~/cpanel-group-files.log ~/cpanel-users-files.log |tr -s &#039;\000 \t&#039;|cut -d&#039; &#039; -f3|sort -u</pre>






<h3>Find files tailwatchd</h3>
<pre>(1:3732)# $NICE find ${1:-`pwd`} -mount -name &#039;*tailwatch*&#039;
/usr/local/cpanel/libexec/tailwatchd
/usr/local/cpanel/libexec/tailwatch
/usr/local/cpanel/libexec/tailwatch/tailwatchd
/usr/local/cpanel/etc/init/scripts/freebsd/tailwatchd.sh
/usr/local/cpanel/etc/init/scripts/trustix/tailwatchd
/usr/local/cpanel/etc/init/scripts/centos/tailwatchd
/usr/local/cpanel/etc/init/scripts/suse/tailwatchd
/usr/local/cpanel/etc/init/scripts/caos/tailwatchd
/usr/local/cpanel/etc/init/scripts/whitebox/tailwatchd
/usr/local/cpanel/etc/init/scripts/mandrake/tailwatchd
/usr/local/cpanel/etc/init/scripts/debian/tailwatchd
/usr/local/cpanel/etc/init/scripts/redhat/tailwatchd
/usr/local/cpanel/etc/init/scripts/fedora/tailwatchd
/usr/local/cpanel/etc/init/stoptailwatchd
/usr/local/cpanel/etc/init/starttailwatchd
/usr/local/cpanel/bin/tailwatchd
/usr/local/cpanel/logs/tailwatchd_log
/var/log/cpanel/tailwatchd_log
/var/cpanel/log_rotation/cp_tailwatchd_log.cpanellogd
/var/cpanel/tailwatch.positions
/var/run/tailwatchd.pid
/etc/chkserv.d/tailwatchd
/scripts/restartsrv_tailwatchd</pre>


<h2>Delete cpanel Users/Groups</h2>
<pre>for U in cpanel-phpmyadmin cpanel-phppgadmin cpanelphpmyadmin cpanelphppgadmin cpanelhorde cpanelroundcube machbuild; do userdel -fr $U; groupdel $U; done</pre>

<h2>Check for broken symlinks</h2>
<pre>find / -mount -depth -type l -print0 |xargs -0 -P0 -I&#039;F87&#039; file -s &#039;F87&#039; | sed -n &#039;/: broken symbolic link to/p&#039;</pre>
<p>Especially check /etc</p>
<pre>$ find /etc -mount -depth -type l -print0 |xargs -0 -P0 -I&#039;F87&#039; file -s &#039;F87&#039; | sed -n &#039;/: broken symbolic link to/p&#039;
/etc/ftpd-rsa.pem                   broken symbolic link to `/var/cpanel/ssl/ftp/ftpd-rsa.pem&#039;
/etc/rc.d/rc1.d/K10chkservd         broken symbolic link to `../init.d/chkservd&#039;
/etc/rc.d/rc1.d/K30antirelayd       broken symbolic link to `../init.d/antirelayd&#039;
/etc/rc.d/rc1.d/K80dcc              broken symbolic link to `../init.d/dcc&#039;
/etc/rc.d/rc3.d/K80dcc              broken symbolic link to `../init.d/dcc&#039;
/etc/rc.d/rc3.d/S80chkservd         broken symbolic link to `../init.d/chkservd&#039;
/etc/rc.d/rc3.d/S80antirelayd       broken symbolic link to `../init.d/antirelayd&#039;
/etc/rc.d/rc6.d/K10chkservd         broken symbolic link to `../init.d/chkservd&#039;
/etc/rc.d/rc6.d/K30antirelayd       broken symbolic link to `../init.d/antirelayd&#039;
/etc/rc.d/rc6.d/K80dcc              broken symbolic link to `../init.d/dcc&#039;
/etc/rc.d/rc5.d/K80dcc              broken symbolic link to `../init.d/dcc&#039;
/etc/rc.d/rc5.d/S80chkservd         broken symbolic link to `../init.d/chkservd&#039;
/etc/rc.d/rc5.d/S80antirelayd       broken symbolic link to `../init.d/antirelayd&#039;
/etc/rc.d/rc2.d/K80dcc              broken symbolic link to `../init.d/dcc&#039;
/etc/rc.d/rc2.d/S80chkservd         broken symbolic link to `../init.d/chkservd&#039;
/etc/rc.d/rc2.d/S80antirelayd       broken symbolic link to `../init.d/antirelayd&#039;
/etc/rc.d/rc4.d/K80dcc              broken symbolic link to `../init.d/dcc&#039;
/etc/rc.d/rc4.d/S80chkservd         broken symbolic link to `../init.d/chkservd&#039;
/etc/rc.d/rc4.d/S80antirelayd       broken symbolic link to `../init.d/antirelayd&#039;
/etc/rc.d/rc0.d/K10chkservd         broken symbolic link to `../init.d/chkservd&#039;
/etc/rc.d/rc0.d/K30antirelayd       broken symbolic link to `../init.d/antirelayd&#039;
/etc/rc.d/rc0.d/K80dcc              broken symbolic link to `../init.d/dcc&#039;
/etc/authlib/authProg               broken symbolic link to `/usr/local/cpanel/bin/courier-auth&#039;</pre>

<p>And delete if you are sure</p>
<pre>find /etc -mount -depth -type l -print0 |xargs -0 -P0 -I&#039;F87&#039; file -s &#039;F87&#039; | sed -n &#039;/: broken symbolic link to/p&#039; |cut -d&#039; &#039; -f1|xargs -I&#039;F87&#039; rm -rvf &#039;F87&#039;</pre>


<h2>Reinstall CSF</h2>
<p>The only thing I actually used that came with cpanel is the CSF/LFD Firewall package, which is a fantastic piece of software.  I had to reinstall this, and to get it working without cpanel add the following line to the csf.conf</p>
<pre>GENERIC = "1"</pre>

<h2>Thats It</h2>
<p>Now once you've cleaned up everything, you should try everything conceivable to get an error before rebooting.  Like you should start and stop every service in /etc/init.d/, you should use telinit to check various runlevels (which keeps your sshd connection still live).  Go all out, should take at least a full hour.</p>
<p>Another thing I like to do is rebuild alot of my source-built software again in case anything got messed up.  I upgrade perl from cpanels 5.8.8 to 5.10, which is pretty thorough, and you know, reinstall anything else I think I might need.  One of the benefits of compiling your own software is all I have to do is cd to the source directory and type <code>make -B &amp;&amp; ( { make test || make check || make checks || make tests; } || echo  ) &amp;&amp; sudo make install</code> and that's it.  The tests/checks are optional of course.</p>


<p>If anyone actually ever reads this and does it, please share your advice here.. everybody knows we need it!  Good Luck</p><p><a href="http://www.askapache.com/hacking/uninstall-cpanel.html"></a><a href="http://www.askapache.com/hacking/uninstall-cpanel.html">HOWTO: Uninstall CPANEL over SSH</a> originally appeared on <cite>AskApache.com</cite> </p>]]></content:encoded>
			<wfw:commentRss>http://www.askapache.com/hacking/uninstall-cpanel.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>HTTP Status Codes and Htaccess ErrorDocuments</title>
		<link>http://www.askapache.com/htaccess/apache-status-code-headers-errordocument.html</link>
		<comments>http://www.askapache.com/htaccess/apache-status-code-headers-errordocument.html#comments</comments>
		<pubDate>Tue, 04 Jan 2011 20:56:15 +0000</pubDate>
		<dc:creator>AskApache</dc:creator>
				<category><![CDATA[Htaccess]]></category>

		<guid isPermaLink="false">http://www.askapache.com.com/htaccess/wow-i-served-a-page-for-every-single-http-status-code-and-saved-headers-and-content.html</guid>
		<description><![CDATA[<p>There are a total of <a href="http://www.askapache.com/htaccess/apache-status-code-headers-errordocument.html#apache-response-codes-57">57 HTTP Status Codes</a> recognized by the Apache Web Server.  Wouldn't you like to see what all those headers and their output, ErrorDocuments look like?</p>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.askapache.com/htaccess/apache-status-code-headers-errordocument.html"></a><a href="http://www.askapache.com/htaccess/apache-status-code-headers-errordocument.html"><cite>AskApache.com</cite></a></p><p><strong>I was trying to find an official, authoritative list of HTTP Status Codes</strong> but I kept finding lists that weren't authoritative or complete. So I searched and found my answer in the Apache HTTP Server source code.  Once I had the exact HTTP Status Codes and resulting Error Documents sent by Apache, I researched deeper into HTTP Status Codes by reading as many related RFC's as I could find, and several other software source codes were explored.  This is the most authoritative list I know of, if you can do better leave a comment and I'll update it.  Another thing to keep in mind, the Status code number itself is what is used by software and hardware to make determinations, the phrase returned by the status code is for the human only and does not have any weight other than informing the user.. So "503 Service Unavailable", "503 Service Temporarily Unavailable", and "503 Get the heck outta here" are all completely valid.</p>
<p class="bnote"><strong>Update March 9, 2009</strong>: A lot of sites on the web have updated their HTTP status code lists to include the HTTP Status codes listed on this page, including Wikipedia, IANA, W3C, and others, so rest assured this info is accurate and complete.  If you'd like to see how to create custom error pages for all of these errors like mine  <a href="http://www.askapache.com/show-error-506">/show-error-506</a> , then check out  <a href="http://www.askapache.com/htaccess/advanced-htaccess-ssi.html">this detailed tutorial</a>  I just posted.</p>


<h2>Contents</h2>
<ul>
    <li> <a href="http://www.askapache.com/htaccess/apache-status-code-headers-errordocument.html#apache-response-codes-57">List of All 57 HTTP Response Status Code</a> </li>
    <li> <a href="http://www.askapache.com/htaccess/apache-status-code-headers-errordocument.html#quick-start">Quick Start to triggering ErrorDocuments for each Status Code</a> </li>
    <li> <a href="http://www.askapache.com/htaccess/apache-status-code-headers-errordocument.html#automating-the-process">Automate the ErrorDocument Triggering</a>
        <ul>
            <li> <a href="http://www.askapache.com/htaccess/apache-status-code-headers-errordocument.html#redirect-code-in-htaccess">The htaccess Code</a> </li>
            <li> <a href="http://www.askapache.com/htaccess/apache-status-code-headers-errordocument.html#php-header-grabber-script">PHP script that gets and outputs the Headers/Content</a> </li>
        </ul>
    </li>
    <li> <a href="http://www.askapache.com/htaccess/apache-status-code-headers-errordocument.html#headers-returned-content">Headers and Content Returned</a> </li>
    <li> <a href="http://www.askapache.com/htaccess/apache-status-code-headers-errordocument.html#apache-source-code">Apache Source Code</a>
        <ul>
            <li> <a href="http://www.askapache.com/htaccess/apache-status-code-headers-errordocument.html#httpdh-h">httpd.h</a> </li>
            <li> <a href="http://www.askapache.com/htaccess/apache-status-code-headers-errordocument.html#http_protocol-c">http_protocol.c</a> </li>
        </ul>
    </li>
</ul>


<h2> <a href="#apache-response-codes-57" name="apache-response-codes-57" id="apache-response-codes-57">57 APACHE HTTP STATUS RESPONSE CODES</a> </h2>
<p>Once I compiled the list of Apache recognized HTTP Status Codes, I was dying to see them all in action (<em>i.e. the corresponding <strong>ErrorDocument</strong></em>).  At first I thought I would have to create a php or perl script emulating each of the 57 HTTP Status Codes, a tedious undertaking I wasn't about to do.  Instead I "asked Apache" by searching the  <a href="http://httpd.apache.org/docs/trunk/">Apache HTTP Documentation</a>  for <em>ambiguity sending Status Codes and/or triggering ErrorDocuments</em> with an Apache Directive.<br /><strong>While reading</strong> up on  <a href="http://askapache.info/trunk/mod/mod_alias.html">mod_alias</a>  and the  <a href="http://askapache.info/trunk/mod/mod_alias.html#redirect">Redirect</a>  directive I found:</p>
<blockquote cite="http://httpd.apache.org/docs/trunk/mod/mod_alias.html#redirect"><cite>Apache Docs</cite>
    <p>Syntax: <strong>Redirect [status] URL-path URL</strong> The status argument can be used to return <strong>other</strong> HTTP status codes. <strong>Other</strong> status codes can be returned by giving the numeric status code as the value of status.  If the status is between 300 and 399, the URL argument must be present, otherwise it must be omitted.</p>
</blockquote>
<dl>
    <dt><a id="code-100" title="Continue">100 Continue</a> </dt>
    <dd><a title="ErrorDocument 100" href="/e/100/">ErrorDocument Continue</a>  |  <a href="#status-100" title="Sample Continue">Sample 100 Continue</a> <br />This means that the server has received the request headers, and that the client should proceed to send the request body (in case of a request which   needs to be sent; for example, a POST request). If the request body is large, sending it to a server when a request has already been rejected based upon inappropriate headers is inefficient.   To have a server check if the request could be accepted based on the requests headers alone, a client must send Expect: 100-continue as a header in its initial request (see RFC 2616 14.20 Expect header) and check if a 100 Continue status code is received in response before continuing (or receive 417 Expectation Failed and not continue).</dd>
    <dt><a id="code-101" title="Switching Protocols">101 Switching Protocols</a> </dt>
    <dd><a title="ErrorDocument 101" href="/e/101/">ErrorDocument Switching Protocols</a>  |  <a href="#status-101" title="Sample Switching Protocols">Sample 101 Switching Protocols</a> <br />This means the requester has asked the server to switch protocols and the server is acknowledging that it will do so.[3]</dd>
    <dt><a id="code-102" title="Processing">102 Processing</a> </dt>
    <dd><a title="ErrorDocument 102" href="/e/102/">ErrorDocument Processing</a>  |  <a href="#status-102" title="Sample Processing">Sample 102 Processing</a> <br />(WebDAV) - (RFC 2518 )</dd>
    <dt><a id="code-200" title="OK">200 OK</a> </dt>
    <dd><a title="ErrorDocument 200" href="/e/200/">ErrorDocument OK</a>  |  <a href="#status-200" title="Sample OK">Sample 200 OK</a> <br />Standard response for successful HTTP requests. The actual response will depend on the request method used. In a GET request, the response will contain an   entity corresponding to the requested resource. In a POST request the response will contain an entity describing or containing the result of the action.</dd>
    <dt><a id="code-201" title="Created">201 Created</a> </dt>
    <dd><a title="ErrorDocument 201" href="/e/201/">ErrorDocument Created</a>  |  <a href="#status-201" title="Sample Created">Sample 201 Created</a> <br />The request has been fulfilled and resulted in a new resource being created.</dd>
    <dt><a id="code-202" title="Accepted">202 Accepted</a> </dt>
    <dd><a title="ErrorDocument 202" href="/e/202/">ErrorDocument Accepted</a>  |  <a href="#status-202" title="Sample Accepted">Sample 202 Accepted</a> <br />The request has been accepted for processing, but the processing has not been completed. The request might or might not eventually be acted upon, as it   might be disallowed when processing actually takes place.</dd>
    <dt><a id="code-203" title="Non-Authoritative Information">203 Non-Authoritative Information</a> </dt>
    <dd><a title="ErrorDocument 203" href="/e/203/">ErrorDocument Non-Authoritative Information</a>  |  <a href="#status-203" title="Sample Non-Authoritative Information">Sample 203 Non-Authoritative Information</a> <br />The server successfully processed the request, but is returning information that may be from another source.</dd>
    <dt><a id="code-204" title="No Content">204 No Content</a> </dt>
    <dd><a title="ErrorDocument 204" href="/e/204/">ErrorDocument No Content</a>  |  <a href="#status-204" title="Sample No Content">Sample 204 No Content</a> <br />The server successfully processed the request, but is not returning any content.</dd>
    <dt><a id="code-205" title="Reset Content">205 Reset Content</a> </dt>
    <dd><a title="ErrorDocument 205" href="/e/205/">ErrorDocument Reset Content</a>  |  <a href="#status-205" title="Sample Reset Content">Sample 205 Reset Content</a> <br />The server successfully processed the request, but is not returning any content. Unlike a 204 response, this response requires that the requester   reset the document view.</dd>
    <dt><a id="code-206" title="Partial Content">206 Partial Content</a> </dt>
    <dd><a title="ErrorDocument 206" href="/e/206/">ErrorDocument Partial Content</a>  |  <a href="#status-206" title="Sample Partial Content">Sample 206 Partial Content</a> <br />The server is delivering only part of the resource due to a range header sent by the client. This is used by tools like wget to enable resuming   of interrupted downloads, or split a download into multiple simultaneous streams.</dd>
    <dt><a id="code-207" title="Multi-Status">207 Multi-Status</a> </dt>
    <dd><a title="ErrorDocument 207" href="/e/207/">ErrorDocument Multi-Status</a>  |  <a href="#status-207" title="Sample Multi-Status">Sample 207 Multi-Status</a> <br />(WebDAV) - The message body that follows is an XML message and can contain a number of separate response codes, depending on how many sub-requests   were made.</dd>
    <dt><a id="code-226" title="IM Used">226 IM Used</a> </dt>
    <dd><a title="ErrorDocument 226" href="/e/226/">ErrorDocument IM Used</a>  |  <a href="#status-226" title="Sample IM Used">Sample 226 IM Used</a> <br />The server has fulfilled a GET request for the resource, and the response is a representation of the result of one or more instance-manipulations   applied to the current instance.  The actual current instance might not be available except by combining this response with other previous or future responses, as appropriate for the specific   instance-manipulation(s).</dd>
    <dt><a id="code-300" title="Multiple Choices">300 Multiple Choices</a> </dt>
    <dd><a title="ErrorDocument 300" href="/e/300/">ErrorDocument Multiple Choices</a>  |  <a href="#status-300" title="Sample Multiple Choices">Sample 300 Multiple Choices</a> <br />Indicates multiple options for the resource that the client may follow. It, for instance, could be used to present different format options for   video, list files with different extensions, or word sense disambiguation.</dd>
    <dt><a id="code-301" title="Moved Permanently">301 Moved Permanently</a> </dt>
    <dd><a title="ErrorDocument 301" href="/e/301/">ErrorDocument Moved Permanently</a>  |  <a href="#status-301" title="Sample Moved Permanently">Sample 301 Moved Permanently</a> <br />This and all future requests should be directed to the given URI.</dd>
    <dt><a id="code-302" title="Found">302 Found</a> </dt>
    <dd><a title="ErrorDocument 302" href="/e/302/">ErrorDocument Found</a>  |  <a href="#status-302" title="Sample Found">Sample 302 Found</a> <br />This is the most popular redirect code[citation needed], but also an example of industrial practice contradicting the standard. HTTP/1.0 specification   (RFC 1945 ) required the client to perform a temporary redirect (the original describing phrase was "Moved Temporarily"), but popular browsers implemented it as a 303 See Other. Therefore,   HTTP/1.1 added status codes 303 and 307 to disambiguate between the two behaviours. However, the majority of Web applications and frameworks still use the 302 status code as if it were the   303.</dd>
    <dt><a id="code-303" title="See Other">303 See Other</a> </dt>
    <dd><a title="ErrorDocument 303" href="/e/303/">ErrorDocument See Other</a>  |  <a href="#status-303" title="Sample See Other">Sample 303 See Other</a> <br />The response to the request can be found under another URI using a GET method. When received in response to a PUT, it should be assumed that the   server has received the data and the redirect should be issued with a separate GET message.</dd>
    <dt><a id="code-304" title="Not Modified">304 Not Modified</a> </dt>
    <dd><a title="ErrorDocument 304" href="/e/304/">ErrorDocument Not Modified</a>  |  <a href="#status-304" title="Sample Not Modified">Sample 304 Not Modified</a> <br />Indicates the resource has not been modified since last requested. Typically, the HTTP client provides a header like the If-Modified-Since header   to provide a time against which to compare. Utilizing this saves bandwidth and reprocessing on both the server and client, as only the header data must be sent and received in comparison to   the entirety of the page being re-processed by the server, then resent using more bandwidth of the server and client.</dd>
    <dt><a id="code-305" title="Use Proxy">305 Use Proxy</a> </dt>
    <dd><a title="ErrorDocument 305" href="/e/305/">ErrorDocument Use Proxy</a>  |  <a href="#status-305" title="Sample Use Proxy">Sample 305 Use Proxy</a> <br />Many HTTP clients (such as Mozilla[4] and Internet Explorer) do not correctly handle responses with this status code, primarily for security   reasons.</dd>
    <dt><a id="code-306" title="Switch Proxy">306 Switch Proxy</a> </dt>
    <dd><a title="ErrorDocument 306" href="/e/306/">ErrorDocument Switch Proxy</a>  |  <a href="#status-306" title="Sample Switch Proxy">Sample 306 Switch Proxy</a> <br />No longer used.</dd>
    <dt><a id="code-307" title="Temporary Redirect">307 Temporary Redirect</a> </dt>
    <dd><a title="ErrorDocument 307" href="/e/307/">ErrorDocument Temporary Redirect</a>  |  <a href="#status-307" title="Sample Temporary Redirect">Sample 307 Temporary Redirect</a> <br />In this occasion, the request should be repeated with another URI, but future requests can still use the original URI. In contrast to 303,   the request method should not be changed when reissuing the original request. For instance, a POST request must be repeated using another POST request.</dd>
    <dt><a id="code-400" title="Bad Request">400 Bad Request</a> </dt>
    <dd><a title="ErrorDocument 400" href="/e/400/">ErrorDocument Bad Request</a>  |  <a href="#status-400" title="Sample Bad Request">Sample 400 Bad Request</a> <br />The request contains bad syntax or cannot be fulfilled.</dd>
    <dt><a id="code-401" title="Unauthorized">401 Unauthorized</a> </dt>
    <dd><a title="ErrorDocument 401" href="/e/401/">ErrorDocument Unauthorized</a>  |  <a href="#status-401" title="Sample Unauthorized">Sample 401 Unauthorized</a> <br />Similar to 403 Forbidden, but specifically for use when authentication is possible but has failed or not yet been provided. The response must   include a WWW-Authenticate header field containing a challenge applicable to the requested resource. See Basic access authentication and Digest access authentication.</dd>
    <dt><a id="code-402" title="Payment Required">402 Payment Required</a> </dt>
    <dd><a title="ErrorDocument 402" href="/e/402/">ErrorDocument Payment Required</a>  |  <a href="#status-402" title="Sample Payment Required">Sample 402 Payment Required</a> <br />The original intention was that this code might be used as part of some form of digital cash or micropayment scheme, but that has not happened,   and this code has never been used.</dd>
    <dt><a id="code-403" title="Forbidden">403 Forbidden</a> </dt>
    <dd><a title="ErrorDocument 403" href="/e/403/">ErrorDocument Forbidden</a>  |  <a href="#status-403" title="Sample Forbidden">Sample 403 Forbidden</a> <br />The request was a legal request, but the server is refusing to respond to it. Unlike a 401 Unauthorized response, authenticating will make no   difference.</dd>
    <dt><a id="code-404" title="Not Found">404 Not Found</a> </dt>
    <dd><a title="ErrorDocument 404" href="/e/404/">ErrorDocument Not Found</a>  |  <a href="#status-404" title="Sample Not Found">Sample 404 Not Found</a> <br />The requested resource could not be found but may be available again in the future. Subsequent requests by the client are permissible.</dd>
    <dt><a id="code-405" title="Method Not Allowed">405 Method Not Allowed</a> </dt>
    <dd><a title="ErrorDocument 405" href="/e/405/">ErrorDocument Method Not Allowed</a>  |  <a href="#status-405" title="Sample Method Not Allowed">Sample 405 Method Not Allowed</a> <br />A request was made of a resource using a request method not supported by that resource; for example, using GET on a form which requires data   to be presented via POST, or using PUT on a read-only resource.</dd>
    <dt><a id="code-406" title="Not Acceptable">406 Not Acceptable</a> </dt>
    <dd><a title="ErrorDocument 406" href="/e/406/">ErrorDocument Not Acceptable</a>  |  <a href="#status-406" title="Sample Not Acceptable">Sample 406 Not Acceptable</a> <br />The requested resource is only capable of generating content not acceptable according to the Accept headers sent in the request.</dd>
    <dt><a id="code-407" title="Proxy Authentication Required">407 Proxy Authentication Required</a> </dt>
    <dd><a title="ErrorDocument 407" href="/e/407/">ErrorDocument Proxy Authentication Required</a>  |  <a href="#status-407" title="Sample Proxy Authentication Required">Sample 407 Proxy Authentication Required</a> <br />Required</dd>
    <dt><a id="code-408" title="Request Timeout">408 Request Timeout</a> </dt>
    <dd><a title="ErrorDocument 408" href="/e/408/">ErrorDocument Request Timeout</a>  |  <a href="#status-408" title="Sample Request Timeout">Sample 408 Request Timeout</a> <br />The server timed out waiting for the request.</dd>
    <dt><a id="code-409" title="Conflict">409 Conflict</a> </dt>
    <dd><a title="ErrorDocument 409" href="/e/409/">ErrorDocument Conflict</a>  |  <a href="#status-409" title="Sample Conflict">Sample 409 Conflict</a> <br />Indicates that the request could not be processed because of conflict in the request, such as an edit conflict.</dd>
    <dt><a id="code-410" title="Gone">410 Gone</a> </dt>
    <dd><a title="ErrorDocument 410" href="/e/410/">ErrorDocument Gone</a>  |  <a href="#status-410" title="Sample Gone">Sample 410 Gone</a> <br />Indicates that the resource requested is no longer available and will not be available again. This should be used when a resource has been intentionally   removed; however, it is not necessary to return this code and a 404 Not Found can be issued instead. Upon receiving a 410 status code, the client should not request the resource again in the   future. Clients such as search engines should remove the resource from their indexes.</dd>
    <dt><a id="code-411" title="Length Required">411 Length Required</a> </dt>
    <dd><a title="ErrorDocument 411" href="/e/411/">ErrorDocument Length Required</a>  |  <a href="#status-411" title="Sample Length Required">Sample 411 Length Required</a> <br />The request did not specify the length of its content, which is required by the requested resource.</dd>
    <dt><a id="code-412" title="Precondition Failed">412 Precondition Failed</a> </dt>
    <dd><a title="ErrorDocument 412" href="/e/412/">ErrorDocument Precondition Failed</a>  |  <a href="#status-412" title="Sample Precondition Failed">Sample 412 Precondition Failed</a> <br />The server does not meet one of the preconditions that the requester put on the request.</dd>
    <dt><a id="code-413" title="Request Entity Too Large">413 Request Entity Too Large</a> </dt>
    <dd><a title="ErrorDocument 413" href="/e/413/">ErrorDocument Request Entity Too Large</a>  |  <a href="#status-413" title="Sample Request Entity Too Large">Sample 413 Request Entity Too Large</a> <br />The request is larger than the server is willing or able to process.</dd>
    <dt><a id="code-414" title="Request-URI Too Long">414 Request-URI Too Long</a> </dt>
    <dd><a title="ErrorDocument 414" href="/e/414/">ErrorDocument Request-URI Too Long</a>  |  <a href="#status-414" title="Sample Request-URI Too Long">Sample 414 Request-URI Too Long</a> <br />The URI provided was too long for the server to process.</dd>
    <dt><a id="code-415" title="Unsupported Media Type">415 Unsupported Media Type</a> </dt>
    <dd><a title="ErrorDocument 415" href="/e/415/">ErrorDocument Unsupported Media Type</a>  |  <a href="#status-415" title="Sample Unsupported Media Type">Sample 415 Unsupported Media Type</a> <br />The request did not specify any media types that the server or resource supports. For example the client specified that an image resource   should be served as image/svg+xml, but the server cannot find a matching version of the image.</dd>
    <dt><a id="code-416" title="Requested Range Not Satisfiable">416 Requested Range Not Satisfiable</a> </dt>
    <dd><a title="ErrorDocument 416" href="/e/416/">ErrorDocument Requested Range Not Satisfiable</a>  |  <a href="#status-416" title="Sample Requested Range Not Satisfiable">Sample 416 Requested Range Not Satisfiable</a> <br />The client has asked for a portion of the file, but the server cannot supply that portion (for example, if the client asked for   a part of the file that lies beyond the end of the file).</dd>
    <dt><a id="code-417" title="Expectation Failed">417 Expectation Failed</a> </dt>
    <dd><a title="ErrorDocument 417" href="/e/417/">ErrorDocument Expectation Failed</a>  |  <a href="#status-417" title="Sample Expectation Failed">Sample 417 Expectation Failed</a> <br />The server cannot meet the requirements of the Expect request-header field.</dd>
    <dt><a id="code-418" title="I'm a teapot">418 I'm a teapot</a> </dt>
    <dd><a title="ErrorDocument 418" href="/e/418/">ErrorDocument I'm a teapot</a>  |  <a href="#status-418" title="Sample I'm a teapot">Sample 418 I'm a teapot</a> <br />The HTCPCP server is a teapot. The responding entity MAY be short and stout. Defined by the April Fools specification RFC 2324. See Hyper Text   Coffee Pot Control Protocol for more information.</dd>
    <dt><a id="code-422" title="Unprocessable Entity">422 Unprocessable Entity</a> </dt>
    <dd><a title="ErrorDocument 422" href="/e/422/">ErrorDocument Unprocessable Entity</a>  |  <a href="#status-422" title="Sample Unprocessable Entity">Sample 422 Unprocessable Entity</a> <br />(WebDAV) (RFC 4918 ) - The request was well-formed but was unable to be followed due to semantic errors.</dd>
    <dt><a id="code-423" title="Locked">423 Locked</a> </dt>
    <dd><a title="ErrorDocument 423" href="/e/423/">ErrorDocument Locked</a>  |  <a href="#status-423" title="Sample Locked">Sample 423 Locked</a> <br />(WebDAV) (RFC 4918 ) - The resource that is being accessed is locked</dd>
    <dt><a id="code-424" title="Failed Dependency">424 Failed Dependency</a> </dt>
    <dd><a title="ErrorDocument 424" href="/e/424/">ErrorDocument Failed Dependency</a>  |  <a href="#status-424" title="Sample Failed Dependency">Sample 424 Failed Dependency</a> <br />(WebDAV) (RFC 4918 ) - The request failed due to failure of a previous request (e.g. a PROPPATCH).</dd>
    <dt><a id="code-425" title="Unordered Collection">425 Unordered Collection</a> </dt>
    <dd><a title="ErrorDocument 425" href="/e/425/">ErrorDocument Unordered Collection</a>  |  <a href="#status-425" title="Sample Unordered Collection">Sample 425 Unordered Collection</a> <br />Defined in drafts of WebDav Advanced Collections, but not present in "Web Distributed Authoring and Versioning (WebDAV) Ordered Collections   Protocol" (RFC 3648).</dd>
    <dt><a id="code-426" title="Upgrade Required">426 Upgrade Required</a> </dt>
    <dd><a title="ErrorDocument 426" href="/e/426/">ErrorDocument Upgrade Required</a>  |  <a href="#status-426" title="Sample Upgrade Required">Sample 426 Upgrade Required</a> <br />(RFC 2817 ) - The client should switch to TLS/1.0.</dd>
    <dt><a id="code-449" title="Retry With">449 Retry With</a> </dt>
    <dd><a title="ErrorDocument 449" href="/e/449/">ErrorDocument Retry With</a>  |  <a href="#status-449" title="Sample Retry With">Sample 449 Retry With</a> <br />A Microsoft extension. The request should be retried after doing the appropriate action.</dd>
    <dt><a id="code-500" title="Internal Server Error">500 Internal Server Error</a> </dt>
    <dd><a title="ErrorDocument 500" href="/e/500/">ErrorDocument Internal Server Error</a>  |  <a href="#status-500" title="Sample Internal Server Error">Sample 500 Internal Server Error</a> <br />A generic error message, given when no more specific message is suitable.</dd>
    <dt><a id="code-501" title="Not Implemented">501 Not Implemented</a> </dt>
    <dd><a title="ErrorDocument 501" href="/e/501/">ErrorDocument Not Implemented</a>  |  <a href="#status-501" title="Sample Not Implemented">Sample 501 Not Implemented</a> <br />The server either does not recognise the request method, or it lacks the ability to fulfil the request.</dd>
    <dt><a id="code-502" title="Bad Gateway">502 Bad Gateway</a> </dt>
    <dd><a title="ErrorDocument 502" href="/e/502/">ErrorDocument Bad Gateway</a>  |  <a href="#status-502" title="Sample Bad Gateway">Sample 502 Bad Gateway</a> <br />The server was acting as a gateway or proxy and received an invalid response from the upstream server.</dd>
    <dt><a id="code-503" title="Service Unavailable">503 Service Unavailable</a> </dt>
    <dd><a title="ErrorDocument 503" href="/e/503/">ErrorDocument Service Unavailable</a>  |  <a href="#status-503" title="Sample Service Unavailable">Sample 503 Service Unavailable</a> <br />The server is currently unavailable (because it is overloaded or down for maintenance). Generally, this is a temporary state.</dd>
    <dt><a id="code-504" title="Gateway Timeout">504 Gateway Timeout</a> </dt>
    <dd><a title="ErrorDocument 504" href="/e/504/">ErrorDocument Gateway Timeout</a>  |  <a href="#status-504" title="Sample Gateway Timeout">Sample 504 Gateway Timeout</a> <br />The server was acting as a gateway or proxy and did not receive a timely request from the upstream server.</dd>
    <dt><a id="code-505" title="HTTP Version Not Supported">505 HTTP Version Not Supported</a> </dt>
    <dd><a title="ErrorDocument 505" href="/e/505/">ErrorDocument HTTP Version Not Supported</a>  |  <a href="#status-505" title="Sample HTTP Version Not Supported">Sample 505 HTTP Version Not Supported</a> <br />The server does not support the HTTP protocol version used in the request.</dd>
    <dt><a id="code-506" title="Variant Also Negotiates">506 Variant Also Negotiates</a> </dt>
    <dd><a title="ErrorDocument 506" href="/e/506/">ErrorDocument Variant Also Negotiates</a>  |  <a href="#status-506" title="Sample Variant Also Negotiates">Sample 506 Variant Also Negotiates</a> <br />(RFC 2295 ) - Transparent content negotiation for the request, results in a circular reference.</dd>
    <dt><a id="code-507" title="Insufficient Storage">507 Insufficient Storage</a> </dt>
    <dd><a title="ErrorDocument 507" href="/e/507/">ErrorDocument Insufficient Storage</a>  |  <a href="#status-507" title="Sample Insufficient Storage">Sample 507 Insufficient Storage</a> <br />(WebDAV) (RFC 4918 )</dd>
    <dt><a id="code-509" title="Bandwidth Limit Exceeded">509 Bandwidth Limit Exceeded</a> </dt>
    <dd><a title="ErrorDocument 509" href="/e/509/">ErrorDocument Bandwidth Limit Exceeded</a>  |  <a href="#status-509" title="Sample Bandwidth Limit Exceeded">Sample 509 Bandwidth Limit Exceeded</a> <br />(Apache bw/limited extension) - This status code, while used by many servers, is not specified in any RFCs.</dd>
    <dt><a id="code-510" title="Not Extended">510 Not Extended</a> </dt>
    <dd><a title="ErrorDocument 510" href="/e/510/">ErrorDocument Not Extended</a>  |  <a href="#status-510" title="Sample Not Extended">Sample 510 Not Extended</a> <br />(RFC 2774 ) - Further extensions to the request are required for the server to fulfil it.</dd>
</dl>


<h3>1xx Info / Informational</h3>
<p><code>HTTP_INFO</code> - <strong>Request received, continuing process</strong>. Indicates a provisional response, consisting only of the Status-Line and optional headers, and is terminated by an empty line.</p>
<ul>
    <li> <a href="http://www.askapache.com/htaccess/apache-status-code-headers-errordocument.html#status-100" title="Continue">100</a>  <a title="ErrorDocument 100" href="/e/100/">Continue</a>  - <code>HTTP_CONTINUE</code></li>
    <li> <a href="#status-101" title="Switching Protocols">101</a>  <a title="ErrorDocument 101" href="/e/101/">Switching Protocols</a>  - <code>HTTP_SWITCHING_PROTOCOLS</code></li>
    <li> <a href="#status-102" title="Processing">102</a>  <a title="ErrorDocument 102" href="/e/102/">Processing</a>  - <code>HTTP_PROCESSING</code></li>
</ul>


<h3>2xx Success / OK</h3>
<p><code>HTTP_SUCCESS</code> - <strong>The action was successfully received, understood, and accepted</strong>.  Indicates that the client's request was successfully received, understood, and accepted.</p>
<ul>
    <li> <a href="#status-200" title="OK">200</a>  <a title="ErrorDocument 200" href="/e/200/">OK</a>  - <code>HTTP_OK</code></li>
    <li> <a href="#status-201" title="Created">201</a>  <a title="ErrorDocument 201" href="/e/201/">Created</a>  - <code>HTTP_CREATED</code></li>
    <li> <a href="#status-202" title="Accepted">202</a>  <a title="ErrorDocument 202" href="/e/202/">Accepted</a>  - <code>HTTP_ACCEPTED</code></li>
    <li> <a href="#status-203" title="Non-Authoritative Information">203</a>  <a title="ErrorDocument 203" href="/e/203/">Non-Authoritative Information</a>  - <code>HTTP_NON_AUTHORITATIVE</code></li>
    <li> <a href="#status-204" title="No Content">204</a>  <a title="ErrorDocument 204" href="/e/204/">No Content</a>  - <code>HTTP_NO_CONTENT</code></li>
    <li> <a href="#status-205" title="Reset Content">205</a>  <a title="ErrorDocument 205" href="/e/205/">Reset Content</a>  - <code>HTTP_RESET_CONTENT</code></li>
    <li> <a href="#status-206" title="Partial Content">206</a>  <a title="ErrorDocument 206" href="/e/206/">Partial Content</a>  - <code>HTTP_PARTIAL_CONTENT</code></li>
    <li> <a href="http://www.askapache.com/htaccess/apache-status-code-headers-errordocument.html#status-207" title="Multi-Status">207</a>  <a title="ErrorDocument 207" href="/e/207/">Multi-Status</a>  - <code>HTTP_MULTI_STATUS</code></li>
</ul>


<h3>3xx Redirect</h3>
<p><code>HTTP_REDIRECT</code> - <strong>The client must take additional action to complete the request</strong>.  Indicates that further action needs to be taken by the user-agent in order to fulfill the request. The action required may be carried out by the user agent without interaction with the user if and only if the method used in the second request is GET or HEAD. A user agent should not automatically <em>redirect a request more than 5 times</em>, since such redirections usually indicate an <strong>infinite loop</strong>.</p>
<ul>
    <li> <a href="#status-300" title="Multiple Choices">300</a>  <a title="ErrorDocument 300" href="/e/300/">Multiple Choices</a>  - <code>HTTP_MULTIPLE_CHOICES</code></li>
    <li> <a href="#status-301" title="Moved Permanently">301</a>  <a title="ErrorDocument 301" href="/e/301/">Moved Permanently</a>  - <code>HTTP_MOVED_PERMANENTLY</code></li>
    <li> <a href="#status-302" title="Found">302</a>  <a title="ErrorDocument 302" href="/e/302/">Found</a>  - <code>HTTP_MOVED_TEMPORARILY</code></li>
    <li> <a href="#status-303" title="See Other">303</a>  <a title="ErrorDocument 303" href="/e/303/">See Other</a>  - <code>HTTP_SEE_OTHER</code></li>
    <li> <a href="#status-304" title="Not Modified">304</a>  <a title="ErrorDocument 304" href="/e/304/">Not Modified</a>  - <code>HTTP_NOT_MODIFIED</code></li>
    <li> <a href="#status-305" title="Use Proxy">305</a>  <a title="ErrorDocument 305" href="/e/305/">Use Proxy</a>  - <code>HTTP_USE_PROXY</code></li>
    <li> <a href="#status-306" title="unused">306</a>  <a title="ErrorDocument 306" href="/e/306/">unused</a>  - <code>UNUSED</code></li>
    <li> <a href="#status-307" title="Temporary Redirect">307</a>  <a title="ErrorDocument 307" href="/e/307/">Temporary Redirect</a>  - <code>HTTP_TEMPORARY_REDIRECT</code></li>
</ul>


<h3>4xx Client Error</h3>
<p><code>HTTP_CLIENT_ERROR</code> - <strong>The request contains bad syntax or cannot be fulfilled</strong>.  Indicates case where client seems to have erred. Except when responding to a HEAD request, the server should include an entity containing an explanation of the error situation, and whether it is a temporary or permanent condition.</p>
<ul>
    <li> <a href="#status-400" title="Bad Request">400</a>  <a title="ErrorDocument 400" href="/e/400/">Bad Request</a>  - <code>HTTP_BAD_REQUEST</code></li>
    <li> <a href="#status-401" title="Authorization Required">401</a>  <a title="ErrorDocument 401" href="/e/401/">Authorization Required</a>  - <code>HTTP_UNAUTHORIZED</code></li>
    <li> <a href="#status-402" title="Payment Required">402</a>  <a title="ErrorDocument 402" href="/e/402/">Payment Required</a>  - <code>HTTP_PAYMENT_REQUIRED</code></li>
    <li> <a href="#status-403" title="Forbidden">403</a>  <a title="ErrorDocument 403" href="/e/403/">Forbidden</a>  - <code>HTTP_FORBIDDEN</code></li>
    <li> <a href="#status-404" title="Not Found">404</a>  <a title="ErrorDocument 404" href="/e/404/">Not Found</a>  - <code>HTTP_NOT_FOUND</code></li>
    <li> <a href="#status-405" title="Method Not Allowed">405</a>  <a title="ErrorDocument 405" href="/e/405/">Method Not Allowed</a>  - <code>HTTP_METHOD_NOT_ALLOWED</code></li>
    <li> <a href="#status-406" title="Not Acceptable">406</a>  <a title="ErrorDocument 406" href="/e/406/">Not Acceptable</a>  - <code>HTTP_NOT_ACCEPTABLE</code></li>
    <li> <a href="#status-407" title="Proxy Authentication Required">407</a>  <a title="ErrorDocument 407" href="/e/407/">Proxy Authentication Required</a>  - <code>HTTP_PROXY_AUTHENTICATION_REQUIRED</code></li>
    <li> <a href="#status-408" title="Request Time-out">408</a>  <a title="ErrorDocument 408" href="/e/408/">Request Time-out</a>  - <code>HTTP_REQUEST_TIME_OUT</code></li>
    <li> <a href="#status-409" title="Conflict">409</a>  <a title="ErrorDocument 409" href="/e/409/">Conflict</a>  - <code>HTTP_CONFLICT</code></li>
    <li> <a href="#status-410" title="Gone">410</a>  <a title="ErrorDocument 410" href="/e/410/">Gone</a>  - <code>HTTP_GONE</code></li>
    <li> <a href="#status-411" title="Length Required">411</a>  <a title="ErrorDocument 411" href="/e/411/">Length Required</a>  - <code>HTTP_LENGTH_REQUIRED</code></li>
    <li> <a href="#status-412" title="Precondition Failed">412</a>  <a title="ErrorDocument 412" href="/e/412/">Precondition Failed</a>  - <code>HTTP_PRECONDITION_FAILED</code></li>
    <li> <a href="#status-413" title="Request Entity Too Large">413</a>  <a title="ErrorDocument 413" href="/e/413/">Request Entity Too Large</a>  - <code>HTTP_REQUEST_ENTITY_TOO_LARGE</code></li>
    <li> <a href="#status-414" title="Request-URI Too Large">414</a>  <a title="ErrorDocument 414" href="/e/414/">Request-URI Too Large</a>  - <code>HTTP_REQUEST_URI_TOO_LARGE</code></li>
    <li> <a href="#status-415" title="Unsupported Media Type">415</a>  <a title="ErrorDocument 415" href="/e/415/">Unsupported Media Type</a>  - <code>HTTP_UNSUPPORTED_MEDIA_TYPE</code></li>
    <li> <a href="#status-416" title="Requested Range Not Satisfiable">416</a>  <a title="ErrorDocument 416" href="/e/416/">Requested Range Not Satisfiable</a>  - <code>HTTP_RANGE_NOT_SATISFIABLE</code></li>
    <li> <a href="#status-417" title="Expectation Failed">417</a>  <a title="ErrorDocument 417" href="/e/417/">Expectation Failed</a>  - <code>HTTP_EXPECTATION_FAILED</code></li>
    <li> <a href="#status-418" title="Im a teapot">418</a>  <a title="ErrorDocument 418" href="/e/418/">I'm a teapot</a>  - <code>UNUSED</code></li>
    <li> <a href="#status-419" title="unused">419</a>  <a title="ErrorDocument 419" href="/e/419/">unused</a>  - <code>UNUSED</code></li>
    <li> <a href="#status-420" title="unused">420</a>  <a title="ErrorDocument 420" href="/e/420/">unused</a>  - <code>UNUSED</code></li>
    <li> <a href="#status-421" title="unused">421</a>  <a title="ErrorDocument 421" href="/e/421/">unused</a>  - <code>UNUSED</code></li>
    <li> <a href="#status-422" title="Unprocessable Entity">422</a>  <a title="ErrorDocument 422" href="/e/422/">Unprocessable Entity</a>  - <code>HTTP_UNPROCESSABLE_ENTITY</code></li>
    <li> <a href="#status-423" title="Locked">423</a>  <a title="ErrorDocument 423" href="/e/423/">Locked</a>  - <code>HTTP_LOCKED</code></li>
    <li> <a href="#status-424" title="Failed Dependency">424</a>  <a title="ErrorDocument 424" href="/e/424/">Failed Dependency</a>  - <code>HTTP_FAILED_DEPENDENCY</code></li>
    <li> <a href="#status-425" title="No code">425</a>  <a title="ErrorDocument 425" href="/e/425/">No code</a>  - <code>HTTP_NO_CODE</code></li>
    <li> <a href="#status-426" title="Upgrade Required">426</a>  <a title="ErrorDocument 426" href="/e/426/">Upgrade Required</a>  - <code>HTTP_UPGRADE_REQUIRED</code></li>
</ul>


<h3>5xx Server Error</h3>
<p><code>HTTP_SERVER_ERROR</code> - <strong>The server failed to fulfill an apparently valid request</strong>.  Indicate cases in which the server is aware that it has erred or is incapable of performing the request. Except when responding to a HEAD request, the server should include an entity containing an explanation of the error situation, and whether it is a temporary or permanent condition. User agents should display any included entity to the user. These response codes are applicable to any request method.</p>
<ul>
    <li> <a href="#status-500" title="Internal Server Error">500</a>  <a title="ErrorDocument 500" href="/e/500/">Internal Server Error</a>  - <code>HTTP_INTERNAL_SERVER_ERROR</code></li>
    <li> <a href="#status-501" title="Method Not Implemented">501</a>  <a title="ErrorDocument 501" href="/e/501/">Method Not Implemented</a>  - <code>HTTP_NOT_IMPLEMENTED</code></li>
    <li> <a href="#status-502" title="Bad Gateway">502</a>  <a title="ErrorDocument 502" href="/e/502/">Bad Gateway</a>  - <code>HTTP_BAD_GATEWAY</code></li>
    <li> <a href="#status-503" title="Service Temporarily Unavailable">503</a>  <a title="ErrorDocument 503" href="/e/503/">Service Temporarily Unavailable</a>  - <code>HTTP_SERVICE_UNAVAILABLE</code></li>
    <li> <a href="#status-504" title="Gateway Time-out">504</a>  <a title="ErrorDocument 504" href="/e/504/">Gateway Time-out</a>  - <code>HTTP_GATEWAY_TIME_OUT</code></li>
    <li> <a href="#status-505" title="HTTP Version Not Supported">505</a>  <a title="ErrorDocument 505" href="/e/505/">HTTP Version Not Supported</a>  - <code>HTTP_VERSION_NOT_SUPPORTED</code></li>
    <li> <a href="#status-506" title="Variant Also Negotiates">506</a>  <a title="ErrorDocument 506" href="/e/506/">Variant Also Negotiates</a>  - <code>HTTP_VARIANT_ALSO_VARIES</code></li>
    <li> <a href="#status-507" title="Insufficient Storage">507</a>  <a title="ErrorDocument 507" href="/e/507/">Insufficient Storage</a>  - <code>HTTP_INSUFFICIENT_STORAGE</code></li>
    <li> <a href="#status-508" title="unused">508</a>  <a title="ErrorDocument 508" href="/e/508/">unused</a>  - <code>UNUSED</code></li>
    <li> <a href="#status-509" title="unused">509</a>  <a title="ErrorDocument 509" href="/e/509/">unused</a>  - <code>UNUSED</code></li>
    <li> <a href="#status-510" title="Not Extended">510</a>  <a title="ErrorDocument 510" href="/e/510/">Not Extended</a>  - <code>HTTP_NOT_EXTENDED</code></li>
</ul>


<hr />


<h2> <a href="#quick-start" name="quick-start" id="quick-start">Quick Start to triggering ErrorDocuments for each Status Code</a> </h2>
<p>Let start with a quick and easy example.  Add the following Redirect rules to your htaccess file, then open your browser and goto each url like <code>yoursite.com/e/400</code>. <em>Don't create an /e/ directory or any files.</em></p>
<pre>Redirect 400 /e/400
Redirect 503 /e/503
Redirect 405 /e/405</pre>
<p> <a href="http://uploads.askapache.com/2007/03/error-400s.png" title="Apache ErrorDocument Results" rel="lb"><img src="http://uploads.askapache.com/2007/03/error-400s.thumbnail.png" alt="Apache ErrorDocument Results" title="error 400s.thumbnail htaccess" /></a> <br /> <a href="http://uploads.askapache.com/2007/03/error-503.png" title="error 503" rel="lb"><img src="http://uploads.askapache.com/2007/03/error-503.thumbnail.png" alt="error 503" title="error 503.thumbnail htaccess" /></a> </p>


<h2> <a href="#automating-the-process" name="automating-the-process" id="automating-the-process">Automate the ErrorDocument Triggering</a> </h2>


<h3> <a href="#redirect-code-in-htaccess" name="redirect-code-in-htaccess" id="redirect-code-in-htaccess">The htaccess Redirects</a> </h3>
<p>When a Status code is encountered, Apache outputs the Header and the ErrorDocument for that error code.  So you can view any Header and the default ErrorDocument, by causing that numerical error code, which is caused by the Status Code.</p>
<p>For instance, if you request a file that doesn't exist, a <strong>404 Not Found</strong> Header is issued and the corresponding ErrorDocument is served with the <strong>404 Not Found</strong> Header.</p>
<pre>Redirect 100 /e/100
Redirect 101 /e/101
Redirect 102 /e/102
Redirect 200 /e/200
Redirect 201 /e/201
Redirect 202 /e/202
Redirect 203 /e/203
Redirect 204 /e/204
Redirect 205 /e/205
Redirect 206 /e/206
Redirect 207 /e/207
Redirect 300 /e/300 http://www.askapache.com/?s=300
Redirect 301 /e/301 http://www.askapache.com/?s=301
Redirect 302 /e/302 http://www.askapache.com/?s=302
Redirect 303 /e/303 http://www.askapache.com/?s=303
Redirect 304 /e/304 http://www.askapache.com/?s=304
Redirect 305 /e/305 http://www.askapache.com/?s=305
Redirect 306 /e/306 http://www.askapache.com/?s=306
Redirect 307 /e/307 http://www.askapache.com/?s=307
Redirect 400 /e/400
Redirect 401 /e/401
Redirect 402 /e/402
Redirect 403 /e/403
Redirect 404 /e/404
Redirect 405 /e/405
Redirect 406 /e/406
Redirect 407 /e/407
Redirect 408 /e/408
Redirect 409 /e/409
Redirect 410 /e/410
Redirect 411 /e/411
Redirect 412 /e/412
Redirect 413 /e/413
Redirect 414 /e/414
Redirect 415 /e/415
Redirect 416 /e/416
Redirect 417 /e/417
Redirect 418 /e/418
Redirect 419 /e/419
Redirect 420 /e/420
Redirect 421 /e/421
Redirect 422 /e/422
Redirect 423 /e/423
Redirect 424 /e/424
Redirect 425 /e/425
Redirect 426 /e/426
Redirect 500 /e/500
Redirect 501 /e/501
Redirect 502 /e/502
Redirect 503 /e/503
Redirect 504 /e/504
Redirect 505 /e/505
Redirect 506 /e/506
Redirect 507 /e/507
Redirect 508 /e/508
Redirect 509 /e/509
Redirect 510 /e/510</pre>


<h3> <a href="#php-header-grabber-script" name="php-header-grabber-script" id="php-header-grabber-script">PHP script that gets and outputs the Headers/Content</a> </h3>
<p>Now all I have to do is add 57 Redirect Directives to my htaccess, and then request each of them 1 at a time from my browser to see the result, and use a packet sniffing program like  <a href="http://wireshark.askapache.com">WireShark</a>  to see the Headers.  Uh, scratch that, that would take way too long!</p>
<p>Instead I hacked up a simple php script using  <a href="http://www.askapache.com/phpbb/sending-post-form-data-with-php-curl.html">cURL</a>  to automate sending GET Requests to each of the 57 Redirect URL-paths. A side benefit of using the php script is that it performs all 57 Requests concurrently and saves each Requests returned headers and content to an output buffer.  After all 57 have been queried, the output buffer is flushed to the browser.</p>
<pre>&lt;?php
$SITENAME=&#039;http://www.askapache.com&#039;;
&nbsp;
$CODES = array(array(&#039;100&#039;,&#039;101&#039;,&#039;102&#039;),
array(&#039;200&#039;,&#039;201&#039;,&#039;202&#039;,&#039;203&#039;,&#039;204&#039;,&#039;205&#039;,&#039;206&#039;,&#039;207&#039;),
array(&#039;300&#039;,&#039;301&#039;,&#039;302&#039;,&#039;303&#039;,&#039;304&#039;,&#039;305&#039;,&#039;306&#039;,&#039;307&#039;),
array(&#039;400&#039;,&#039;401&#039;,&#039;402&#039;,&#039;403&#039;,&#039;404&#039;,&#039;405&#039;,&#039;406&#039;,&#039;407&#039;,&#039;408&#039;,&#039;409&#039;,&#039;410&#039;,&#039;411&#039;,&#039;412&#039;,&#039;413&#039;,
&#039;414&#039;,&#039;415&#039;,&#039;416&#039;,&#039;417&#039;,&#039;418&#039;,&#039;419&#039;,&#039;420&#039;,&#039;421&#039;,&#039;422&#039;,&#039;423&#039;,&#039;424&#039;,&#039;425&#039;,&#039;426&#039;),
array(&#039;500&#039;,&#039;501&#039;,&#039;502&#039;,&#039;503&#039;,&#039;504&#039;,&#039;505&#039;,&#039;506&#039;,&#039;507&#039;,&#039;508&#039;,&#039;509&#039;,&#039;510&#039;));
&nbsp;
$TMPSAVETO=&#039;/tmp/&#039;.time().&#039;.txt&#039;;
&nbsp;
# if file exists then delete it
if(is_file($TMPSAVETO))unlink($TMPSAVETO);
&nbsp;
foreach($CODES as $keyd =&gt; $res)
{
foreach($res as $key)
{
$ch = curl_init("$SITENAME/e/$key");
$fp = fopen ($TMPSAVETO, "a");
curl_setopt ($ch, CURLOPT_FILE, $fp);
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION ,1);
curl_setopt ($ch, CURLOPT_HEADER ,1);
curl_exec ($ch);
curl_close ($ch);
fclose ($fp);
}
}
$OUT=&#039;&#039;;
ob_start();
header ("Content-Type: text/plain;");
readfile($TMPSAVETO);
$OUT=ob_get_clean();
echo $OUT;
unlink($TMPSAVETO);
exit;
?&gt;</pre>


<h2> <a href="#headers-returned-content" id="headers-returned-content">Headers and Content Returned</a> </h2>


<h3> <a href="#status-100" name="status-100" id="status-100">100 Continue</a> </h3>
<pre>HTTP/1.1 100 Continue
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;100 Continue&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Continue&lt;/h1&gt;
&lt;p&gt;The server encountered an internal error or misconfigurationand was unable to complete your request.&lt;/p&gt;
&lt;p&gt;Please contact the server administrator, a@s.com and inform them of the time the error occurred, and anything you might have done that may have caused the error.&lt;/p&gt;
&lt;p&gt;More information about this error may be available in the server error log.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-101" name="status-101" id="status-101">101 Switching Protocols</a> </h3>
<pre>HTTP/1.1 101 Switching Protocols&lt;html&gt;
&lt;head&gt;
&lt;title&gt;101 Switching Protocols&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Switching Protocols&lt;/h1&gt;
&lt;p&gt;The server encountered an internal error or misconfigurationand was unable to complete your request.&lt;/p&gt;
&lt;p&gt;Please contact the server administrator, a@s.com and inform them of the time the error occurred, and anything you might have done that may have caused the error.&lt;/p&gt;
&lt;p&gt;More information about this error may be available in the server error log.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-102" name="status-102" id="status-102">102 Processing</a> </h3>
<pre>HTTP/1.1 102 Processing
X-Pad: avoid browser bug&lt;html&gt;
&lt;head&gt;
&lt;title&gt;102 Processing&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Processing&lt;/h1&gt;
&lt;p&gt;The server encountered an internal error or misconfigurationand was unable to complete your request.&lt;/p&gt;
&lt;p&gt;Please contact the server administrator, a@s.com and inform them of the time the error occurred, and anything you might have done that may have caused the error.&lt;/p&gt;
&lt;p&gt;More information about this error may be available in the server error log.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-200" name="status-200" id="status-200">200 OK</a> </h3>
<pre>HTTP/1.1 200 OK
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;200 OK&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;OK&lt;/h1&gt;
&lt;p&gt;The server encountered an internal error or misconfigurationand was unable to complete your request.&lt;/p&gt;
&lt;p&gt;Please contact the server administrator, a@s.com and inform them of the time the error occurred, and anything you might have done that may have caused the error.&lt;/p&gt;
&lt;p&gt;More information about this error may be available in the server error log.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-201" name="status-201" id="status-201">201 Created</a> </h3>
<pre>HTTP/1.1 201 Created
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;201 Created&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Created&lt;/h1&gt;
&lt;p&gt;The server encountered an internal error or misconfigurationand was unable to complete your request.&lt;/p&gt;
&lt;p&gt;Please contact the server administrator, a@s.com and inform them of the time the error occurred, and anything you might have done that may have caused the error.&lt;/p&gt;
&lt;p&gt;More information about this error may be available in the server error log.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-202" name="status-202" id="status-202">202 Accepted</a> </h3>
<pre>HTTP/1.1 202 Accepted
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;202 Accepted&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Accepted&lt;/h1&gt;
&lt;p&gt;The server encountered an internal error or misconfigurationand was unable to complete your request.&lt;/p&gt;
&lt;p&gt;Please contact the server administrator, a@s.com and inform them of the time the error occurred, and anything you might have done that may have caused the error.&lt;/p&gt;
&lt;p&gt;More information about this error may be available in the server error log.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-203" name="status-203" id="status-203">203 Non-Authoritative Information</a> </h3>
<pre>HTTP/1.1 203 Non-Authoritative Information
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;203 Non-Authoritative Information&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Non-Authoritative Information&lt;/h1&gt;
&lt;p&gt;The server encountered an internal error or misconfigurationand was unable to complete your request.&lt;/p&gt;
&lt;p&gt;Please contact the server administrator, a@s.com and inform them of the time the error occurred, and anything you might have done that may have caused the error.&lt;/p&gt;
&lt;p&gt;More information about this error may be available in the server error log.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-204" name="status-204" id="status-204">204 No Content</a> </h3>
<pre>HTTP/1.1 204 No Content
Content-Type: text/plain; charset=UTF-8
</pre>


<h3> <a href="#status-205" name="status-205" id="status-205">205 Reset Content</a> </h3>
<pre>HTTP/1.1 205 Reset Content&lt;html&gt;
&lt;head&gt;
&lt;title&gt;205 Reset Content&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Reset Content&lt;/h1&gt;
&lt;p&gt;The server encountered an internal error or misconfigurationand was unable to complete your request.&lt;/p&gt;
&lt;p&gt;Please contact the server administrator, a@s.com and inform them of the time the error occurred, and anything you might have done that may have caused the error.&lt;/p&gt;
&lt;p&gt;More information about this error may be available in the server error log.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-206" name="status-206" id="status-206">206 Partial Content</a> </h3>
<pre>HTTP/1.1 206 Partial Content&lt;html&gt;
&lt;head&gt;
&lt;title&gt;206 Partial Content&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Partial Content&lt;/h1&gt;
&lt;p&gt;The server encountered an internal error or misconfigurationand was unable to complete your request.&lt;/p&gt;
&lt;p&gt;Please contact the server administrator, a@s.com and inform them of the time the error occurred, and anything you might have done that may have caused the error.&lt;/p&gt;
&lt;p&gt;More information about this error may be available in the server error log.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-207" name="status-207" id="status-207">207 Multi-Status</a> </h3>
<pre>HTTP/1.1 207 Multi-Status
X-Pad: avoid browser bug&lt;html&gt;
&lt;head&gt;
&lt;title&gt;207 Multi-Status&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Multi-Status&lt;/h1&gt;
&lt;p&gt;The server encountered an internal error or misconfigurationand was unable to complete your request.&lt;/p&gt;
&lt;p&gt;Please contact the server administrator, a@s.com and inform them of the time the error occurred, and anything you might have done that may have caused the error.&lt;/p&gt;
&lt;p&gt;More information about this error may be available in the server error log.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-300" name="status-300" id="status-300">300 Multiple Choices</a> </h3>
<pre>HTTP/1.1 300 Multiple Choices
Location: http://www.askapache.com/?s=300&lt;html&gt;
&lt;head&gt;
&lt;title&gt;300 Multiple Choices&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Multiple Choices&lt;/h1&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-301" name="status-301" id="status-301">301 Moved Permanently</a> </h3>
<pre>HTTP/1.1 301 Moved Permanently
Location: http://www.askapache.com/?s=301&lt;html&gt;
&lt;head&gt;
&lt;title&gt;301 Moved Permanently&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Moved Permanently&lt;/h1&gt;
&lt;p&gt;The document has moved  &lt;a href="http://www.askapache.com/?s=301"&gt;here&lt;/a&gt; .&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-302" name="status-302" id="status-302">302 Found</a> </h3>
<pre>HTTP/1.1 302 Found
Location: http://www.askapache.com/?s=302&lt;html&gt;
&lt;head&gt;
&lt;title&gt;302 Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Found&lt;/h1&gt;
&lt;p&gt;The document has moved  &lt;a href="http://www.askapache.com/?s=302"&gt;here&lt;/a&gt; .&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-303" name="status-303" id="status-303">303 See Other</a> </h3>
<pre>HTTP/1.1 303 See Other
Location: http://www.askapache.com/?s=303&lt;html&gt;
&lt;head&gt;
&lt;title&gt;303 See Other&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;See Other&lt;/h1&gt;
&lt;p&gt;The answer to your request is located  &lt;a href="http://www.askapache.com/?s=303"&gt;here&lt;/a&gt; .&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-304" name="status-304" id="status-304">304 Not Modified</a> </h3>
<pre>HTTP/1.1 304 Not Modified</pre>


<h3> <a href="#status-305" name="status-305" id="status-305">305 Use Proxy</a> </h3>
<pre>HTTP/1.1 305 Use Proxy
Location: http://www.askapache.com/?s=305&lt;html&gt;
&lt;head&gt;
&lt;title&gt;305 Use Proxy&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Use Proxy&lt;/h1&gt;
&lt;p&gt;This resource is only accessible through the proxy
    http://www.askapache.com/?s=305&lt;br /&gt;You will need to configure your client to use that proxy.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-306" name="status-306" id="status-306">306 unused</a> </h3>
<pre>HTTP/1.1 306 unused
Location: http://www.askapache.com/?s=306&lt;html&gt;
&lt;head&gt;
&lt;title&gt;306 unused&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;unused&lt;/h1&gt;
&lt;p&gt;The server encountered an internal error or misconfigurationand was unable to complete your request.&lt;/p&gt;
&lt;p&gt;Please contact the server administrator, a@s.com and inform them of the time the error occurred, and anything you might have done that may have caused the error.&lt;/p&gt;
&lt;p&gt;More information about this error may be available in the server error log.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-307" name="status-307" id="status-307">307 Temporary Redirect</a> </h3>
<pre>HTTP/1.1 307 Temporary Redirect
Location: http://www.askapache.com/?s=307&lt;html&gt;
&lt;head&gt;
&lt;title&gt;307 Temporary Redirect&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Temporary Redirect&lt;/h1&gt;
&lt;p&gt;The document has moved  &lt;a href="http://www.askapache.com/?s=307"&gt;here&lt;/a&gt; .&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-400" name="status-400" id="status-400">400 Bad Request</a> </h3>
<pre>HTTP/1.1 400 Bad Request
Connection: close&lt;html&gt;
&lt;head&gt;
&lt;title&gt;400 Bad Request&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Bad Request&lt;/h1&gt;
&lt;p&gt;Your browser sent a request that this server could not understand.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-401" name="status-401" id="status-401">401 Authorization Required</a> </h3>
<pre>HTTP/1.1 401 Authorization Required&lt;html&gt;
&lt;head&gt;
&lt;title&gt;401 Authorization Required&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Authorization Required&lt;/h1&gt;
&lt;p&gt;This server could not verify that you
    are authorized to access the document
    requested.  Either you supplied the wrong
    credentials (e.g., bad password), or your
    browser doesn&#039;t understand how to supply
    the credentials required.&lt;/p&gt;
&lt;p&gt;Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-402" name="status-402" id="status-402">402 Payment Required</a> </h3>
<pre>HTTP/1.1 402 Payment Required&lt;html&gt;
&lt;head&gt;
&lt;title&gt;402 Payment Required&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Payment Required&lt;/h1&gt;
&lt;p&gt;The server encountered an internal error or misconfigurationand was unable to complete your request.&lt;/p&gt;
&lt;p&gt;Please contact the server administrator, a@s.com and inform them of the time the error occurred, and anything you might have done that may have caused the error.&lt;/p&gt;
&lt;p&gt;More information about this error may be available in the server error log.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-403" name="status-403" id="status-403">403 Forbidden</a> </h3>
<pre>HTTP/1.1 403 Forbidden&lt;html&gt;
&lt;head&gt;
&lt;title&gt;403 Forbidden&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Forbidden&lt;/h1&gt;
&lt;p&gt;You don&#039;t have permission to access /e/403
    on this server.&lt;/p&gt;
&lt;p&gt;Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-404" name="status-404" id="status-404">404 Not Found</a> </h3>
<pre>HTTP/1.1 404 Not Found&lt;html&gt;
&lt;head&gt;
&lt;title&gt;404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Not Found&lt;/h1&gt;
&lt;p&gt;The requested URL /e/404 was not found on this server.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p class="anote"><span>NOTE:</span><br />You will most definately want to check out and use the <a href="http://www.askapache.com/seo/404-google-wordpress-plugin.html" title="404 Error Page WordPress Plugin">Google 404 Error Page</a> if you run WordPress.</p>


<h3> <a href="#status-405" name="status-405" id="status-405">405 Method Not Allowed</a> </h3>
<pre>HTTP/1.1 405 Method Not Allowed
Allow: TRACE
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;405 Method Not Allowed&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Method Not Allowed&lt;/h1&gt;
&lt;p&gt;The requested method GET is not allowed for the URL /e/405.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-406" name="status-406" id="status-406">406 Not Acceptable</a> </h3>
<pre>HTTP/1.1 406 Not Acceptable
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;406 Not Acceptable&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Not Acceptable&lt;/h1&gt;
&lt;p&gt;An appropriate representation of the requested resource /e/406 could not be found on this server.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-407" name="status-407" id="status-407">407 Proxy Authentication Required</a> </h3>
<pre>HTTP/1.1 407 Proxy Authentication Required&lt;html&gt;
&lt;head&gt;
&lt;title&gt;407 Proxy Authentication Required&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Proxy Authentication Required&lt;/h1&gt;
&lt;p&gt;This server could not verify that you
    are authorized to access the document
    requested.  Either you supplied the wrong
    credentials (e.g., bad password), or your
    browser doesn&#039;t understand how to supply
    the credentials required.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-408" name="status-408" id="status-408">408 Request Time-out</a> </h3>
<pre>HTTP/1.1 408 Request Time-out
Connection: close
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;408 Request Time-out&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Request Time-out&lt;/h1&gt;
&lt;p&gt;Server timeout waiting for the HTTP request from the client.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-409" name="status-409" id="status-409">409 Conflict</a> </h3>
<pre>HTTP/1.1 409 Conflict
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;409 Conflict&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Conflict&lt;/h1&gt;
&lt;p&gt;The server encountered an internal error or misconfigurationand was unable to complete your request.&lt;/p&gt;
&lt;p&gt;Please contact the server administrator, a@s.com and inform them of the time the error occurred, and anything you might have done that may have caused the error.&lt;/p&gt;
&lt;p&gt;More information about this error may be available in the server error log.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-410" name="status-410" id="status-410">410 Gone</a> </h3>
<pre>HTTP/1.1 410 Gone
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;410 Gone&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Gone&lt;/h1&gt;
&lt;p&gt;The requested resource&lt;br /&gt;/e/410&lt;br /&gt;is no longer available on this server and there is no forwarding address.
    Please remove all references to this resource.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-411" name="status-411" id="status-411">411 Length Required</a> </h3>
<pre>HTTP/1.1 411 Length Required
Connection: close
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;411 Length Required&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Length Required&lt;/h1&gt;
&lt;p&gt;A request of the requested method GET requires a valid Content-length.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-412" name="status-412" id="status-412">412 Precondition Failed</a> </h3>
<pre>HTTP/1.1 412 Precondition Failed
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;412 Precondition Failed&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Precondition Failed&lt;/h1&gt;
&lt;p&gt;The precondition on the request for the URL /e/412 evaluated to false.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-413" name="status-413" id="status-413">413 Request Entity Too Large</a> </h3>
<pre>HTTP/1.1 413 Request Entity Too Large
Connection: close&lt;html&gt;
&lt;head&gt;
&lt;title&gt;413 Request Entity Too Large&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Request Entity Too Large&lt;/h1&gt;
The requested resource&lt;br /&gt;/e/413&lt;br /&gt;does not allow request data with GET requests, or the amount of data provided in
the request exceeds the capacity limit.
&lt;/body&gt;
&lt;/html&gt;</pre>

<h3> <a href="#status-414" name="status-414" id="status-414">414 Request-URI Too Large</a> </h3>
<pre>HTTP/1.1 414 Request-URI Too Large
Connection: close&lt;html&gt;
&lt;head&gt;
&lt;title&gt;414 Request-URI Too Large&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Request-URI Too Large&lt;/h1&gt;
&lt;p&gt;The requested URL&#039;s length exceeds the capacity
    limit for this server.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-415" name="status-415" id="status-415">415 Unsupported Media Type</a> </h3>
<pre>HTTP/1.1 415 Unsupported Media Type&lt;html&gt;
&lt;head&gt;
&lt;title&gt;415 Unsupported Media Type&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Unsupported Media Type&lt;/h1&gt;
&lt;p&gt;The supplied request data is not in a format
    acceptable for processing by this resource.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-416" name="status-416" id="status-416">416 Requested Range Not Satisfiable</a> </h3>
<pre>HTTP/1.1 416 Requested Range Not Satisfiable</pre>


<h3> <a href="#status-417" name="status-417" id="status-417">417 Expectation Failed</a> </h3>
<pre>HTTP/1.1 417 Expectation Failed&lt;html&gt;
&lt;head&gt;
&lt;title&gt;417 Expectation Failed&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Expectation Failed&lt;/h1&gt;
&lt;p&gt;The expectation given in the Expect request-header
    field could not be met by this server.&lt;/p&gt;
&lt;p&gt;The client sent&lt;pre&gt;
    Expect: &lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-418" name="status-418" id="status-418">418 I'm a teapot</a> </h3>
<pre>HTTP/1.1 418 I&#039;m a teapot&lt;html&gt;
&lt;head&gt;
&lt;title&gt;418 I&#039;m a teapot&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;I&#039;m a teapot&lt;/h1&gt;
&lt;p&gt;Unfortunately this coffee machine is out of coffee.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-419" name="status-419" id="status-419">419 unused</a> </h3>
<pre>HTTP/1.1 419 unused&lt;html&gt;
&lt;head&gt;
&lt;title&gt;419 unused&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;unused&lt;/h1&gt;
&lt;p&gt;The server encountered an internal error or misconfigurationand was unable to complete your request.&lt;/p&gt;
&lt;p&gt;Please contact the server administrator, a@s.com and inform them of the time the error occurred, and anything you might have done that may have caused the error.&lt;/p&gt;
&lt;p&gt;More information about this error may be available in the server error log.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-420" name="status-420" id="status-420">420 unused</a> </h3>
<pre>HTTP/1.1 420 unused&lt;html&gt;
&lt;head&gt;
&lt;title&gt;420 unused&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;unused&lt;/h1&gt;
&lt;p&gt;The server encountered an internal error or misconfigurationand was unable to complete your request.&lt;/p&gt;
&lt;p&gt;Please contact the server administrator, a@s.com and inform them of the time the error occurred, and anything you might have done that may have caused the error.&lt;/p&gt;
&lt;p&gt;More information about this error may be available in the server error log.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-421" name="status-421" id="status-421">421 unused</a> </h3>
<pre>HTTP/1.1 421 unused&lt;html&gt;
&lt;head&gt;
&lt;title&gt;421 unused&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;unused&lt;/h1&gt;
&lt;p&gt;The server encountered an internal error or misconfigurationand was unable to complete your request.&lt;/p&gt;
&lt;p&gt;Please contact the server administrator, a@s.com and inform them of the time the error occurred, and anything you might have done that may have caused the error.&lt;/p&gt;
&lt;p&gt;More information about this error may be available in the server error log.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-422" name="status-422" id="status-422">422 Unprocessable Entity</a> </h3>
<pre>HTTP/1.1 422 Unprocessable Entity&lt;html&gt;
&lt;head&gt;
&lt;title&gt;422 Unprocessable Entity&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Unprocessable Entity&lt;/h1&gt;
&lt;p&gt;The server understands the media type of the
    request entity, but was unable to process the
    contained instructions.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-423" name="status-423" id="status-423">423 Locked</a> </h3>
<pre>HTTP/1.1 423 Locked&lt;html&gt;
&lt;head&gt;
&lt;title&gt;423 Locked&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Locked&lt;/h1&gt;
&lt;p&gt;The requested resource is currently locked.
    The lock must be released or proper identification
    given before the method can be applied.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-424" name="status-424" id="status-424">424 Failed Dependency</a> </h3>
<pre>HTTP/1.1 424 Failed Dependency&lt;html&gt;
&lt;head&gt;
&lt;title&gt;424 Failed Dependency&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Failed Dependency&lt;/h1&gt;
&lt;p&gt;The method could not be performed on the resource
    because the requested action depended on another
    action and that other action failed.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-425" name="status-425" id="status-425">425 No code</a> </h3>
<pre>HTTP/1.1 425 No code&lt;html&gt;
&lt;head&gt;
&lt;title&gt;425 No code&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;No code&lt;/h1&gt;
&lt;p&gt;The server encountered an internal error or misconfigurationand was unable to complete your request.&lt;/p&gt;
&lt;p&gt;Please contact the server administrator, a@s.com and inform them of the time the error occurred, and anything you might have done that may have caused the error.&lt;/p&gt;
&lt;p&gt;More information about this error may be available in the server error log.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-426" name="status-426" id="status-426">426 Upgrade Required</a> </h3>
<pre>HTTP/1.1 426 Upgrade Required&lt;html&gt;
&lt;head&gt;
&lt;title&gt;426 Upgrade Required&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Upgrade Required&lt;/h1&gt;
&lt;p&gt;The requested resource can only be retrieved
    using SSL.  The server is willing to upgrade the current
    connection to SSL, but your client doesn&#039;t support it.
    Either upgrade your client, or try requesting the page
    using https:// &lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-500" name="status-500" id="status-500">500 Internal Server Error</a> </h3>
<pre>HTTP/1.1 500 Internal Server Error
Connection: close&lt;html&gt;
&lt;head&gt;
&lt;title&gt;500 Internal Server Error&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Internal Server Error&lt;/h1&gt;
&lt;p&gt;The server encountered an internal error or misconfigurationand was unable to complete your request.&lt;/p&gt;
&lt;p&gt;Please contact the server administrator, a@s.com and inform them of the time the error occurred, and anything you might have done that may have caused the error.&lt;/p&gt;
&lt;p&gt;More information about this error may be available in the server error log.&lt;/p&gt;
&lt;p&gt;Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-501" name="status-501" id="status-501">501 Method Not Implemented</a> </h3>
<pre>HTTP/1.1 501 Method Not Implemented
Allow: TRACE
Connection: close&lt;html&gt;
&lt;head&gt;
&lt;title&gt;501 Method Not Implemented&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Method Not Implemented&lt;/h1&gt;
&lt;p&gt;GET to /e/501 not supported.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-502" name="status-502" id="status-502">502 Bad Gateway</a> </h3>
<pre>HTTP/1.1 502 Bad Gateway
X-Pad: avoid browser bug&lt;html&gt;
&lt;head&gt;
&lt;title&gt;502 Bad Gateway&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Bad Gateway&lt;/h1&gt;
&lt;p&gt;The proxy server received an invalid
    response from an upstream server.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-503" name="status-503" id="status-503">503 Service Temporarily Unavailable</a> </h3>
<pre>HTTP/1.1 503 Service Temporarily Unavailable
Connection: close&lt;html&gt;
&lt;head&gt;
&lt;title&gt;503 Service Temporarily Unavailable&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Service Temporarily Unavailable&lt;/h1&gt;
&lt;p&gt;The server is temporarily unable to service your
    request due to maintenance downtime or capacity
    problems. Please try again later.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-504" name="status-504" id="status-504">504 Gateway Time-out</a> </h3>
<pre>HTTP/1.1 504 Gateway Time-out&lt;html&gt;
&lt;head&gt;
&lt;title&gt;504 Gateway Time-out&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Gateway Time-out&lt;/h1&gt;
&lt;p&gt;The proxy server did not receive a timely response
    from the upstream server.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-505" name="status-505" id="status-505">505 HTTP Version Not Supported</a> </h3>
<pre>HTTP/1.1 505 HTTP Version Not Supported&lt;html&gt;
&lt;head&gt;
&lt;title&gt;505 HTTP Version Not Supported&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;HTTP Version Not Supported&lt;/h1&gt;
&lt;p&gt;The server encountered an internal error or misconfigurationand was unable to complete your request.&lt;/p&gt;
&lt;p&gt;Please contact the server administrator, a@s.com and inform them of the time the error occurred, and anything you might have done that may have caused the error.&lt;/p&gt;
&lt;p&gt;More information about this error may be available in the server error log.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-506" name="status-506" id="status-506">506 Variant Also Negotiates</a> </h3>
<pre>HTTP/1.1 506 Variant Also Negotiates&lt;html&gt;
&lt;head&gt;
&lt;title&gt;506 Variant Also Negotiates&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Variant Also Negotiates&lt;/h1&gt;
&lt;p&gt;A variant for the requested resource
    &lt;pre&gt;
    /e/506
    &lt;/pre&gt;
    is itself a negotiable resource. This indicates a configuration error.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-507" name="status-507" id="status-507">507 Insufficient Storage</a> </h3>
<pre>HTTP/1.1 507 Insufficient Storage&lt;html&gt;
&lt;head&gt;
&lt;title&gt;507 Insufficient Storage&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Insufficient Storage&lt;/h1&gt;
&lt;p&gt;The method could not be performed on the resource
    because the server is unable to store the
    representation needed to successfully complete the
    request.  There is insufficient free space left in
    your storage allocation.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-508" name="status-508" id="status-508">508 unused</a> </h3>
<pre>HTTP/1.1 508 unused&lt;html&gt;
&lt;head&gt;
&lt;title&gt;508 unused&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;unused&lt;/h1&gt;
&lt;p&gt;The server encountered an internal error or misconfigurationand was unable to complete your request.&lt;/p&gt;
&lt;p&gt;Please contact the server administrator, a@s.com and inform them of the time the error occurred, and anything you might have done that may have caused the error.&lt;/p&gt;
&lt;p&gt;More information about this error may be available in the server error log.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-509" name="status-509" id="status-509">509 unused</a> </h3>
<pre>HTTP/1.1 509 unused
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;509 unused&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;unused&lt;/h1&gt;
&lt;p&gt;The server encountered an internal error or misconfigurationand was unable to complete your request.&lt;/p&gt;
&lt;p&gt;Please contact the server administrator, a@s.com and inform them of the time the error occurred, and anything you might have done that may have caused the error.&lt;/p&gt;
&lt;p&gt;More information about this error may be available in the server error log.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h3> <a href="#status-510" name="status-510" id="status-510">510 Not Extended</a> </h3>
<pre>HTTP/1.1 510 Not Extended
X-Pad: avoid browser bug
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;510 Not Extended&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Not Extended&lt;/h1&gt;
&lt;p&gt;A mandatory extension policy in the request is not
    accepted by the server for this resource.&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>


<h2> <a href="#apache-source-code" name="apache-source-code" id="apache-source-code">Apache Source Code</a> </h2>


<h3> <a href="#httpdh-h" name="httpdh-h" id="httpdh-h">httpd.h</a> </h3>
<p>From <a href="http://uploads.askapache.com/2007/02/httpd.h" title="httpd.h Apache">httpd.h</a> </p>
<pre>/**
* The size of the static array in http_protocol.c for storing
* all of the potential response status-lines (a sparse table).
* A future version should dynamically generate the apr_table_t at startup.
*/
#define RESPONSE_CODES 57
#define HTTP_CONTINUE            100
#define HTTP_SWITCHING_PROTOCOLS       101
#define HTTP_PROCESSING          102
#define HTTP_OK              200
#define HTTP_CREATED             201
#define HTTP_ACCEPTED            202
#define HTTP_NON_AUTHORITATIVE       203
#define HTTP_NO_CONTENT          204
#define HTTP_RESET_CONTENT         205
#define HTTP_PARTIAL_CONTENT         206
#define HTTP_MULTI_STATUS          207
#define HTTP_MULTIPLE_CHOICES        300
#define HTTP_MOVED_PERMANENTLY       301
&nbsp;
#define HTTP_MOVED_TEMPORARILY       302
#define HTTP_SEE_OTHER           303
#define HTTP_NOT_MODIFIED          304
#define HTTP_USE_PROXY           305
#define HTTP_TEMPORARY_REDIRECT      307
#define HTTP_BAD_REQUEST           400
#define HTTP_UNAUTHORIZED          401
#define HTTP_PAYMENT_REQUIRED        402
#define HTTP_FORBIDDEN           403
#define HTTP_NOT_FOUND           404
#define HTTP_METHOD_NOT_ALLOWED      405
#define HTTP_NOT_ACCEPTABLE        406
#define HTTP_PROXY_AUTHENTICATION_REQUIRED 407
#define HTTP_REQUEST_TIME_OUT        408
#define HTTP_CONFLICT            409
#define HTTP_GONE              410
#define HTTP_LENGTH_REQUIRED         411
#define HTTP_PRECONDITION_FAILED       412
#define HTTP_REQUEST_ENTITY_TOO_LARGE    413
#define HTTP_REQUEST_URI_TOO_LARGE     414
#define HTTP_UNSUPPORTED_MEDIA_TYPE    415
#define HTTP_RANGE_NOT_SATISFIABLE     416
#define HTTP_EXPECTATION_FAILED      417
#define HTTP_UNPROCESSABLE_ENTITY      422
#define HTTP_LOCKED            423
#define HTTP_FAILED_DEPENDENCY       424
#define HTTP_UPGRADE_REQUIRED        426
#define HTTP_INTERNAL_SERVER_ERROR     500
#define HTTP_NOT_IMPLEMENTED         501
#define HTTP_BAD_GATEWAY           502
#define HTTP_SERVICE_UNAVAILABLE       503
#define HTTP_GATEWAY_TIME_OUT        504
#define HTTP_VERSION_NOT_SUPPORTED     505
#define HTTP_VARIANT_ALSO_VARIES       506
#define HTTP_INSUFFICIENT_STORAGE      507
#define HTTP_NOT_EXTENDED          510
&nbsp;
/** is the status code informational */
#define ap_is_HTTP_INFO(x)     (((x) &gt;= 100)&amp;&amp;((x) &lt; 200))
/** is the status code OK ?*/
#define ap_is_HTTP_SUCCESS(x)    (((x) &gt;= 200)&amp;&amp;((x) &lt; 300))
/** is the status code a redirect */
#define ap_is_HTTP_REDIRECT(x)   (((x) &gt;= 300)&amp;&amp;((x) &lt; 400))
/** is the status code a error (client or server) */
#define ap_is_HTTP_ERROR(x)    (((x) &gt;= 400)&amp;&amp;((x) &lt; 600))
/** is the status code a client error  */
#define ap_is_HTTP_CLIENT_ERROR(x) (((x) &gt;= 400)&amp;&amp;((x) &lt; 500))
/** is the status code a server error  */
#define ap_is_HTTP_SERVER_ERROR(x) (((x) &gt;= 500)&amp;&amp;((x) &lt; 600))
/** is the status code a (potentially) valid response code?  */
#define ap_is_HTTP_VALID_RESPONSE(x) (((x) &gt;= 100)&amp;&amp;((x) &lt; 600))
&nbsp;
/** should the status code drop the connection */
#define ap_status_drops_connection(x) \
(((x) == HTTP_BAD_REQUEST)       || \
((x) == HTTP_REQUEST_TIME_OUT)    || \
((x) == HTTP_LENGTH_REQUIRED)     || \
((x) == HTTP_REQUEST_ENTITY_TOO_LARGE) || \
((x) == HTTP_REQUEST_URI_TOO_LARGE) || \
((x) == HTTP_INTERNAL_SERVER_ERROR) || \
((x) == HTTP_SERVICE_UNAVAILABLE) || \
((x) == HTTP_NOT_IMPLEMENTED))</pre>


<h4>HTTP_INFO</h4>
<p><strong>Is the status code (x) informational?</strong></p>
<pre>x &gt;= 100 &amp;&amp; x &lt; 200</pre>


<h4>HTTP_SUCCESS</h4>
<p><strong>Is the status code (x) OK?</strong></p>
<pre>x &gt;= 200 &amp;&amp; x &lt; 300</pre>


<h4>HTTP_REDIRECT</h4>
<p><strong>Is the status code (x) a redirect?</strong></p>
<pre>x &gt;= 300 &amp;&amp; x &lt; 400</pre>


<h4>HTTP_ERROR</h4>
<p><strong>Is the status code (x) a error (client or server)?</strong></p>
<pre>x &gt;= 400 &amp;&amp; x &lt; 600</pre>


<h4>HTTP_CLIENT_ERROR</h4>
<p><strong>Is the status code (x) a client error?</strong></p>
<pre>x &gt;= 400 &amp;&amp; x &lt; 500</pre>


<h4>HTTP_SERVER_ERROR</h4>
<p><strong>Is the status code (x) a server error?</strong></p>
<pre>x &gt;= 500 &amp;&amp; x &lt; 600</pre>


<h4>HTTP_VALID_RESPONSE</h4>
<p><strong>Is the status code (x) a (potentially) valid response code?</strong></p>
<pre>x &gt;= 100 &amp;&amp; x &lt; 600</pre>


<h3> <a href="#http_protocol-c" name="http_protocol-c" id="http_protocol-c">http_protocol.c</a> </h3>
<p>From <a href="http://uploads.askapache.com/2007/02/http_protocol.c" title="http_protocol.c">http_protocol.c</a> </p>
<pre>static const char * status_lines[RESPONSE_CODES] =
static const char * const status_lines[RESPONSE_CODES] =
"100 Continue",
"101 Switching Protocols",
"102 Processing",
"200 OK",
"201 Created",
"202 Accepted",
"203 Non-Authoritative Information",
"204 No Content",
"205 Reset Content",
"206 Partial Content",
"207 Multi-Status",
"300 Multiple Choices",
"301 Moved Permanently",
"302 Found",
"303 See Other",
"304 Not Modified",
"305 Use Proxy",
"306 unused",
"307 Temporary Redirect",
"400 Bad Request",
"401 Authorization Required",
"402 Payment Required",
"403 Forbidden",
"404 Not Found",
"405 Method Not Allowed",
"406 Not Acceptable",
"407 Proxy Authentication Required",
"408 Request Time-out",
"409 Conflict",
"410 Gone",
"411 Length Required",
"412 Precondition Failed",
"413 Request Entity Too Large",
"414 Request-URI Too Large",
"415 Unsupported Media Type",
"416 Requested Range Not Satisfiable",
"417 Expectation Failed",
"418 unused",
"419 unused",
"420 unused",
"421 unused",
"422 Unprocessable Entity",
"423 Locked",
"424 Failed Dependency",
"425 No code",
"426 Upgrade Required",
"500 Internal Server Error",
"501 Method Not Implemented",
"502 Bad Gateway",
"503 Service Temporarily Unavailable",
"504 Gateway Time-out",
"505 HTTP Version Not Supported",
"506 Variant Also Negotiates",
"507 Insufficient Storage",
"508 unused",
"509 unused",
"510 Not Extended"</pre>


<h2>IANA HTTP Status Code Registry</h2>
<table cellpadding="3" cellspacing="0">
    <thead>
        <tr>
            <th>Value</th>
            <th>Description</th>
            <th>Reference</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>100</td>
            <td>Continue</td>
            <td> <a href="#RFC2616"><cite title="Hypertext Transfer Protocol -- HTTP/1.1">[RFC2616]</cite></a> , <a href="http://rfc.askapache.com/rfc2616#section-10.1.1">Section 10.1.1</a> </td>
        </tr>
        <tr>
            <td>101</td>
            <td>Switching Protocols</td>
            <td> <a href="#RFC2616"><cite title="Hypertext Transfer Protocol -- HTTP/1.1">[RFC2616]</cite></a> , <a href="http://rfc.askapache.com/rfc2616#section-10.1.2">Section 10.1.2</a> </td>
        </tr>
        <tr>
            <td>102</td>
            <td>Processing</td>
            <td> <a href="#RFC2518"><cite title="HTTP Extensions for Distributed Authoring -- WEBDAV">[RFC2518]</cite></a> , <a href="http://rfc.askapache.com/rfc2518#section-10.1">Section 10.1</a> </td>
        </tr>
        <tr>
            <td>200</td>
            <td>OK</td>
            <td> <a href="#RFC2616"><cite title="Hypertext Transfer Protocol -- HTTP/1.1">[RFC2616]</cite></a> , <a href="http://rfc.askapache.com/rfc2616#section-10.2.1">Section 10.2.1</a> </td>
        </tr>
        <tr>
            <td>201</td>
            <td>Created</td>
            <td> <a href="#RFC2616"><cite title="Hypertext Transfer Protocol -- HTTP/1.1">[RFC2616]</cite></a> , <a href="http://rfc.askapache.com/rfc2616#section-10.2.2">Section 10.2.2</a> </td>
        </tr>
        <tr>
            <td>202</td>
            <td>Accepted</td>
            <td> <a href="#RFC2616"><cite title="Hypertext Transfer Protocol -- HTTP/1.1">[RFC2616]</cite></a> , <a href="http://rfc.askapache.com/rfc2616#section-10.2.3">Section 10.2.3</a> </td>
        </tr>
        <tr>
            <td>203</td>
            <td>Non-Authoritative Information</td>
            <td> <a href="#RFC2616"><cite title="Hypertext Transfer Protocol -- HTTP/1.1">[RFC2616]</cite></a> , <a href="http://rfc.askapache.com/rfc2616#section-10.2.4">Section 10.2.4</a> </td>
        </tr>
        <tr>
            <td>204</td>
            <td>No Content</td>
            <td> <a href="#RFC2616"><cite title="Hypertext Transfer Protocol -- HTTP/1.1">[RFC2616]</cite></a> , <a href="http://rfc.askapache.com/rfc2616#section-10.2.5">Section 10.2.5</a> </td>
        </tr>
        <tr>
            <td>205</td>
            <td>Reset Content</td>
            <td> <a href="#RFC2616"><cite title="Hypertext Transfer Protocol -- HTTP/1.1">[RFC2616]</cite></a> , <a href="http://rfc.askapache.com/rfc2616#section-10.2.6">Section 10.2.6</a> </td>
        </tr>
        <tr>
            <td>206</td>
            <td>Partial Content</td>
            <td> <a href="#RFC2616"><cite title="Hypertext Transfer Protocol -- HTTP/1.1">[RFC2616]</cite></a> , <a href="http://rfc.askapache.com/rfc2616#section-10.2.7">Section 10.2.7</a> </td>
        </tr>
        <tr>
            <td>207</td>
            <td>Multi-Status</td>
            <td> <a href="#RFC4918"><cite title="HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)">[RFC4918]</cite></a> , <a href="http://rfc.askapache.com/rfc4918#section-11.1">Section 11.1</a> </td>
        </tr>
        <tr>
            <td>226</td>
            <td>IM Used</td>
            <td> <a href="#RFC3229"><cite title="Delta encoding in HTTP">[RFC3229]</cite></a> , <a href="http://rfc.askapache.com/rfc3229#section-10.4.1">Section 10.4.1</a> </td>
        </tr>
        <tr>
            <td>300</td>
            <td>Multiple Choices</td>
            <td> <a href="#RFC2616"><cite title="Hypertext Transfer Protocol -- HTTP/1.1">[RFC2616]</cite></a> , <a href="http://rfc.askapache.com/rfc2616#section-10.3.1">Section 10.3.1</a> </td>
        </tr>
        <tr>
            <td>301</td>
            <td>Moved Permanently</td>
            <td> <a href="#RFC2616"><cite title="Hypertext Transfer Protocol -- HTTP/1.1">[RFC2616]</cite></a> , <a href="http://rfc.askapache.com/rfc2616#section-10.3.2">Section 10.3.2</a> </td>
        </tr>
        <tr>
            <td>302</td>
            <td>Found</td>
            <td> <a href="#RFC2616"><cite title="Hypertext Transfer Protocol -- HTTP/1.1">[RFC2616]</cite></a> , <a href="http://rfc.askapache.com/rfc2616#section-10.3.3">Section 10.3.3</a> </td>
        </tr>
        <tr>
            <td>303</td>
            <td>See Other</td>
            <td> <a href="#RFC2616"><cite title="Hypertext Transfer Protocol -- HTTP/1.1">[RFC2616]</cite></a> , <a href="http://rfc.askapache.com/rfc2616#section-10.3.4">Section 10.3.4</a> </td>
        </tr>
        <tr>
            <td>304</td>
            <td>Not Modified</td>
            <td> <a href="#RFC2616"><cite title="Hypertext Transfer Protocol -- HTTP/1.1">[RFC2616]</cite></a> , <a href="http://rfc.askapache.com/rfc2616#section-10.3.5">Section 10.3.5</a> </td>
        </tr>
        <tr>
            <td>305</td>
            <td>Use Proxy</td>
            <td> <a href="#RFC2616"><cite title="Hypertext Transfer Protocol -- HTTP/1.1">[RFC2616]</cite></a> , <a href="http://rfc.askapache.com/rfc2616#section-10.3.6">Section 10.3.6</a> </td>
        </tr>
        <tr>
            <td>306</td>
            <td>(Reserved)</td>
            <td> <a href="#RFC2616"><cite title="Hypertext Transfer Protocol -- HTTP/1.1">[RFC2616]</cite></a> , <a href="http://rfc.askapache.com/rfc2616#section-10.3.7">Section 10.3.7</a> </td>
        </tr>
        <tr>
            <td>307</td>
            <td>Temporary Redirect</td>
            <td> <a href="#RFC2616"><cite title="Hypertext Transfer Protocol -- HTTP/1.1">[RFC2616]</cite></a> , <a href="http://rfc.askapache.com/rfc2616#section-10.3.8">Section 10.3.8</a> </td>
        </tr>
        <tr>
            <td>400</td>
            <td>Bad Request</td>
            <td> <a href="#RFC2616"><cite title="Hypertext Transfer Protocol -- HTTP/1.1">[RFC2616]</cite></a> , <a href="http://rfc.askapache.com/rfc2616#section-10.4.1">Section 10.4.1</a> </td>
        </tr>
        <tr>
            <td>401</td>
            <td>Unauthorized</td>
            <td> <a href="#RFC2616"><cite title="Hypertext Transfer Protocol -- HTTP/1.1">[RFC2616]</cite></a> , <a href="http://rfc.askapache.com/rfc2616#section-10.4.2">Section 10.4.2</a> </td>
        </tr>
        <tr>
            <td>402</td>
            <td>Payment Required</td>
            <td> <a href="#RFC2616"><cite title="Hypertext Transfer Protocol -- HTTP/1.1">[RFC2616]</cite></a> , <a href="http://rfc.askapache.com/rfc2616#section-10.4.3">Section 10.4.3</a> </td>
        </tr>
        <tr>
            <td>403</td>
            <td>Forbidden</td>
            <td> <a href="#RFC2616"><cite title="Hypertext Transfer Protocol -- HTTP/1.1">[RFC2616]</cite></a> , <a href="http://rfc.askapache.com/rfc2616#section-10.4.4">Section 10.4.4</a> </td>
        </tr>
        <tr>
            <td>404</td>
            <td>Not Found</td>
            <td> <a href="#RFC2616"><cite title="Hypertext Transfer Protocol -- HTTP/1.1">[RFC2616]</cite></a> , <a href="http://rfc.askapache.com/rfc2616#section-10.4.5">Section 10.4.5</a> </td>
        </tr>
        <tr>
            <td>405</td>
            <td>Method Not Allowed</td>
            <td> <a href="#RFC2616"><cite title="Hypertext Transfer Protocol -- HTTP/1.1">[RFC2616]</cite></a> , <a href="http://rfc.askapache.com/rfc2616#section-10.4.6">Section 10.4.6</a> </td>
        </tr>
        <tr>
            <td>406</td>
            <td>Not Acceptable</td>
            <td> <a href="#RFC2616"><cite title="Hypertext Transfer Protocol -- HTTP/1.1">[RFC2616]</cite></a> , <a href="http://rfc.askapache.com/rfc2616#section-10.4.7">Section 10.4.7</a> </td>
        </tr>
        <tr>
            <td>407</td>
            <td>Proxy Authentication Required</td>
            <td> <a href="#RFC2616"><cite title="Hypertext Transfer Protocol -- HTTP/1.1">[RFC2616]</cite></a> , <a href="http://rfc.askapache.com/rfc2616#section-10.4.8">Section 10.4.8</a> </td>
        </tr>
        <tr>
            <td>408</td>
            <td>Request Timeout</td>
            <td> <a href="#RFC2616"><cite title="Hypertext Transfer Protocol -- HTTP/1.1">[RFC2616]</cite></a> , <a href="http://rfc.askapache.com/rfc2616#section-10.4.9">Section 10.4.9</a> </td>
        </tr>
        <tr>
            <td>409</td>
            <td>Conflict</td>
            <td> <a href="#RFC2616"><cite title="Hypertext Transfer Protocol -- HTTP/1.1">[RFC2616]</cite></a> , <a href="http://rfc.askapache.com/rfc2616#section-10.4.10">Section 10.4.10</a> </td>
        </tr>
        <tr>
            <td>410</td>
            <td>Gone</td>
            <td> <a href="#RFC2616"><cite title="Hypertext Transfer Protocol -- HTTP/1.1">[RFC2616]</cite></a> , <a href="http://rfc.askapache.com/rfc2616#section-10.4.11">Section 10.4.11</a> </td>
        </tr>
        <tr>
            <td>411</td>
            <td>Length Required</td>
            <td> <a href="#RFC2616"><cite title="Hypertext Transfer Protocol -- HTTP/1.1">[RFC2616]</cite></a> , <a href="http://rfc.askapache.com/rfc2616#section-10.4.12">Section 10.4.12</a> </td>
        </tr>
        <tr>
            <td>412</td>
            <td>Precondition Failed</td>
            <td> <a href="#RFC2616"><cite title="Hypertext Transfer Protocol -- HTTP/1.1">[RFC2616]</cite></a> , <a href="http://rfc.askapache.com/rfc2616#section-10.4.13">Section 10.4.13</a> </td>
        </tr>
        <tr>
            <td>413</td>
            <td>Request Entity Too Large</td>
            <td> <a href="#RFC2616"><cite title="Hypertext Transfer Protocol -- HTTP/1.1">[RFC2616]</cite></a> , <a href="http://rfc.askapache.com/rfc2616#section-10.4.14">Section 10.4.14</a> </td>
        </tr>
        <tr>
            <td>414</td>
            <td>Request-URI Too Long</td>
            <td> <a href="#RFC2616"><cite title="Hypertext Transfer Protocol -- HTTP/1.1">[RFC2616]</cite></a> , <a href="http://rfc.askapache.com/rfc2616#section-10.4.15">Section 10.4.15</a> </td>
        </tr>
        <tr>
            <td>415</td>
            <td>Unsupported Media Type</td>
            <td> <a href="#RFC2616"><cite title="Hypertext Transfer Protocol -- HTTP/1.1">[RFC2616]</cite></a> , <a href="http://rfc.askapache.com/rfc2616#section-10.4.16">Section 10.4.16</a> </td>
        </tr>
        <tr>
            <td>416</td>
            <td>Requested Range Not Satisfiable</td>
            <td> <a href="#RFC2616"><cite title="Hypertext Transfer Protocol -- HTTP/1.1">[RFC2616]</cite></a> , <a href="http://rfc.askapache.com/rfc2616#section-10.4.17">Section 10.4.17</a> </td>
        </tr>
        <tr>
            <td>417</td>
            <td>Expectation Failed</td>
            <td> <a href="#RFC2616"><cite title="Hypertext Transfer Protocol -- HTTP/1.1">[RFC2616]</cite></a> , <a href="http://rfc.askapache.com/rfc2616#section-10.4.18">Section 10.4.18</a> </td>
        </tr>
        <tr>
            <td>422</td>
            <td>Unprocessable Entity</td>
            <td> <a href="#RFC4918"><cite title="HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)">[RFC4918]</cite></a> , <a href="http://rfc.askapache.com/rfc4918#section-11.2">Section 11.2</a> </td>
        </tr>
        <tr>
            <td>423</td>
            <td>Locked</td>
            <td> <a href="#RFC4918"><cite title="HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)">[RFC4918]</cite></a> , <a href="http://rfc.askapache.com/rfc4918#section-11.3">Section 11.3</a> </td>
        </tr>
        <tr>
            <td>424</td>
            <td>Failed Dependency</td>
            <td> <a href="#RFC4918"><cite title="HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)">[RFC4918]</cite></a> , <a href="http://rfc.askapache.com/rfc4918#section-11.4">Section 11.4</a> </td>
        </tr>
        <tr>
            <td>426</td>
            <td>Upgrade Required</td>
            <td> <a href="#RFC2817"><cite title="Upgrading to TLS Within HTTP/1.1">[RFC2817]</cite></a> , <a href="http://rfc.askapache.com/rfc2817#section-6">Section 6</a> </td>
        </tr>
        <tr>
            <td>500</td>
            <td>Internal Server Error</td>
            <td> <a href="#RFC2616"><cite title="Hypertext Transfer Protocol -- HTTP/1.1">[RFC2616]</cite></a> , <a href="http://rfc.askapache.com/rfc2616#section-10.5.1">Section 10.5.1</a> </td>
        </tr>
        <tr>
            <td>501</td>
            <td>Not Implemented</td>
            <td> <a href="#RFC2616"><cite title="Hypertext Transfer Protocol -- HTTP/1.1">[RFC2616]</cite></a> , <a href="http://rfc.askapache.com/rfc2616#section-10.5.2">Section 10.5.2</a> </td>
        </tr>
        <tr>
            <td>502</td>
            <td>Bad Gateway</td>
            <td> <a href="#RFC2616"><cite title="Hypertext Transfer Protocol -- HTTP/1.1">[RFC2616]</cite></a> , <a href="http://rfc.askapache.com/rfc2616#section-10.5.3">Section 10.5.3</a> </td>
        </tr>
        <tr>
            <td>503</td>
            <td>Service Unavailable</td>
            <td> <a href="#RFC2616"><cite title="Hypertext Transfer Protocol -- HTTP/1.1">[RFC2616]</cite></a> , <a href="http://rfc.askapache.com/rfc2616#section-10.5.4">Section 10.5.4</a> </td>
        </tr>
        <tr>
            <td>504</td>
            <td>Gateway Timeout</td>
            <td> <a href="#RFC2616"><cite title="Hypertext Transfer Protocol -- HTTP/1.1">[RFC2616]</cite></a> , <a href="http://rfc.askapache.com/rfc2616#section-10.5.5">Section 10.5.5</a> </td>
        </tr>
        <tr>
            <td>505</td>
            <td>HTTP Version Not Supported</td>
            <td> <a href="#RFC2616"><cite title="Hypertext Transfer Protocol -- HTTP/1.1">[RFC2616]</cite></a> , <a href="http://rfc.askapache.com/rfc2616#section-10.5.6">Section 10.5.6</a> </td>
        </tr>
        <tr>
            <td>506</td>
            <td>Variant Also Negotiates</td>
            <td> <a href="#RFC2295"><cite title="Transparent Content Negotiation in HTTP">[RFC2295]</cite></a> , <a href="http://rfc.askapache.com/rfc2295#section-8.1">Section 8.1</a> </td>
        </tr>
        <tr>
            <td>507</td>
            <td>Insufficient Storage</td>
            <td> <a href="#RFC4918"><cite title="HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)">[RFC4918]</cite></a> , <a href="http://rfc.askapache.com/rfc4918#section-11.5">Section 11.5</a> </td>
        </tr>
        <tr>
            <td>510</td>
            <td>Not Extended</td>
            <td> <a href="#RFC2774"><cite title="An HTTP Extension Framework">[RFC2774]</cite></a> , <a href="http://rfc.askapache.com/rfc2774#section-7">Section 7</a> </td>
        </tr>
    </tbody>
</table>


<h2>WordPress 2.8 Changes</h2>
<p>I just learned that <a href="https://core.trac.wordpress.org/ticket/9297">my modification</a> to the WordPress core was <a href="https://core.trac.wordpress.org/changeset/10740">accepted</a> and will be implemented for version 2.8!  This may mean WordPress is the only 100% HTTP/1.1 compliant software on the net!  Below is the new list (<em>I thought someone out there could use the php array</em>) and as you can see, unfortunately<strong>418 I'm a teapot</strong>didn't make it ;)</p>
<pre>$wp_header_to_desc = array(
  100 =&gt; &#039;Continue&#039;,
  101 =&gt; &#039;Switching Protocols&#039;,
  102 =&gt; &#039;Processing&#039;,
&nbsp;
  200 =&gt; &#039;OK&#039;,
  201 =&gt; &#039;Created&#039;,
  202 =&gt; &#039;Accepted&#039;,
  203 =&gt; &#039;Non-Authoritative Information&#039;,
  204 =&gt; &#039;No Content&#039;,
  205 =&gt; &#039;Reset Content&#039;,
  206 =&gt; &#039;Partial Content&#039;,
  207 =&gt; &#039;Multi-Status&#039;,
  226 =&gt; &#039;IM Used&#039;,
&nbsp;
  300 =&gt; &#039;Multiple Choices&#039;,
  301 =&gt; &#039;Moved Permanently&#039;,
  302 =&gt; &#039;Found&#039;,
  303 =&gt; &#039;See Other&#039;,
  304 =&gt; &#039;Not Modified&#039;,
  305 =&gt; &#039;Use Proxy&#039;,
  306 =&gt; &#039;Reserved&#039;,
  307 =&gt; &#039;Temporary Redirect&#039;,
&nbsp;
  400 =&gt; &#039;Bad Request&#039;,
  401 =&gt; &#039;Unauthorized&#039;,
  402 =&gt; &#039;Payment Required&#039;,
  403 =&gt; &#039;Forbidden&#039;,
  404 =&gt; &#039;Not Found&#039;,
  405 =&gt; &#039;Method Not Allowed&#039;,
  406 =&gt; &#039;Not Acceptable&#039;,
  407 =&gt; &#039;Proxy Authentication Required&#039;,
  408 =&gt; &#039;Request Timeout&#039;,
  409 =&gt; &#039;Conflict&#039;,
  410 =&gt; &#039;Gone&#039;,
  411 =&gt; &#039;Length Required&#039;,
  412 =&gt; &#039;Precondition Failed&#039;,
  413 =&gt; &#039;Request Entity Too Large&#039;,
  414 =&gt; &#039;Request-URI Too Long&#039;,
  415 =&gt; &#039;Unsupported Media Type&#039;,
  416 =&gt; &#039;Requested Range Not Satisfiable&#039;,
  417 =&gt; &#039;Expectation Failed&#039;,
  422 =&gt; &#039;Unprocessable Entity&#039;,
  423 =&gt; &#039;Locked&#039;,
  424 =&gt; &#039;Failed Dependency&#039;,
  426 =&gt; &#039;Upgrade Required&#039;,
&nbsp;
  500 =&gt; &#039;Internal Server Error&#039;,
  501 =&gt; &#039;Not Implemented&#039;,
  502 =&gt; &#039;Bad Gateway&#039;,
  503 =&gt; &#039;Service Unavailable&#039;,
  504 =&gt; &#039;Gateway Timeout&#039;,
  505 =&gt; &#039;HTTP Version Not Supported&#039;,
  506 =&gt; &#039;Variant Also Negotiates&#039;,
  507 =&gt; &#039;Insufficient Storage&#039;,
  510 =&gt; &#039;Not Extended&#039;
);</pre>


<h2>RIPE WHOIS</h2>
<blockquote cite="http://labs.ripe.net/content/ripe-database-api-documentation">
    <p>
    <p>All the status codes are standard HTTP codes ( <a href="http://www.iana.org/assignments/http-status-codes">http://www.iana.org/assignments/http-status-codes</a> ).</p>
    <p></p>
    <p>Clients should avoid any form of coupling with the the text/plain error message contained in response body since it may change between different releases of the API and is only intended as a starting point for indentifying the real causes of the exception event.</p>
    <p>The following table gives a brief description of the mapping between standard Whois V.3 responses and the related REST services status codes. Consider this table as just an example of the error mapping strategy, it may change with future releases.</p>
    </p>
</blockquote>
<table>
    <tbody>
        <tr>
            <th>System Exception</th>
            <th>Whois Error</th>
            <th>HTTP Status Code</th>
        </tr>
        <tr>
            <td>IllegalArgumentException</td>
            <td></td>
            <td>Bad Request (400)</td>
        </tr>
        <tr>
            <td>IllegalStateException</td>
            <td></td>
            <td>Internal Server Error (500)</td>
        </tr>
        <tr>
            <td>UnsupportedOperationException</td>
            <td></td>
            <td>Bad Request (400)</td>
        </tr>
        <tr>
            <td>ObjectNotFoundException</td>
            <td></td>
            <td>Not Found (404)</td>
        </tr>
        <tr>
            <td>IllegalStateException</td>
            <td></td>
            <td>Bad Request (400)</td>
        </tr>
        <tr>
            <td>IOException</td>
            <td></td>
            <td>Bad Request (400)</td>
        </tr>
        <tr>
            <td>SystemException</td>
            <td></td>
            <td>Internal Server Error (500)</td>
        </tr>
        <tr>
            <td>TooManyResultsException</td>
            <td></td>
            <td>Internal Server Error (500)</td>
        </tr>
        <tr>
            <td>WhoisServerException</td>
            <td>No Entries Found (101)</td>
            <td>Not Found (404)</td>
        </tr>
        <tr>
            <td>WhoisServerException</td>
            <td>Unknown Source (102)</td>
            <td>Bad Request (400)</td>
        </tr>
        <tr>
            <td>WhoisServerException</td>
            <td>Unknown Object Type (103)</td>
            <td>Bad Request (400)</td>
        </tr>
        <tr>
            <td>WhoisServerException</td>
            <td>Unknown Attribute in Query (104)</td>
            <td>Bad Request (400)</td>
        </tr>
        <tr>
            <td>WhoisServerException</td>
            <td>Attribute Is Not Inverse Searchable (105)</td>
            <td>Bad Request (400)</td>
        </tr>
        <tr>
            <td>WhoisServerException</td>
            <td>No Search Key Specified (106)</td>
            <td>Bad Request (400)</td>
        </tr>
        <tr>
            <td>WhoisServerException</td>
            <td>Access Denied (201)</td>
            <td>Forbidden (403)</td>
        </tr>
        <tr>
            <td>WhoisServerException</td>
            <td>Access Control Limit Reached (202)</td>
            <td>Forbidden (403)</td>
        </tr>
        <tr>
            <td>WhoisServerException</td>
            <td>Address Passing Not Allowed (203)</td>
            <td>Bad Request (400)</td>
        </tr>
        <tr>
            <td>WhoisServerException</td>
            <td>Maximum Referral Lines Exceeded (204)</td>
            <td>Internal Server Error (500)</td>
        </tr>
        <tr>
            <td>WhoisServerException</td>
            <td>Connection Has Been Closed(301)</td>
            <td>Internal Server Error (500)</td>
        </tr>
        <tr>
            <td>WhoisServerException</td>
            <td>Referral Timeout (302)</td>
            <td>Internal Server Error (500)</td>
        </tr>
        <tr>
            <td>WhoisServerException</td>
            <td>No Referral Host (303)</td>
            <td>Internal Server Error (500)</td>
        </tr>
        <tr>
            <td>WhoisServerException</td>
            <td>Referral Host Not Responding (304)</td>
            <td>Internal Server Error (500)</td>
        </tr>
    </tbody>
</table>
<blockquote cite="http://labs.ripe.net/content/ripe-database-api-documentation">
    <p>
    <p>Clients will have to define error messages generic enough to represent the four main error conditions, that are Bad Request, Forbidden, Not Found and Internal Server Error.</p>
    <p>For example a possible mapping for client side error messages may be:</p>
    </p>
</blockquote>
<table>
    <tbody>
        <tr>
            <th>HTTP Status Code</th>
            <th>Error Message</th>
        </tr>
        <tr>
            <td>Bad Request (400)</td>
            <td>The service is unable to understand and process the query.</td>
        </tr>
        <tr>
            <td>Forbidden (403)</td>
            <td>Query limit exceeded.</td>
        </tr>
        <tr>
            <td>Not Found (404)</td>
            <td>No results were found for Your search "<tt>Search term</tt>"</td>
        </tr>
        <tr>
            <td>Internal Server Error (500)</td>
            <td>The server encountered an unexpected condition which prevented it from fulfilling the request.</td>
        </tr>
    </tbody>
</table>


<h2>Helpful HTTP Links</h2>
<ol>
    <li> <a href="http://www.iana.org/assignments/http-status-codes">IANA registry</a> </li>
    <li> <a href="http://rfc.askapache.com/rfc2324">Hyper Text Coffee Pot Control Protocol (HTCPCP/1.0)</a> </li>
    <li> <a href="http://livedocs.adobe.com/fms/2/docs/00000338.html">Adobe Flash status code definitions (ie 408)</a> </li>
    <li> <a href="http://support.microsoft.com/?id=318380">Microsoft Internet Information Server Status Codes and Sub-Codes</a> </li>
    <li> <a href="http://zamez.org/httplint?url=http://www.askapache.com/htaccess/apache-status-code-headers-errordocument.html">httplint</a> </li>
    <li> <a href="http://www.w3.org/Protocols/HTTP/HTRQ_Headers.html">HTTP Headers, brief intro.</a> </li>
    <li> <a href="http://www.w3.org/TR/cuap">Common User-Agent Issues</a> </li>
    <li>[RFC2295] <a href="mailto:koen@win.tue.nl" title="Technische Universiteit Eindhoven">Holtman, K.</a> and <a href="mailto:mutz@hpl.hp.com" title="Hewlett-Packard Company">A.H. Mutz</a> , " <a href="http://rfc.askapache.com/rfc2295">Transparent Content Negotiation in HTTP</a> ", RFC 2295, March 1998.</li>
    <li>[RFC2518] <a href="mailto:yarong@microsoft.com" title="Microsoft Corporation">Goland, Y.</a> , <a href="mailto:ejw@ics.uci.edu" title="Dept. Of Information and Computer Science, University of California, Irvine">Whitehead, E.</a> , <a href="mailto:asad@netscape.com" title="Netscape">Faizi, A.</a> , <a href="mailto:srcarter@novell.com" title="Novell">Carter, S.R.</a> , and <a href="mailto:dcjensen@novell.com" title="Novell">D. Jensen</a> , " <a href="http://rfc.askapache.com/rfc2518">HTTP Extensions for Distributed Authoring -- WEBDAV</a> ", RFC 2518, February 1999.</li>
    <li>[RFC2616] <a href="mailto:fielding@ics.uci.edu" title="University of California, Irvine">Fielding, R.</a> , <a href="mailto:jg@w3.org" title="W3C">Gettys, J.</a> , <a href="mailto:mogul@wrl.dec.com" title="Compaq Computer Corporation">Mogul, J.</a> , <a href="mailto:frystyk@w3.org" title="MIT Laboratory for Computer Science">Frystyk, H.</a> , <a href="mailto:masinter@parc.xerox.com" title="Xerox Corporation">Masinter, L.</a> , <a href="mailto:paulle@microsoft.com" title="Microsoft Corporation">Leach, P.</a> , and <a href="mailto:timbl@w3.org" title="W3C">T. Berners-Lee</a> , " <a href="http://rfc.askapache.com/rfc2616">Hypertext Transfer Protocol -- HTTP/1.1</a> ", RFC 2616, June 1999.</li>
    <li>[RFC2774] <a href="mailto:frystyk@microsoft.com" title="Microsoft Corporation">Nielsen, H.</a> , <a href="mailto:paulle@microsoft.com" title="Microsoft Corporation">Leach, P.</a> , and <a href="mailto:lawrence@agranat.com" title="Agranat Systems, Inc.">S. Lawrence</a> , " <a href="http://rfc.askapache.com/rfc2774">An HTTP Extension Framework</a> ", RFC 2774, February 2000.</li>
    <li>[RFC2817] Khare, R. and S. Lawrence, " <a href="http://rfc.askapache.com/rfc2817">Upgrading to TLS Within HTTP/1.1</a> ", RFC 2817, May 2000.</li>
    <li>[RFC3229] Mogul, J., Krishnamurthy, B., Douglis, F., Feldmann, A., Goland, Y., van Hoff, A., and D. Hellerstein, " <a href="http://rfc.askapache.com/rfc3229">Delta encoding in HTTP</a> ", RFC 3229, January 2002.</li>
    <li>[RFC4918] <a href="mailto:ldusseault@commerce.net" title="CommerceNet">Dusseault, L., Ed.</a> , " <a href="http://rfc.askapache.com/rfc4918">HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)</a> ", RFC 4918, June 2007.</li>
</ol><p><a href="http://www.askapache.com/htaccess/apache-status-code-headers-errordocument.html"></a><a href="http://www.askapache.com/htaccess/apache-status-code-headers-errordocument.html">HTTP Status Codes and Htaccess ErrorDocuments</a> originally appeared on <cite>AskApache.com</cite> </p>]]></content:encoded>
			<wfw:commentRss>http://www.askapache.com/htaccess/apache-status-code-headers-errordocument.html/feed</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
		<item>
		<title>Creating an Offline Version of Page</title>
		<link>http://www.askapache.com/php/scrape-offline-page-curl.html</link>
		<comments>http://www.askapache.com/php/scrape-offline-page-curl.html#comments</comments>
		<pubDate>Fri, 22 Oct 2010 20:06:49 +0000</pubDate>
		<dc:creator>AskApache</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.askapache.com/?p=4708</guid>
		<description><![CDATA[<p><a class="IFL" href="http://www.askapache.com/php/scrape-offline-page-curl.html"><img src="http://uploads.askapache.com/2010/10/askapache-scraper-350x89.png" alt="I can do anything" title="askapache-scraper" width="350" height="89" class="size-medium wp-image-4709" /></a>So, here's what I hacked together last night, that is being used today.  It's essentially 2 files.<br class="C" /></p>
<ol>
<li>A php file that scrapes uses curl to scrape all the urls for the page (favicon, css, images, pdfs, etc..)</li>
<li>A simple bash shell script acting as a cgi that creates a zip file of all the urls, and a self-extracting exe file for those without a winzip tool</li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.askapache.com/php/scrape-offline-page-curl.html"></a><a href="http://www.askapache.com/php/scrape-offline-page-curl.html"><cite>AskApache.com</cite></a></p><p>A large client has a secure website where they assemble and create presentations consisting of a single Table of Contents page with many pdf's attached to it.  They use the site to make presentations.  This is a big client, a rich client, and they needed a way to guarantee they would be able to access the site.  So I got this request:</p>

<blockquote>Can you make an offline version of the Page that is always updated and available for download so we can download the offline version and present using that in case the website is down or more often, in case Internet Access is unavailable?</blockquote>

<p class="anote"><strong>Update</strong>: I used <strong>COOKIE</strong> based authentication to secure this clients site, so that only logged in users can see anything at all, so how do I enable the curl requests to authenticate as well using the COOKIE of the requesting user in each request made by curl?  Just add the users HTTP_COOKIE to the headers array used by curl like so:</p>
<pre>array(
...
"Cookie: {$_SERVER[&#039;HTTP_COOKIE&#039;]}"
)</pre>
<p>That now means the scraped version of the page is an exact duplicate that the user is looking at.  Very sweet!</p>


<h2>I can GET anything</h2>
<p><a class="IFL" href="http://www.askapache.com/php/scrape-offline-page-curl.html"><img src="http://uploads.askapache.com/2010/10/askapache-scraper-350x89.png" alt="I can do anything" title="askapache-scraper" width="350" height="89" class="size-medium wp-image-4709" /></a>So, here's what I hacked together last night, that is being used today.  It's essentially 2 files.<br class="C" /></p>
<ol>
<li>A php file that scrapes uses curl to scrape all the urls for the page (favicon, css, images, pdfs, etc..)</li>
<li>A simple bash shell script acting as a cgi that creates a zip file of all the urls, and a self-extracting exe file for those without a winzip tool</li>
</ol>


<h2>The PHP File</h2>
<p>This is a simple script that is given 2 parameters:</p>
<ol>
<li>The url to scrape</li>
<li>The type of download to return</li>
</ol>


<h3>scrapeit.php</h3>
<pre>&lt;?php
ob_start();
&nbsp;
/**
* gogeturl2() - grabs a url with curl, and saves it to disk, works for all media types, pdf, js, img, etc.
*
* @return
*/
function gogeturl2($url, $saveto)
{
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_VERBOSE, 0);
if ($fp = fopen($saveto, &#039;w&#039;)) // {curl_setopt($ch,CURLOPT_STDERR, $fp); curl_setopt($ch,CURLOPT_VERBOSE,1);}
{
  curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
  curl_setopt($ch, CURLOPT_MAXCONNECTS, 4);
  curl_setopt($ch, CURLOPT_MAXREDIRS, 3);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
  curl_setopt($ch, CURLOPT_FAILONERROR, 1);
  curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15);
  curl_setopt($ch, CURLOPT_FILE, $fp);
  curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
  curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3",
    "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5",
    "Accept-Language: en-us,en;q=0.5",
    "Accept-Encoding: none",
    "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7",
    "Keep-Alive: 300",
    "Connection: Keep-Alive",
    "Pragma:"));
  $r = curl_exec($ch);
  $ch_info = curl_getinfo($ch);
  if (curl_errno($ch)) error_log(print_r($ch_info, 1) . print_r(curl_errno($ch), 1) . print_r(curl_error($ch), 1));
  else curl_close($ch);
  fclose($fp);
}
}
/**
* gogeturl()  returns the source of the requested url (thanks to accept-encoding: none)
*
* @return
*/
function gogeturl($url)
{
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_REFERER, $url);
curl_setopt($ch, CURLOPT_VERBOSE, 0);
curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
curl_setopt($ch, CURLOPT_MAXCONNECTS, 4);
curl_setopt($ch, CURLOPT_MAXREDIRS, 3);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
  "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6 GTB6",
  "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
  "Accept-Language: en-us,en;q=0.5",
  "Accept-Encoding: none",
  "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7",
  "Keep-Alive: 115",
  "Connection: keep-alive",
  "Pragma:"));
$g = curl_exec($ch);
if (curl_errno($ch)) error_log(print_r(array(
&#039;chinfo&#039; =&gt; $ch_info,
&#039;curl_errno&#039; =&gt; curl_errno($ch),
&#039;curl_error&#039; =&gt; curl_error($ch)
), 1));
curl_close($ch);
return $g;
}
&nbsp;
/**
* _mkdir() makes a directory
*
* @return
*/
function _mkdir($path, $mode = 0755)
{
$old = umask(0);
$res = @mkdir($path, $mode);
umask($old);
return $res;
}
&nbsp;
/**
* rmkdir()  recursively makes a directory tree
*
* @return
*/
function rmkdir($path, $mode = 0755)
{
return is_dir($path) || (rmkdir(dirname($path), $mode) &amp;&amp; _mkdir($path, $mode));
}</pre>

<p>The following should be in a couple functions, but I was running on a tight time schedule, and hey this $hitt aint free... wait yes it is, always.</p>
<pre>// Ok lets get it on!
// first lets setup some variables
if (!isset($_GET[&#039;url&#039;]) || empty($_GET[&#039;url&#039;]))die();
$td = $th = $urls = array();
$FDATE = date("m-d-y-Hms");
$FTMP = &#039;/home/askapache/sites/askapache.com/tmp&#039;;
$fetch_url = $_GET[&#039;url&#039;];
$fu = parse_url($fetch_url);
$fd = substr($FTMP . $fu[&#039;path&#039;], 0, - 1);
$FEXE = "{$fd}-{$FDATE}.exe";
$FZIP = "{$fd}-{$FDATE}.zip";
&nbsp;
// now this is a shortcut to download the css file and add all the images in it to the img_urls array
$img_urls = array();
$gg = preg_match_all("/url\(([^\)]*?)\)/Ui", gogeturl(&#039;https://www.askapache.com/askapache-0128770124.css&#039;), $th);
$imgs = array_unique($th[1]);
foreach($imgs as $img)
{
// only because all the links are relative
$img_urls[] = &#039;https://www.askapache.com&#039; . $img;
}
&nbsp;
// now fetch the main page, and assemble an array of all the external resources into the urls array
$gg = preg_match_all("/(background|href)=([\"\&#039;])([^\"\&#039;#]+?)([\"\&#039;])/Ui", gogeturl($fetch_url), $th);
foreach($th[3] as $url)
{
if (strpos($url, &#039;.js&#039;) !== false)continue;
if (strpos($url, &#039;wp-login.php&#039;) !== false || $url == &#039;https://www.askapache.com/&#039;) continue;
if (strrpos($url, &#039;/&#039;) == strlen($url) - 1)continue;
if (strpos($url, &#039;https://www.askapache.com/&#039;) === false)
{
  if ($url[0] == &#039;/&#039;) $urls[] = &#039;https://www.askapache.com&#039; . $url;
  else continue;
}
else $urls[] = $url;
}
&nbsp;
// now create a uniq array of urls, then download and save each of them
$urls = array_merge(array_unique($img_urls), array_unique($urls));
foreach($urls as $url)
{
  $pu = parse_url($url);
  rmkdir(substr($fd . $pu[&#039;path&#039;], 0, strrpos($fd . $pu[&#039;path&#039;], &#039;/&#039;)));
  gogeturl2($url, $fd . $pu[&#039;path&#039;]);
}
&nbsp;
// deletes dir ie. /this-page/this-page/ when it should be /this-page/index.html
if (is_dir($fd . $fu[&#039;path&#039;])) rmdir($fd . $fu[&#039;path&#039;]);
&nbsp;
// now save the page as index.html
gogeturl2($fetch_url, $fd . &#039;/index.html&#039;);
&nbsp;
// fixup to be able3 to parse
$g = file_get_contents($fd . &#039;/index.html&#039;);
$g = str_replace(&#039;&lt;script&#039;, &#039;&lt;!--&lt;script&#039;, $g);
$g = str_replace(&#039;script&gt;&#039;, &#039;script&gt;!--&gt;&#039;, $g);
$g = str_replace(&#039;href="https://www.askapache.com/&#039;, &#039;href="/&#039;, $g);
$g = str_replace(&#039;src="https://www.askapache.com/&#039;, &#039;src="/&#039;, $g);
$g = str_replace(&#039;href="/&#039;, &#039;href="&#039;, $g);
$g = str_replace(&#039;src="/&#039;, &#039;src="&#039;, $g);
$g = str_replace("href=&#039;https://www.askapache.com/", "href=&#039;/", $g);
$g = str_replace("src=&#039;https://www.askapache.com/", "src=&#039;/", $g);
$g = str_replace("href=&#039;/", "href=&#039;", $g);
$g = str_replace("src=&#039;/", "src=&#039;", $g);
file_put_contents($fd . &#039;/index.html&#039;, $g);
&nbsp;
// fixup for css file
foreach($urls as $url)
{
if (strpos($url, &#039;.css&#039;) !== false)
{
  $fuu = parse_url($url);
  $css = file_get_contents($fd . $fuu[&#039;path&#039;]);
  $css = str_replace(&#039;url(/&#039;, &#039;url(../&#039;, $css);
  file_put_contents($fd . $fuu[&#039;path&#039;], $css);
}
}
&nbsp;
// my favorite technique, using fsockopen to initiate a shell script server-side.
// passing the args in the HTTP Headers... genius!!
// close the sucker fast with HTTP/1.0 and connection: close
$fp = fsockopen ($_SERVER[&#039;SERVER_NAME&#039;], 80, $errno, $errstr, 5);
fwrite($fp, "GET /cgi-bin/sh/zip.sh HTTP/1.0\r\nHost: www.askapache.com\r\nX-Pad: {$fd}\r\nX-Allow: {$FDATE}\r\nConnection: Close\r\n\r\n");
fclose($fp);
&nbsp;
// loop until the file created by /cgi-bin/sh/zip.sh is found
$c = 0;
do
{
$c++;
sleep(1);
clearstatcache();
if (is_file("{$FEXE}")) continue;
}
while ($c &lt; 20);
&nbsp;
// either zip or exe
$type = $_GET[&#039;type&#039;];
if ($type == &#039;zip&#039;) $file = $FZIP;
else $file = $FEXE;
&nbsp;
// wow great debugging dude
error_log($file);
&nbsp;
// if the file is there, do a 302 redirect to initiate download
if (file_exists("{$file}"))
{
  @header("HTTP/1.1 302 Moved", 1, 302);
  @header("Status: 302 Moved", 1, 302);
  @header(&#039;Location: https://www.askapache.com/&#039; . basename($file));
  exit;
}
&nbsp;
exit;
?&gt;</pre>



<h2>zip.sh</h2>
<pre>#!/bin/sh
&nbsp;
# all you need for cgi
  echo -e "Content-type: text/plain\n\n"
&nbsp;
# blank that run log
  echo "" &gt; /home/askapache/sites/askapache.com/tmp/run.log
&nbsp;
# redirect 1 and 2 to the run log for the whole script
  exec &amp;&gt;/home/askapache/sites/askapache.com/tmp/run.log
&nbsp;
# basename
  N=${HTTP_X_PAD//*\/}
&nbsp;
# date-based
  NN=${HTTP_X_ALLOW}
&nbsp;
# create recursively the dir tree
  mkdir -pv $HTTP_X_PAD
&nbsp;
# cd to the tmp
  cd /home/askapache/sites/askapache.com/tmp
&nbsp;
# the zip version with date
  F=$N-$NN.zip
&nbsp;
# the exe version with date
  NN=$N-$NN.exe
&nbsp;
# for debugging, only goes to run log
  echo "F=$F"
  echo "NN=$NN"
  echo "N=$N"
&nbsp;
# create a relative (r is recursive) archive of the entire dir
  /usr/bin/zip -rvv $F $N
&nbsp;
# add the self-extracting stub to the archive
  /bin/cat unzipsfx.exe $F &gt; $NN
&nbsp;
# fix the sfx stub
  /usr/bin/zip -A $NN
&nbsp;
# move both the exe and zip to the web-docroot to be dl&#039;d directly
  cp -vf $NN /home/askapache/sites/askapache.com/htdocs/
  cp -vf $F /home/askapache/sites/askapache.com/htdocs/
&nbsp;
# sleep for 60 seconds and then rm all the files, so you better download that file fast
  sleep 60 &amp;&amp; rm -rvf $HTTP_X_PAD $F $NN /home/askapache/sites/askapache.com/htdocs/$NN /home/askapache/sites/askapache.com/htdocs/$F
&nbsp;
#suh suh cya
exit 0;</pre>


<h3>Creating SFX Archives</h3>
<p>The best way is 7z, but I couldn't get p7zip's sfx module to work and didn't have time to compile it.  Instead I just used the stub available here:  <code>curl -O -L ftp://ftp.info-zip.org/pub/infozip/win32/unz552xn.exe</code> which works great but no customization like password, icons, etc.. oh well.</p>



<h2>Implementation</h2>
<p>Simple, just create a link to the php file with the url and type parameters.  <code>/cgi-bin/php/scrapeit.php?url=http://www.askapache.com/htaccess/htaccess.html&amp;type=exe</code> or if you integrate into wordpress like I did you can add this to your header or admin_bar and use the <code>get_permalink()</code> for the url arg.</p>

<h2>Lock It Down</h2>
<p>This was used on a private site so what I did was add some code to the scrapeit.php file that just copied the HTTP_COOKIE value sent by the requesting user and sent that as part of the request in the fsockopen request.  That means only logged in users can do this, and furthermore, if a user doesn't have access to a page and tries to use this to circumvent, they can't.  And also htaccess was used to limit the scripts to only allow the ip's running the server to make connections.</p>

<h2>Conclusion</h2>
<p>What can't be done with linux, bash, http, php, and a little server-side finesse?  My clients are very happy, and I had some fun!</p><p><a href="http://www.askapache.com/php/scrape-offline-page-curl.html"></a><a href="http://www.askapache.com/php/scrape-offline-page-curl.html">Creating an Offline Version of Page</a> originally appeared on <cite>AskApache.com</cite> </p>]]></content:encoded>
			<wfw:commentRss>http://www.askapache.com/php/scrape-offline-page-curl.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dealing with Mobile Visitors using Bad Browsers</title>
		<link>http://www.askapache.com/htaccess/dealing-mobile-browsers.html</link>
		<comments>http://www.askapache.com/htaccess/dealing-mobile-browsers.html#comments</comments>
		<pubDate>Fri, 10 Sep 2010 00:26:35 +0000</pubDate>
		<dc:creator>AskApache</dc:creator>
				<category><![CDATA[Htaccess]]></category>

		<guid isPermaLink="false">http://www.askapache.com/?p=4508</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.askapache.com/htaccess/dealing-mobile-browsers.html"></a><a href="http://www.askapache.com/htaccess/dealing-mobile-browsers.html"><cite>AskApache.com</cite></a></p><a href="http://perishablepress.com/press/2010/04/26/stop-404-requests-for-mobile-versions-of-your-site/">Definately worth the read</a>, but it is hard to see any benefit to doing this.

Mobile agents are still in their infancy, but within 2 years most mobiles will be as fast as the laptops from a couple years back... I mean my droid is running linux!  The world is moving steadily towards a society where mobile devices will greatly outnumber pcs.  So during this "growing up" phase I would argue that it would be much more beneficial to look for a method that solves the resource-robbing issue from the server-side, while also keeping in mind that mobile visitors to your site will continue to grow and eventually surpass non-mobile clients.

It definately makes it harder to understand the reasons behind this clever post without having more information on the mobile bots that you've been seeing in your logs..  Obviously (looking at your impressive blacklist work) that would be easy for you to get, but it would help us to see the same thing.

Alot of mobile devices have very small amounts of memory, especially smal is the amount of storage available to save data too.  In approaching that significant problem from a programming point of view, programmers built the mobile user-agents to be as fast as possible using minimal data.   Knowing that it makes sense for a mobile agent to try hard to find an alternate version of a page formatted with it's unique lack of resources in mind.  Issuing 100 requests for non-existant pages and only finding the right one on the 100th try would almost certainly be worth it for a mobile device.  Most devices use socket programming to communicate across HTTP for speed, which makes it very quick and easy to issue requests..  Basically they are free in terms of what it takes to make a request.  unfortunately this would really take up some cpu/memory/connections on our servers if they aren't setup and optimized.   1000 mobiles doing this simultaneously would grind most sites to a halt.

The solution you came up with would definately help that situation.  403's are the strongest method available to a server (at least in terms of the HTTP protocol) to tell a useragent to get gone.   They are also the best way (at least in apache) to save your cpu/resources as a 403 causes apache internally to end the connection, clean up it's internal data structures, and terminate the actual connection and apache processing of the request.

However 403's are too strict for a situation without any clear abuse going on, 403's are understood by all agents and can do some bad things to your site if used like this.  You can get dropped from search indexes for returning 403's (thats google trying to do you a favor by not indexing "Forbidden" content), and I've found that returning a 403 to crawlers causes them to sometimes retry in 15min, then an hour, then a day, then a week, and the spaces between checks grow until they stop.

Oh ya, it is very unlikely that a mobile device will save the results of non-existing mobile uris, mostly because it doesn't cost them anything to make it (unless you setup a trap like mod_security that lets you respond byte by byte veryyyyy slowwwwlyyyy).   And even then mobile devices do not have that kind of memory to store lists of requested urls and their responses.  Think about it, to check if the url returned a bad result previously before making the same request would very very quickly freeze up a device, 50 sites x 5 requests and responses equals quite a bit of data, not to mention having to then search through all that data before making a request.. the battery would die super fast.

This is also the primary reason that the new AMAZINGLY fast opera browser released last month for the droid does what it does.  It uses socket-level HTTP like everyone else, but opera setup mobile proxy servers around the nation to act as the intermediarys and crunch the actual data for the mobile.   There just isn't enough mem for my droid to be able to open a huge webpage, parse the source, and then render it, so it looks for mobile versions whenever possible.  If it can't find a mobile version or the mobile version is still too big, it proxies the request across a mobile proxy server (such as used by google, opera, blackberry) which allows the proxy server (super sophisticated) to get the content first, render it, and then send it to your mobile for direct viewing.   More than proxy servers they act as caches.  And especially due to the fact they all use custom programming (the proxies) you do not want to play around with HTTP 403's like that.  It could easily have the effect of blocking a root proxy resulting in your site being blocked by the entire proxy and it's clients.  Unlike mobiles, those machines store request state info extremely well.


Regarding a 410, that seems like a great solution but actually could be the worst possible thing to do.  410 gone means it used to exist, and also means that it was removed purposefully and will NEVER be available again.   2 years from now when googles mobile index takes over the main web index, you will be upstream without a paddle, with no clue as to why your new mobile area isn't getting traffic.

Very few useragents understand a 410, it's one of those codes used almost exclusively for controlling the way search engines index your content.  So to me it makes no sense to issue an esoteric status code to a bot that doesn't even understand 404's.

The only time you should ever have to use a 410 is when you make a big mistake with your indexing and have to use it to fix your site index.  Many other useragents have minimal understanding of HTTP (esp bots, crawlers, spammers, etc) either by design for speed or whatever..  they just look at the first digit of the response code (2 OK, 3 REDIRECT, 4 NOT EXIST, 5 SERVER ERROR) and determine from that alone whether the content is good or not.

Basically all mobile devices run on HTTP 1.1, but for their own physical limitations they behave like HTTP 1.0 clients from a server admin standpoint.<p><a href="http://www.askapache.com/htaccess/dealing-mobile-browsers.html"></a><a href="http://www.askapache.com/htaccess/dealing-mobile-browsers.html">Dealing with Mobile Visitors using Bad Browsers</a> originally appeared on <cite>AskApache.com</cite> </p>]]></content:encoded>
			<wfw:commentRss>http://www.askapache.com/htaccess/dealing-mobile-browsers.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

