<?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; Cache</title>
	<atom:link href="http://www.askapache.com/web-cache/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.askapache.com</link>
	<description>Advanced Web Development</description>
	<lastBuildDate>Fri, 25 Jun 2010 00:55:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Real-Life Htaccess Files from My Server</title>
		<link>http://www.askapache.com/htaccess/real-world-htaccess-files.html</link>
		<comments>http://www.askapache.com/htaccess/real-world-htaccess-files.html#comments</comments>
		<pubDate>Sat, 17 Apr 2010 15:06:22 +0000</pubDate>
		<dc:creator>AskApache</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Apache Modules]]></category>
		<category><![CDATA[Cache]]></category>
		<category><![CDATA[DreamHost]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Htaccess]]></category>
		<category><![CDATA[Linux Unix BSD]]></category>
		<category><![CDATA[Mod_Rewrite]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Server Administration]]></category>
		<category><![CDATA[Web Hosting]]></category>
		<category><![CDATA[Webmaster]]></category>
		<category><![CDATA[AddHandler]]></category>
		<category><![CDATA[Backups]]></category>
		<category><![CDATA[Block IP]]></category>
		<category><![CDATA[Cache-Control]]></category>
		<category><![CDATA[cheatsheets]]></category>
		<category><![CDATA[developers]]></category>
		<category><![CDATA[errordocument]]></category>
		<category><![CDATA[etag]]></category>
		<category><![CDATA[htaccess tricks]]></category>
		<category><![CDATA[http cookie]]></category>
		<category><![CDATA[indexes]]></category>
		<category><![CDATA[Mod_Security]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[password protection]]></category>
		<category><![CDATA[real world]]></category>
		<category><![CDATA[rewritecond]]></category>
		<category><![CDATA[rewriterule]]></category>
		<category><![CDATA[Source Code]]></category>

		<guid isPermaLink="false">http://www.askapache.com/?p=4357</guid>
		<description><![CDATA[<pre>#### No https except to wp-admin - 
# If the request is empty ( implies fopen or normal file access by a php script )
RewriteCond %{THE_REQUEST} ^$ [OR]
&#160;
# OR if the request if for wp-admin or wp-login.php
RewriteCond %{REQUEST_URI} ^/(wp-admin&#124;wp-login\.php).*$ [NC,OR]
&#160;
# OR if the Referer is https
RewriteCond %{HTTP_REFERER} ^https://www.askapache.com/.*$ [NC]
&#160;
# THEN skip the following rule, basically all this does is force https or badhost to be redirected
# BUT because of the above 3 rewritecond&#039;s, this won&#039;t break poorly written admin scripts
RewriteRule .* - [S=1]
&#160;
RewriteCond %{HTTPS} =on [OR]
RewriteCond %{HTTP_HOST} !^www\.askapache\.com$ [NC]
RewriteRule .* http://www.askapache.com%{REQUEST_URI} [R=301,L]
&#160;
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(wp-admin/.*&#124;wp-login\.php.*)\ HTTP/ [NC]
RewriteCond %{HTTPS} !=on
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]</pre>]]></description>
			<content:encoded><![CDATA[<p>I was going through some backups from years ago, and ran:</p>
<pre>locate .htaccess | xargs -I&#039;{}&#039; cat &#039;{}&#039; &gt;&gt; master-htaccesser.txt</pre>
<p>My site is named after reading source code because that is what helps me the most when I&#8217;m trying to learn something unusually difficult.   Just like functions and aliases, it is very helpful to have cheatsheets for common commands.. not much is better than real-world examples.  Unfortunately because this was compiled from hundreds of htaccess files on multiple hosts and platforms, and due to the concatenation, it&#8217;s not organized.</p>
<p>Normally I would not publish something like this, who knows how much unreleased tricks I forgot about..  but in order to say thanks to all those working for open-source, the FSF, and to all those who don&#8217;t steal content, and to all the incredible authors who shared with me (I twitter most of what I find, and follow my favs), here ya go..</p>
<p class="cnote"><strong>ATTN:</strong> Please let me know if this is total junk or not, this is around 1/500th of my master-htaccesser.txt file.. and I&#8217;d be happy to post more if it helps..</p>
<h2>Checking for Cookie</h2>
<p>Used this to stop mp3-scrapers.. checks for a cookie ending in MP3P=02357</p>
<pre>Options -Indexes
RewriteEngine On
RewriteCond %{HTTP_COOKIE} !^.*MP3P=([0-9]+).* [NC]
RewriteRule .* - [F,L]</pre>
<h2>Setting Environment Var if Proxied</h2>
<pre>RewriteEngine On
RewriteRule &quot;\.(gif|png|jpg)$&quot; &quot;-&quot; [ENV=proxied_image:1]
RewriteCond &quot;%{ENV:proxied_image}&quot; &quot;!1&quot;
RewriteRule &quot;^&quot; &quot;-&quot; [ENV=proxied_other:1]</pre>
<h2>nokeepalive for ErrorDocs and Abusers</h2>
<pre>Options SymLinksIfOwnerMatch IncludesNOEXEC
AddOutputFilter Includes html
SetEnv nokeepalive
Order Allow,Deny
Allow from all
# 1 YEAR
&lt;FilesMatch &quot;\.(js|css)$&quot;&gt;
Header unset Pragma
FileETag None
Header set Cache-Control &quot;public&quot;
Header set Expires &quot;Thu, 15 Apr 2010 20:00:00 GMT&quot;
Header unset Last-Modified
Header unset Last-Modified
Header unset ETag
&nbsp;
SetOutputFilter DEFLATE
Header set Cache-Control &quot;public&quot;
Header set Expires &quot;Thu, 15 Apr 2010 20:00:00 GMT&quot;
&lt;/FilesMatch&gt;
SecFilterEngine Off
&nbsp;
# 1 YEAR
&lt;FilesMatch &quot;\.(js|css)$&quot;&gt;
Header unset Pragma
FileETag None
Header set Cache-Control &quot;public&quot;
Header set Expires &quot;Thu, 15 Apr 2010 20:00:00 GMT&quot;
Header unset Last-Modified
Header unset Last-Modified
Header unset ETag
&nbsp;
SetOutputFilter DEFLATE
Header set Cache-Control &quot;public&quot;
Header set Expires &quot;Thu, 15 Apr 2010 20:00:00 GMT&quot;
&lt;/FilesMatch&gt;</pre>
<h2>Unreleased Tests for AskApache Password Protection</h2>
<pre># +ASKAPACHE PASSPRO 4.6.6
#######################################################
#               __                          __
#   ____ ______/ /______ _____  ____ ______/ /_  ___
#  / __ `/ ___/ //_/ __ `/ __ \/ __ `/ ___/ __ \/ _ \
# / /_/ (__  ) ,&lt; / /_/ / /_/ / /_/ / /__/ / / /  __/
# \__,_/____/_/|_|\__,_/ .___/\__,_/\___/_/ /_/\___/
#                     /_/
# - - - - - - - - - - - - - - - - - - - - - - - - - - -
# +APRO SIDS
# +SID 21030002
Order Deny,Allow
Deny from All
Satisfy Any
AuthType Digest
AuthName &quot;Protected By AskApache&quot;
AuthDigestDomain / http://www.askapache.com/
AuthDigestFile /home/.greer/askapache/sites/askapache.com/.htpasswda3
Require valid-user
&lt;FilesMatch &quot;\.(ico|pdf|flv|jpg|jpeg|mp3|mpg|mp4|mov|wav|wmv|png|gif|swf|css|js)$&quot;&gt;
Allow from All
&lt;/FilesMatch&gt;
&lt;FilesMatch &quot;(async-upload|admin-ajax)\.php$&quot;&gt;
&lt;IfModule mod_security.c&gt;
SecFilterEngine Off
&lt;/IfModule&gt;
Allow from All
&lt;/FilesMatch&gt;
# -SID 21030002
# -APRO SIDS
# - - - - - - - - - - - - - - - - - - - - - - - - - - -
#               __                          __
#   ____ ______/ /______ _____  ____ ______/ /_  ___
#  / __ `/ ___/ //_/ __ `/ __ \/ __ `/ ___/ __ \/ _ \
# / /_/ (__  ) ,&lt; / /_/ / /_/ / /_/ / /__/ / / /  __/
# \__,_/____/_/|_|\__,_/ .___/\__,_/\___/_/ /_/\___/
#                     /_/
#######################################################
# -ASKAPACHE PASSPRO 4.6.6
&nbsp;
# +ASKAPACHE PASSPRO 4.6.6
#######################################################
#               __                          __
#   ____ ______/ /______ _____  ____ ______/ /_  ___
#  / __ `/ ___/ //_/ __ `/ __ \/ __ `/ ___/ __ \/ _ \
# / /_/ (__  ) ,&lt; / /_/ / /_/ / /_/ / /__/ / / /  __/
# \__,_/____/_/|_|\__,_/ .___/\__,_/\___/_/ /_/\___/
#                     /_/
# - - - - - - - - - - - - - - - - - - - - - - - - - - -
# +APRO SIDS
# +SID Test
ErrorDocument 401 /wp-content/askapache/test.gif
ErrorDocument 403 /wp-content/askapache/test.gif
ErrorDocument 404 /wp-content/askapache/test.gif
ErrorDocument 500 /wp-content/askapache/test.gif
ServerSignature On
&lt;IfModule mod_alias.c&gt;
RedirectMatch 305 ^.*modaliastest$ http://www.askapache.com
&lt;/IfModule&gt;
&lt;IfModule mod_rewrite.c&gt;
RewriteEngine On
RewriteBase /
RewriteCond %{QUERY_STRING} modrewritetest [NC]
RewriteRule .* http://www.askapache.com [R=307,L]
&lt;/IfModule&gt;
&lt;Files modsec_check.gif&gt;
&lt;IfModule mod_security.c&gt;
SetEnv MODSEC_ENABLE On
SecFilterEngine On
SecFilterDefaultAction &quot;nolog,noauditlog,pass&quot;
SecAuditEngine Off
SecFilterInheritance Off
SecFilter modsecuritytest &quot;deny,nolog,noauditlog,status:503&quot;
Deny from All
&lt;/IfModule&gt;
&lt;/Files&gt;
&lt;Files basic_auth_test.gif&gt;
AuthType Basic
AuthName &quot;askapache test&quot;
AuthUserFile /home/.greer/askapache/sites/askapache.com/htdocs/wp-content/askapache/.htpasswd-basic
Require valid-user
&lt;/Files&gt;
&lt;Files digest_check.gif&gt;
AuthType Digest
AuthName &quot;askapache test&quot;
AuthDigestDomain /wp-content/askapache/ http://www.askapache.com/wp-content/askapache/
AuthUserFile /home/.greer/askapache/sites/askapache.com/htdocs/wp-content/askapache/.htpasswd-digest
Require none
&lt;/Files&gt;
&lt;Files authuserfile_test.gif&gt;
AuthType Digest
AuthName &quot;askapache test&quot;
AuthDigestDomain /wp-content/askapache/ http://www.askapache.com/wp-content/askapache/
AuthUserFile /home/.greer/askapache/sites/askapache.com/htdocs/wp-content/askapache/.htpasswd-digest
Require valid-user
&lt;/Files&gt;
&lt;Files authdigestfile_test.gif&gt;
AuthType Digest
AuthName &quot;askapache test&quot;
AuthDigestDomain /wp-content/askapache/ http://www.askapache.com/wp-content/askapache/
AuthDigestFile /home/.greer/askapache/sites/askapache.com/htdocs/wp-content/askapache/.htpasswd-digest
Require valid-user
&lt;/Files&gt;
# -SID Test
# -APRO SIDS
# - - - - - - - - - - - - - - - - - - - - - - - - - - -
#               __                          __
#   ____ ______/ /______ _____  ____ ______/ /_  ___
#  / __ `/ ___/ //_/ __ `/ __ \/ __ `/ ___/ __ \/ _ \
# / /_/ (__  ) ,&lt; / /_/ / /_/ / /_/ / /__/ / / /  __/
# \__,_/____/_/|_|\__,_/ .___/\__,_/\___/_/ /_/\___/
#                     /_/
#######################################################
# -ASKAPACHE PASSPRO 4.6.6</pre>
<h2>Warming up to the really advanced tests</h2>
<pre>Options +ExecCGI
Order Deny,Allow
Deny from All
Allow from 208.113.134.190 64.111.114.111 208.113.134.203 208.113.152.201 env=REDIRECT_STATUS
Satisfy Any
Options +FollowSymLinks
AddHandler application/x-httpd-php .php
&nbsp;
RewriteEngine On
RewriteBase /
RewriteCond %{QUERY_STRING} !^tyy+$ [NC]
RewriteCond %{REMOTE_USER} ^(.+)$
RewriteRule ^(.*)$ $1/-%1 [R=302,L]
Options +ExecCGI +FollowSymLinks
DirectoryIndex index.php
ErrorDocument 404 /cgi-bin/pro/index.php
&nbsp;
AuthType Digest
AuthName &quot;AskApache Pro&quot;
AuthDigestFile /home/askapache/sites/askapache.com/.htpasswd-pro
AuthDigestDomain /cgi-bin/pro/ http://www.askapache.com/cgi-bin/pro/ https://www.askapache.com/cgi-bin/pro/
Require user askapacheDirectoryIndex p.php
ErrorDocument 403 /cgi-bin/p/p.php
ErrorDocument 401 /cgi-bin/p/p.php
ErrorDocument 500 /cgi-bin/p/p.php
ErrorDocument 503 /cgi-bin/p/p.php
&nbsp;
RewriteEngine On
RewriteBase /
RewriteRule .* - [E=INFO_API_VERSION:%{API_VERSION}]
RewriteRule .* - [E=INFO_AUTH_TYPE:%{AUTH_TYPE}]
RewriteRule .* - [E=INFO_CONTENT_LENGTH:%{CONTENT_LENGTH}]
RewriteRule .* - [E=INFO_CONTENT_TYPE:%{CONTENT_TYPE}]
RewriteRule .* - [E=INFO_DOCUMENT_ROOT:%{DOCUMENT_ROOT}]
RewriteRule .* - [E=INFO_GATEWAY_INTERFACE:%{GATEWAY_INTERFACE}]
RewriteRule .* - [E=INFO_HTTPS:%{HTTPS}]
RewriteRule .* - [E=INFO_HTTP_ACCEPT:%{HTTP:Accept}]
RewriteRule .* - [E=INFO_HTTP_ACCEPT_LANGUAGE:%{HTTP:Accept-Language}]
RewriteRule .* - [E=INFO_HTTP_ACCEPT_ENCODING:%{HTTP:Accept-Encoding}]
RewriteRule .* - [E=INFO_HTTP_ACCEPT_CHARSET:%{HTTP:Accept-Charset}]
RewriteRule .* - [E=INFO_HTTP_CACHE_CONTROL:%{HTTP:Cache-Control}]
RewriteRule .* - [E=INFO_HTTP_CONNECTION:%{HTTP:Connection}]
RewriteRule .* - [E=INFO_HTTP_COOKIE:%{HTTP_COOKIE}]
RewriteRule .* - [E=INFO_HTTP_FORWARDED:%{HTTP_FORWARDED}]
RewriteRule .* - [E=INFO_HTTP_HOST:%{HTTP_HOST}]
RewriteRule .* - [E=INFO_HTTP_KEEP_ALIVE:%{HTTP_KEEP_ALIVE}]
RewriteRule .* - [E=INFO_HTTP_PROXY_CONNECTION:%{HTTP_PROXY_CONNECTION}]
RewriteRule .* - [E=INFO_HTTP_REFERER:%{HTTP:Referer}]
RewriteRule .* - [E=INFO_HTTP_USER_AGENT:%{HTTP_USER_AGENT}]
RewriteRule .* - [E=INFO_IS_SUBREQ:%{IS_SUBREQ}]
RewriteRule .* - [E=INFO_ORIG_PATH_INFO:%{ORIG_PATH_INFO}]
RewriteRule .* - [E=INFO_ORIG_PATH_TRANSLATED:%{ORIG_PATH_TRANSLATED}]
RewriteRule .* - [E=INFO_ORIG_SCRIPT_FILENAME:%{ORIG_SCRIPT_FILENAME}]
RewriteRule .* - [E=INFO_ORIG_SCRIPT_NAME:%{ORIG_SCRIPT_NAME}]
RewriteRule .* - [E=INFO_PATH:%{PATH}]
RewriteRule .* - [E=INFO_PATH_INFO:%{PATH_INFO}]
RewriteRule .* - [E=INFO_QUERY_STRING:%{QUERY_STRING}]
RewriteRule .* - [E=INFO_REDIRECT_QUERY_STRING:%{REDIRECT_QUERY_STRING}]
RewriteRule .* - [E=INFO_REDIRECT_REMOTE_USER:%{REDIRECT_REMOTE_USER}]
RewriteRule .* - [E=INFO_REDIRECT_STATUS:%{REDIRECT_STATUS}]
RewriteRule .* - [E=INFO_REDIRECT_URL:%{REDIRECT_URL}]
RewriteRule .* - [E=INFO_REMOTE_ADDR:%{REMOTE_ADDR}]
RewriteRule .* - [E=INFO_REMOTE_HOST:%{REMOTE_HOST}]
RewriteRule .* - [E=INFO_REMOTE_IDENT:%{REMOTE_IDENT}]
RewriteRule .* - [E=INFO_REMOTE_PORT:%{REMOTE_PORT}]
RewriteRule .* - [E=INFO_REMOTE_USER:%{REMOTE_USER}]
RewriteRule .* - [E=INFO_REQUEST_FILENAME:%{REQUEST_FILENAME}]
RewriteRule .* - [E=INFO_REQUEST_METHOD:%{REQUEST_METHOD}]
RewriteRule .* - [E=INFO_REQUEST_URI:%{REQUEST_URI}]
RewriteRule .* - [E=INFO_REDIRECT_REQUEST_URI:%{REDIRECT_REQUEST_URI}]
RewriteRule .* - [E=INFO_SCRIPT_FILENAME:%{SCRIPT_FILENAME}]
RewriteRule .* - [E=INFO_SCRIPT_GROUP:%{SCRIPT_GROUP}]
RewriteRule .* - [E=INFO_SCRIPT_NAME:%{SCRIPT_NAME}]
RewriteRule .* - [E=INFO_SCRIPT_URI:%{SCRIPT_URI}]
RewriteRule .* - [E=INFO_SCRIPT_URL:%{SCRIPT_URL}]
RewriteRule .* - [E=INFO_SCRIPT_USER:%{SCRIPT_USER}]
RewriteRule .* - [E=INFO_SERVER_ADDR:%{SERVER_ADDR}]
RewriteRule .* - [E=INFO_SERVER_ADMIN:%{SERVER_ADMIN}]
RewriteRule .* - [E=INFO_SERVER_NAME:%{SERVER_NAME}]
RewriteRule .* - [E=INFO_SERVER_PORT:%{SERVER_PORT}]
RewriteRule .* - [E=INFO_SERVER_PROTOCOL:%{SERVER_PROTOCOL}]
RewriteRule .* - [E=INFO_SERVER_SIGNATURE:%{SERVER_SIGNATURE}]
RewriteRule .* - [E=INFO_SERVER_SOFTWARE:%{SERVER_SOFTWARE}]
RewriteRule .* - [E=INFO_THE_REQUEST:%{THE_REQUEST}]
RewriteRule .* - [E=INFO_TIME:%{TIME}]
RewriteRule .* - [E=INFO_TIME_DAY:%{TIME_DAY}]
RewriteRule .* - [E=INFO_TIME_HOUR:%{TIME_HOUR}]
RewriteRule .* - [E=INFO_TIME_MIN:%{TIME_MIN}]
RewriteRule .* - [E=INFO_TIME_MON:%{TIME_MON}]
RewriteRule .* - [E=INFO_TIME_SEC:%{TIME_SEC}]
RewriteRule .* - [E=INFO_TIME_WDAY:%{TIME_WDAY}]
RewriteRule .* - [E=INFO_TIME_YEAR:%{TIME_YEAR}]
RewriteRule .* - [E=INFO_TZ:%{TZ}]
RewriteRule .* - [E=INFO_UNIQUE_ID:%{UNIQUE_ID}]
&nbsp;
RequestHeader set INFO_API_VERSION &quot;%{INFO_API_VERSION}e&quot;
RequestHeader set INFO_AUTH_TYPE &quot;%{INFO_AUTH_TYPE}e&quot;
RequestHeader set INFO_CONTENT_LENGTH &quot;%{INFO_CONTENT_LENGTH}e&quot;
RequestHeader set INFO_CONTENT_TYPE &quot;%{INFO_CONTENT_TYPE}e&quot;
RequestHeader set INFO_DOCUMENT_ROOT &quot;%{INFO_DOCUMENT_ROOT}e&quot;
RequestHeader set INFO_GATEWAY_INTERFACE &quot;%{INFO_GATEWAY_INTERFACE}e&quot;
RequestHeader set INFO_HTTPS &quot;%{INFO_HTTPS}e&quot;
RequestHeader set INFO_HTTP_ACCEPT &quot;%{INFO_HTTP_ACCEPT}e&quot;
RequestHeader set INFO_HTTP_ACCEPT_LANGUAGE &quot;%{INFO_HTTP_ACCEPT_LANGUAGE}e&quot;
RequestHeader set INFO_HTTP_ACCEPT_ENCODING &quot;%{INFO_HTTP_ACCEPT_ENCODING}e&quot;
RequestHeader set INFO_HTTP_ACCEPT_CHARSET &quot;%{INFO_HTTP_ACCEPT_CHARSET}e&quot;
RequestHeader set INFO_HTTP_CACHE_CONTROL &quot;%{INFO_HTTP_CACHE_CONTROL}e&quot;
RequestHeader set INFO_HTTP_CONNECTION &quot;%{INFO_HTTP_CONNECTION}e&quot;
RequestHeader set INFO_HTTP_COOKIE &quot;%{INFO_HTTP_COOKIE}e&quot;
RequestHeader set INFO_HTTP_FORWARDED &quot;%{INFO_HTTP_FORWARDED}e&quot;
RequestHeader set INFO_HTTP_HOST &quot;%{INFO_HTTP_HOST}e&quot;
RequestHeader set INFO_HTTP_KEEP_ALIVE &quot;%{INFO_HTTP_KEEP_ALIVE}e&quot;
RequestHeader set INFO_HTTP_PROXY_CONNECTION &quot;%{INFO_HTTP_PROXY_CONNECTION}e&quot;
RequestHeader set INFO_HTTP_REFERER &quot;%{INFO_HTTP_REFERER}e&quot;
RequestHeader set INFO_HTTP_USER_AGENT &quot;%{INFO_HTTP_USER_AGENT}e&quot;
RequestHeader set INFO_IS_SUBREQ &quot;%{INFO_IS_SUBREQ}e&quot;
RequestHeader set INFO_ORIG_PATH_INFO &quot;%{INFO_ORIG_PATH_INFO}e&quot;
RequestHeader set INFO_ORIG_PATH_TRANSLATED &quot;%{INFO_ORIG_PATH_TRANSLATED}e&quot;
RequestHeader set INFO_ORIG_SCRIPT_FILENAME &quot;%{INFO_ORIG_SCRIPT_FILENAME}e&quot;
RequestHeader set INFO_ORIG_SCRIPT_NAME &quot;%{INFO_ORIG_SCRIPT_NAME}e&quot;
RequestHeader set INFO_PATH &quot;%{INFO_PATH}e&quot;
RequestHeader set INFO_PATH_INFO &quot;%{INFO_PATH_INFO}e&quot;
RequestHeader set INFO_QUERY_STRING &quot;%{INFO_QUERY_STRING}e&quot;
RequestHeader set INFO_REDIRECT_QUERY_STRING &quot;%{INFO_REDIRECT_QUERY_STRING}e&quot;
RequestHeader set INFO_REDIRECT_REMOTE_USER &quot;%{INFO_REDIRECT_REMOTE_USER}e&quot;
RequestHeader set INFO_REDIRECT_STATUS &quot;%{INFO_REDIRECT_STATUS}e&quot;
RequestHeader set INFO_REDIRECT_URL &quot;%{INFO_REDIRECT_URL}e&quot;
RequestHeader set INFO_REMOTE_ADDR &quot;%{INFO_REMOTE_ADDR}e&quot;
RequestHeader set INFO_REMOTE_HOST &quot;%{INFO_REMOTE_HOST}e&quot;
RequestHeader set INFO_REMOTE_IDENT &quot;%{INFO_REMOTE_IDENT}e&quot;
RequestHeader set INFO_REMOTE_PORT &quot;%{INFO_REMOTE_PORT}e&quot;
RequestHeader set INFO_REMOTE_USER &quot;%{INFO_REMOTE_USER}e&quot;
RequestHeader set INFO_REQUEST_FILENAME &quot;%{INFO_REQUEST_FILENAME}e&quot;
RequestHeader set INFO_REQUEST_METHOD &quot;%{INFO_REQUEST_METHOD}e&quot;
RequestHeader set INFO_REQUEST_URI &quot;%{INFO_REQUEST_URI}e&quot;
RequestHeader set INFO_REQUEST_URI &quot;%{INFO_REQUEST_URI}e&quot;
RequestHeader set INFO_SCRIPT_FILENAME &quot;%{INFO_SCRIPT_FILENAME}e&quot;
RequestHeader set INFO_SCRIPT_GROUP &quot;%{INFO_SCRIPT_GROUP}e&quot;
RequestHeader set INFO_SCRIPT_NAME &quot;%{INFO_SCRIPT_NAME}e&quot;
RequestHeader set INFO_SCRIPT_URI &quot;%{INFO_SCRIPT_URI}e&quot;
RequestHeader set INFO_SCRIPT_URL &quot;%{INFO_SCRIPT_URL}e&quot;
RequestHeader set INFO_SCRIPT_USER &quot;%{INFO_SCRIPT_USER}e&quot;
RequestHeader set INFO_SERVER_ADDR &quot;%{INFO_SERVER_ADDR}e&quot;
RequestHeader set INFO_SERVER_ADMIN &quot;%{INFO_SERVER_ADMIN}e&quot;
RequestHeader set INFO_SERVER_NAME &quot;%{INFO_SERVER_NAME}e&quot;
RequestHeader set INFO_SERVER_PORT &quot;%{INFO_SERVER_PORT}e&quot;
RequestHeader set INFO_SERVER_PROTOCOL &quot;%{INFO_SERVER_PROTOCOL}e&quot;
RequestHeader set INFO_SERVER_SIGNATURE &quot;%{INFO_SERVER_SIGNATURE}e&quot;
RequestHeader set INFO_SERVER_SOFTWARE &quot;%{INFO_SERVER_SOFTWARE}e&quot;
RequestHeader set INFO_THE_REQUEST &quot;%{INFO_THE_REQUEST}e&quot;
RequestHeader set INFO_TIME &quot;%{INFO_TIME}e&quot;
RequestHeader set INFO_TIME_DAY &quot;%{INFO_TIME_DAY}e&quot;
RequestHeader set INFO_TIME_HOUR &quot;%{INFO_TIME_HOUR}e&quot;
RequestHeader set INFO_TIME_MIN &quot;%{INFO_TIME_MIN}e&quot;
RequestHeader set INFO_TIME_MON &quot;%{INFO_TIME_MON}e&quot;
RequestHeader set INFO_TIME_SEC &quot;%{INFO_TIME_SEC}e&quot;
RequestHeader set INFO_TIME_WDAY &quot;%{INFO_TIME_WDAY}e&quot;
RequestHeader set INFO_TIME_YEAR &quot;%{INFO_TIME_YEAR}e&quot;
RequestHeader set INFO_TZ &quot;%{INFO_TZ}e&quot;
RequestHeader set INFO_UNIQUE_ID &quot;%{INFO_UNIQUE_ID}e&quot;
&nbsp;
Options +FollowSymLinks +ExecCGI
DirectoryIndex /cgi-bin/rewrite-test/index.php
&nbsp;
Header echo ^.*
&nbsp;
AuthType Digest
AuthName &quot;AskApache Pro&quot;
AuthDigestFile /home/askapache/sites/askapache.com/.htpasswd-pro
AuthDigestDomain / http://www.askapache.com/cgi-bin/rewrite-test/ https://www.askapache.com/cgi-bin/rewrite-test/
Require user askapache
&nbsp;
SetEnv MODSEC_ENABLE=On
&nbsp;
SetEnvIfNoCase ^WWW-Auth &quot;(.+)&quot; HTTP_WWW_AUTHORIZATION=$1
SetEnvIfNoCase ^If &quot;(.+)&quot; HTTP_IF_MODIFIED_SINCE=$1
SetEnvIfNoCase ^If-None-Match$ &quot;(.+)&quot; HTTP_IF_NONE_MATCH=$1
SetEnvIfNoCase ^Cache-Control$ &quot;(.+)&quot; HTTP_CACHE_CONTROL=$1
SetEnvIfNoCase ^Connection$ &quot;(.+)&quot; HTTP_CONNECTION=$1
SetEnvIfNoCase ^Keep-Alive$ &quot;(.+)&quot; HTTP_KEEP_ALIVE=$1
SetEnvIfNoCase ^Authorization$ &quot;(.+)&quot; HTTP_AUTHORIZATION=$1
SetEnvIfNoCase ^Authorization$ &quot;.+username=\&quot;(.+)\&quot;.+&quot; HTTP_REMOTE_USER=$1
SetEnvIfNoCase ^Content-Type$ &quot;(.+)&quot; HTTP_CONTENT_TYPE=$1
SetEnvIfNoCase ^Content-Length$ &quot;(.+)&quot; HTTP_CONTENT_LENGTH=$1
SetEnvIfNoCase Server_Addr &quot;(.+)&quot; SERVER_ADDR=$1
SetEnvIfNoCase Request_Method &quot;(.+)&quot; REQUEST_METHOD=$1
SetEnvIfNoCase Request_Protocol &quot;(.+)&quot; REQUEST_PROTOCOL=$1
SetEnvIfNoCase Request_URI &quot;(.+)&quot; REQUEST_URI=$1
&nbsp;
ErrorDocument 100 /cgi-bin/rewrite-test/index.php?g=100
ErrorDocument 101 /cgi-bin/rewrite-test/index.php?g=101
ErrorDocument 102 /cgi-bin/rewrite-test/index.php?g=102
ErrorDocument 200 /cgi-bin/rewrite-test/index.php?g=200
ErrorDocument 201 /cgi-bin/rewrite-test/index.php?g=201
ErrorDocument 202 /cgi-bin/rewrite-test/index.php?g=202
ErrorDocument 203 /cgi-bin/rewrite-test/index.php?g=203
ErrorDocument 204 /cgi-bin/rewrite-test/index.php?g=204
ErrorDocument 205 /cgi-bin/rewrite-test/index.php?g=205
ErrorDocument 206 /cgi-bin/rewrite-test/index.php?g=206
ErrorDocument 207 /cgi-bin/rewrite-test/index.php?g=207
ErrorDocument 300 /cgi-bin/rewrite-test/index.php?g=300
ErrorDocument 301 /cgi-bin/rewrite-test/index.php?g=301
ErrorDocument 302 /cgi-bin/rewrite-test/index.php?g=302
ErrorDocument 303 /cgi-bin/rewrite-test/index.php?g=303
ErrorDocument 304 /cgi-bin/rewrite-test/index.php?g=304
ErrorDocument 305 /cgi-bin/rewrite-test/index.php?g=305
ErrorDocument 306 /cgi-bin/rewrite-test/index.php?g=306
ErrorDocument 307 /cgi-bin/rewrite-test/index.php?g=307
ErrorDocument 400 /cgi-bin/rewrite-test/index.php?g=400
ErrorDocument 401 /cgi-bin/rewrite-test/index.php?g=401
ErrorDocument 402 /cgi-bin/rewrite-test/index.php?g=402
ErrorDocument 403 /cgi-bin/rewrite-test/index.php?g=403
ErrorDocument 404 /cgi-bin/rewrite-test/index.php?g=404
ErrorDocument 405 /cgi-bin/rewrite-test/index.php?g=405
ErrorDocument 406 /cgi-bin/rewrite-test/index.php?g=406
ErrorDocument 407 /cgi-bin/rewrite-test/index.php?g=407
ErrorDocument 408 /cgi-bin/rewrite-test/index.php?g=408
ErrorDocument 409 /cgi-bin/rewrite-test/index.php?g=409
ErrorDocument 410 /cgi-bin/rewrite-test/index.php?g=410
ErrorDocument 411 /cgi-bin/rewrite-test/index.php?g=411
ErrorDocument 412 /cgi-bin/rewrite-test/index.php?g=412
ErrorDocument 413 /cgi-bin/rewrite-test/index.php?g=413
ErrorDocument 414 /cgi-bin/rewrite-test/index.php?g=414
ErrorDocument 415 /cgi-bin/rewrite-test/index.php?g=415
ErrorDocument 416 /cgi-bin/rewrite-test/index.php?g=416
ErrorDocument 417 /cgi-bin/rewrite-test/index.php?g=417
ErrorDocument 418 /cgi-bin/rewrite-test/index.php?g=418
ErrorDocument 419 /cgi-bin/rewrite-test/index.php?g=419
ErrorDocument 420 /cgi-bin/rewrite-test/index.php?g=420
ErrorDocument 421 /cgi-bin/rewrite-test/index.php?g=421
ErrorDocument 422 /cgi-bin/rewrite-test/index.php?g=422
ErrorDocument 423 /cgi-bin/rewrite-test/index.php?g=423
ErrorDocument 424 /cgi-bin/rewrite-test/index.php?g=424
ErrorDocument 425 /cgi-bin/rewrite-test/index.php?g=425
ErrorDocument 426 /cgi-bin/rewrite-test/index.php?g=426
ErrorDocument 500 /cgi-bin/rewrite-test/index.php?g=500
ErrorDocument 501 /cgi-bin/rewrite-test/index.php?g=501
ErrorDocument 502 /cgi-bin/rewrite-test/index.php?g=502
ErrorDocument 503 /cgi-bin/rewrite-test/index.php?g=503
ErrorDocument 504 /cgi-bin/rewrite-test/index.php?g=504
ErrorDocument 505 /cgi-bin/rewrite-test/index.php?g=505
ErrorDocument 506 /cgi-bin/rewrite-test/index.php?g=506
ErrorDocument 507 /cgi-bin/rewrite-test/index.php?g=507
ErrorDocument 508 /cgi-bin/rewrite-test/index.php?g=508
ErrorDocument 509 /cgi-bin/rewrite-test/index.php?g=509
ErrorDocument 510 /cgi-bin/rewrite-test/index.php?g=510
&nbsp;
RewriteEngine On
RewriteBase /
&nbsp;
RewriteRule .* - [E=IN_AUTH_TYPE:%{AUTH_TYPE}]
RewriteRule .* - [E=IN_CONTENT_LENGTH:%{CONTENT_LENGTH}]
RewriteRule .* - [E=IN_CONTENT_TYPE:%{CONTENT_TYPE}]
RewriteRule .* - [E=IN_DATE_GMT:%{DATE_GMT}]
RewriteRule .* - [E=IN_DATE_LOCAL:%{DATE_LOCAL}]
RewriteRule .* - [E=IN_DOCUMENT_NAME:%{DOCUMENT_NAME}]
RewriteRule .* - [E=IN_DOCUMENT_PATH_INFO:%{DOCUMENT_PATH_INFO}]
RewriteRule .* - [E=IN_DOCUMENT_ROOT:%{DOCUMENT_ROOT}]
RewriteRule .* - [E=IN_DOCUMENT_URI:%{DOCUMENT_URI}]
RewriteRule .* - [E=IN_GATEWAY_INTERFACE:%{GATEWAY_INTERFACE}]
RewriteRule .* - [E=IN_LAST_MODIFIED:%{LAST_MODIFIED}]
RewriteRule .* - [E=IN_PATH_INFO:%{PATH_INFO}]
RewriteRule .* - [E=IN_PATH_TRANSLATED:%{PATH_TRANSLATED}]
RewriteRule .* - [E=IN_QUERY_STRING:%{QUERY_STRING}]
RewriteRule .* - [E=IN_QUERY_STRING_UNESCAPED:%{QUERY_STRING_UNESCAPED}]
RewriteRule .* - [E=IN_REMOTE_ADDR:%{REMOTE_ADDR}]
RewriteRule .* - [E=IN_REMOTE_HOST:%{REMOTE_HOST}]
RewriteRule .* - [E=IN_REMOTE_IDENT:%{REMOTE_IDENT}]
RewriteRule .* - [E=IN_REMOTE_PORT:%{REMOTE_PORT}]
RewriteRule .* - [E=IN_REMOTE_USER:%{REMOTE_USER}]
RewriteRule .* - [E=IN_REDIRECT_HANDLER:%{REDIRECT_HANDLER}]
RewriteRule .* - [E=IN_REDIRECT_QUERY_STRING:%{REDIRECT_QUERY_STRING}]
RewriteRule .* - [E=IN_REDIRECT_REMOTE_USER:%{REDIRECT_REMOTE_USER}]
RewriteRule .* - [E=IN_REDIRECT_STATUS:%{REDIRECT_STATUS}]
RewriteRule .* - [E=IN_REDIRECT_URL:%{REDIRECT_URL}]
RewriteRule .* - [E=IN_REQUEST_METHOD:%{REQUEST_METHOD}]
RewriteRule .* - [E=IN_REQUEST_URI:%{REQUEST_URI}]
RewriteRule .* - [E=IN_SCRIPT_FILENAME:%{SCRIPT_FILENAME}]
RewriteRule .* - [E=IN_SCRIPT_NAME:%{SCRIPT_NAME}]
RewriteRule .* - [E=IN_SERVER_ADMIN:%{SERVER_ADMIN}]
RewriteRule .* - [E=IN_SERVER_NAME:%{SERVER_NAME}]
RewriteRule .* - [E=IN_SERVER_ADDR:%{SERVER_ADDR}]
RewriteRule .* - [E=IN_SERVER_PORT:%{SERVER_PORT}]
RewriteRule .* - [E=IN_SERVER_PROTOCOL:%{SERVER_PROTOCOL}]
RewriteRule .* - [E=IN_SERVER_SIGNATURE:%{SERVER_SIGNATURE}]
RewriteRule .* - [E=IN_SERVER_SOFTWARE:%{SERVER_SOFTWARE}]
RewriteRule .* - [E=IN_USER_NAME:%{USER_NAME}]
RewriteRule .* - [E=IN_TZ:%{TZ}]
RewriteRule .* - [E=IN_API_VERSION:%{API_VERSION}]
RewriteRule .* - [E=IN_HTTPS:%{HTTPS}]
RewriteRule .* - [E=IN_HTTP_ACCEPT:%{HTTP_ACCEPT}]
RewriteRule .* - [E=IN_HTTP_ACCEPT_CHARSET:%{HTTP_ACCEPT_CHARSET}]
RewriteRule .* - [E=IN_HTTP_ACCEPT_ENCODING:%{HTTP_ACCEPT_ENCODING}]
RewriteRule .* - [E=IN_HTTP_ACCEPT_LANGUAGE:%{HTTP_ACCEPT_LANGUAGE}]
RewriteRule .* - [E=IN_HTTP_CACHE_CONTROL:%{HTTP_CACHE_CONTROL}]
RewriteRule .* - [E=IN_HTTP_CONNECTION:%{HTTP_CONNECTION}]
RewriteRule .* - [E=IN_HTTP_COOKIE:%{HTTP_COOKIE}]
RewriteRule .* - [E=IN_HTTP_FORWARDED:%{HTTP_FORWARDED}]
RewriteRule .* - [E=IN_HTTP_HOST:%{HTTP_HOST}]
RewriteRule .* - [E=IN_HTTP_KEEP_ALIVE:%{HTTP_KEEP_ALIVE}]
RewriteRule .* - [E=IN_HTTP_PROXY_CONNECTION:%{HTTP_PROXY_CONNECTION}]
RewriteRule .* - [E=IN_HTTP_REFERER:%{HTTP_REFERER}]
RewriteRule .* - [E=IN_HTTP_USER_AGENT:%{HTTP_USER_AGENT}]
RewriteRule .* - [E=IN_IS_SUBREQ:%{IS_SUBREQ}]
RewriteRule .* - [E=IN_ORIG_PATH_INFO:%{ORIG_PATH_INFO}]
RewriteRule .* - [E=IN_ORIG_PATH_TRANSLATED:%{ORIG_PATH_TRANSLATED}]
RewriteRule .* - [E=IN_ORIG_SCRIPT_FILENAME:%{ORIG_SCRIPT_FILENAME}]
RewriteRule .* - [E=IN_ORIG_SCRIPT_NAME:%{ORIG_SCRIPT_NAME}]
RewriteRule .* - [E=IN_PATH:%{PATH}]
RewriteRule .* - [E=IN_PHP_SELF:%{PHP_SELF}]
RewriteRule .* - [E=IN_REQUEST_FILENAME:%{REQUEST_FILENAME}]
RewriteRule .* - [E=IN_REQUEST_TIME:%{REQUEST_TIME}]
RewriteRule .* - [E=IN_SCRIPT_GROUP:%{SCRIPT_GROUP}]
RewriteRule .* - [E=IN_SCRIPT_USER:%{SCRIPT_USER}]
RewriteRule .* - [E=IN_THE_REQUEST:%{THE_REQUEST}]
RewriteRule .* - [E=IN_TIME:%{TIME}]
RewriteRule .* - [E=IN_TIME_DAY:%{TIME_DAY}]
RewriteRule .* - [E=IN_TIME_HOUR:%{TIME_HOUR}]
RewriteRule .* - [E=IN_TIME_MIN:%{TIME_MIN}]
RewriteRule .* - [E=IN_TIME_MON:%{TIME_MON}]
RewriteRule .* - [E=IN_TIME_SEC:%{TIME_SEC}]
RewriteRule .* - [E=IN_TIME_WDAY:%{TIME_WDAY}]
RewriteRule .* - [E=IN_TIME_YEAR:%{TIME_YEAR}]
RewriteRule .* - [E=IN_PATH:%{PATH}]
RewriteRule .* - [E=IN_SCRIPT_URI:%{SCRIPT_URI}]
RewriteRule .* - [E=IN_SCRIPT_URL:%{SCRIPT_URL}]
RewriteRule .* - [E=IN_UNIQUE_ID:%{UNIQUE_ID}]
&nbsp;
RewriteRule .* - [E=ENV_PATH:%{ENV:PATH}]
RewriteRule .* - [E=ENV_SCRIPT_URI:%{ENV:SCRIPT_URI}]
RewriteRule .* - [E=ENV_SCRIPT_URL:%{ENV:SCRIPT_URL}]
RewriteRule .* - [E=ENV_UNIQUE_ID:%{ENV:UNIQUE_ID}]
&nbsp;
RequestHeader set AUTH_TYPE &quot;%{IN_AUTH_TYPE}e&quot;
RequestHeader set CONTENT_LENGTH &quot;%{IN_CONTENT_LENGTH}e&quot;
RequestHeader set CONTENT_TYPE &quot;%{IN_CONTENT_TYPE}e&quot;
RequestHeader set DATE_GMT &quot;%{IN_DATE_GMT}e&quot;
RequestHeader set DATE_LOCAL &quot;%{IN_DATE_LOCAL}e&quot;
RequestHeader set DOCUMENT_NAME &quot;%{IN_DOCUMENT_NAME}e&quot;
RequestHeader set DOCUMENT_PATH_INFO &quot;%{IN_DOCUMENT_PATH_INFO}e&quot;
RequestHeader set DOCUMENT_ROOT &quot;%{IN_DOCUMENT_ROOT}e&quot;
RequestHeader set DOCUMENT_URI &quot;%{IN_DOCUMENT_URI}e&quot;
RequestHeader set GATEWAY_INTERFACE &quot;%{IN_GATEWAY_INTERFACE}e&quot;
RequestHeader set LAST_MODIFIED &quot;%{IN_LAST_MODIFIED}e&quot;
RequestHeader set PATH_INFO &quot;%{IN_PATH_INFO}e&quot;
RequestHeader set PATH_TRANSLATED &quot;%{IN_PATH_TRANSLATED}e&quot;
RequestHeader set QUERY_STRING &quot;%{IN_QUERY_STRING}e&quot;
RequestHeader set QUERY_STRING_UNESCAPED &quot;%{IN_QUERY_STRING_UNESCAPED}e&quot;
RequestHeader set REMOTE_ADDR &quot;%{IN_REMOTE_ADDR}e&quot;
RequestHeader set REMOTE_HOST &quot;%{IN_REMOTE_HOST}e&quot;
RequestHeader set REMOTE_IDENT &quot;%{IN_REMOTE_IDENT}e&quot;
RequestHeader set REMOTE_PORT &quot;%{IN_REMOTE_PORT}e&quot;
RequestHeader set REMOTE_USER &quot;%{IN_REMOTE_USER}e&quot;
RequestHeader set REDIRECT_HANDLER &quot;%{IN_REDIRECT_HANDLER}e&quot;
RequestHeader set REDIRECT_QUERY_STRING &quot;%{IN_REDIRECT_QUERY_STRING}e&quot;
RequestHeader set REDIRECT_REMOTE_USER &quot;%{IN_REDIRECT_REMOTE_USER}e&quot;
RequestHeader set REDIRECT_STATUS &quot;%{IN_REDIRECT_STATUS}e&quot;
RequestHeader set REDIRECT_URL &quot;%{IN_REDIRECT_URL}e&quot;
RequestHeader set REQUEST_METHOD &quot;%{IN_REQUEST_METHOD}e&quot;
RequestHeader set REQUEST_URI &quot;%{IN_REQUEST_URI}e&quot;
RequestHeader set SCRIPT_FILENAME &quot;%{IN_SCRIPT_FILENAME}e&quot;
RequestHeader set SCRIPT_NAME &quot;%{IN_SCRIPT_NAME}e&quot;
RequestHeader set SCRIPT_URI &quot;%{IN_SCRIPT_URI}e&quot;
RequestHeader set SCRIPT_URL &quot;%{IN_SCRIPT_URL}e&quot;
RequestHeader set SERVER_ADMIN &quot;%{IN_SERVER_ADMIN}e&quot;
RequestHeader set SERVER_NAME &quot;%{IN_SERVER_NAME}e&quot;
RequestHeader set SERVER_ADDR &quot;%{IN_SERVER_ADDR}e&quot;
RequestHeader set SERVER_PORT &quot;%{IN_SERVER_PORT}e&quot;
RequestHeader set SERVER_PROTOCOL &quot;%{IN_SERVER_PROTOCOL}e&quot;
RequestHeader set SERVER_SIGNATURE &quot;%{IN_SERVER_SIGNATURE}e&quot;
RequestHeader set SERVER_SOFTWARE &quot;%{IN_SERVER_SOFTWARE}e&quot;
RequestHeader set UNIQUE_ID &quot;%{IN_UNIQUE_ID}e&quot;
RequestHeader set USER_NAME &quot;%{IN_USER_NAME}e&quot;
RequestHeader set TZ &quot;%{IN_TZ}e&quot;
RequestHeader set API_VERSION &quot;%{IN_API_VERSION}e&quot;
RequestHeader set HTTPS &quot;%{IN_HTTPS}e&quot;
RequestHeader set HTTP_ACCEPT &quot;%{IN_HTTP_ACCEPT}e&quot;
RequestHeader set HTTP_ACCEPT_CHARSET &quot;%{IN_HTTP_ACCEPT_CHARSET}e&quot;
RequestHeader set HTTP_ACCEPT_ENCODING &quot;%{IN_HTTP_ACCEPT_ENCODING}e&quot;
RequestHeader set HTTP_ACCEPT_LANGUAGE &quot;%{IN_HTTP_ACCEPT_LANGUAGE}e&quot;
RequestHeader set HTTP_CACHE_CONTROL &quot;%{IN_HTTP_CACHE_CONTROL}e&quot;
RequestHeader set HTTP_CONNECTION &quot;%{IN_HTTP_CONNECTION}e&quot;
RequestHeader set HTTP_COOKIE &quot;%{IN_HTTP_COOKIE}e&quot;
RequestHeader set HTTP_FORWARDED &quot;%{IN_HTTP_FORWARDED}e&quot;
RequestHeader set HTTP_HOST &quot;%{IN_HTTP_HOST}e&quot;
RequestHeader set HTTP_KEEP_ALIVE &quot;%{IN_HTTP_KEEP_ALIVE}e&quot;
RequestHeader set HTTP_PROXY_CONNECTION &quot;%{IN_HTTP_PROXY_CONNECTION}e&quot;
RequestHeader set HTTP_REFERER &quot;%{IN_HTTP_REFERER}e&quot;
RequestHeader set HTTP_USER_AGENT &quot;%{IN_HTTP_USER_AGENT}e&quot;
RequestHeader set IS_SUBREQ &quot;%{IN_IS_SUBREQ}e&quot;
RequestHeader set ORIG_PATH_INFO &quot;%{IN_ORIG_PATH_INFO}e&quot;
RequestHeader set ORIG_PATH_TRANSLATED &quot;%{IN_ORIG_PATH_TRANSLATED}e&quot;
RequestHeader set ORIG_SCRIPT_FILENAME &quot;%{IN_ORIG_SCRIPT_FILENAME}e&quot;
RequestHeader set ORIG_SCRIPT_NAME &quot;%{IN_ORIG_SCRIPT_NAME}e&quot;
RequestHeader set PATH &quot;%{IN_PATH}e&quot;
RequestHeader set PHP_SELF &quot;%{IN_PHP_SELF}e&quot;
RequestHeader set REQUEST_FILENAME &quot;%{IN_REQUEST_FILENAME}e&quot;
RequestHeader set REQUEST_TIME &quot;%{IN_REQUEST_TIME}e&quot;
RequestHeader set SCRIPT_GROUP &quot;%{IN_SCRIPT_GROUP}e&quot;
RequestHeader set SCRIPT_USER &quot;%{IN_SCRIPT_USER}e&quot;
RequestHeader set THE_REQUEST &quot;%{IN_THE_REQUEST}e&quot;
RequestHeader set TIME &quot;%{IN_TIME}e&quot;
RequestHeader set TIME_DAY &quot;%{IN_TIME_DAY}e&quot;
RequestHeader set TIME_HOUR &quot;%{IN_TIME_HOUR}e&quot;
RequestHeader set TIME_MIN &quot;%{IN_TIME_MIN}e&quot;
RequestHeader set TIME_MON &quot;%{IN_TIME_MON}e&quot;
RequestHeader set TIME_SEC &quot;%{IN_TIME_SEC}e&quot;
RequestHeader set TIME_WDAY &quot;%{IN_TIME_WDAY}e&quot;
RequestHeader set TIME_YEAR &quot;%{IN_TIME_YEAR}e&quot;
&nbsp;
SetEnvIfNoCase ^WWW-Auth &quot;(.+)&quot; HTTP_WWW_AUTHORIZATION=$1
SetEnvIfNoCase ^If &quot;(.+)&quot; HTTP_IF_MODIFIED_SINCE=$1
SetEnvIfNoCase ^If-None-Match$ &quot;(.+)&quot; HTTP_IF_NONE_MATCH=$1
SetEnvIfNoCase ^Cache-Control$ &quot;(.+)&quot; HTTP_CACHE_CONTROL=$1
SetEnvIfNoCase ^Connection$ &quot;(.+)&quot; HTTP_CONNECTION=$1
SetEnvIfNoCase ^Keep-Alive$ &quot;(.+)&quot; HTTP_KEEP_ALIVE=$1
SetEnvIfNoCase ^Authorization$ &quot;(.+)&quot; HTTP_AUTHORIZATION=$1
SetEnvIfNoCase ^Content-Type$ &quot;(.+)&quot; HTTP_CONTENT_TYPE=$1
SetEnvIfNoCase ^Content-Length$ &quot;(.+)&quot; HTTP_CONTENT_LENGTH=$1
SetEnvIfNoCase ^Authorization$ &quot;.+username=\&quot;([a-zA-Z0-9]+)\&quot;.+&quot; REMOTE_USER=$1
SetEnvIfNoCase Server_Addr &quot;(.+)&quot; SERVER_ADDR=$1
SetEnvIfNoCase Request_Method &quot;(.+)&quot; REQUEST_METHOD=$1
SetEnvIfNoCase Request_Protocol &quot;(.+)&quot; REQUEST_PROTOCOL=$1
SetEnvIfNoCase Request_URI &quot;(.+)&quot; REQUEST_URI=$1
&nbsp;
RequestHeader set IF_MODIFIED_SINCE &quot;%{HTTP_IF_MODIFIED_SINCE}e&quot;
RequestHeader set IF_NONE_MATCH &quot;%{HTTP_IF_NONE_MATCH}e&quot;
RequestHeader set CACHE_CONTROL &quot;%{HTTP_CACHE_CONTROL}e&quot;
RequestHeader set CONNECTION &quot;%{HTTP_CONNECTION}e&quot;
RequestHeader set KEEP_ALIVE &quot;%{HTTP_KEEP_ALIVE}e&quot;
RequestHeader set AUTHORIZATION &quot;%{HTTP_AUTHORIZATION}e&quot;
RequestHeader set REMOTE_USER &quot;%{REMOTE_USER}e&quot;
RequestHeader set CONTENT_TYPE &quot;%{HTTP_CONTENT_TYPE}e&quot;
RequestHeader set CONTENT_LENGTH &quot;%{HTTP_CONTENT_LENGTH}e&quot;
RequestHeader set SERVER_ADDR &quot;%{SERVER_ADDR}e&quot;
RequestHeader set REQUEST_METHOD &quot;%{REQUEST_METHOD}e&quot;
RequestHeader set REQUEST_PROTOCOL &quot;%{REQUEST_PROTOCOL}e&quot;
RequestHeader set REQUEST_URI &quot;%{REQUEST_URI}e&quot;
&nbsp;
RequestHeader set UNIQUE_ID &quot;%{ENV_UNIQUE_ID}e&quot;
RequestHeader set SCRIPT_URL &quot;%{ENV_SCRIPT_URL}e&quot;
RequestHeader set SCRIPT_URI &quot;%{ENV_SCRIPT_URI}e&quot;
RequestHeader set PATH &quot;%{ENV_PATH}e&quot;
&nbsp;
Options +ExecCGI +FollowSymLinks
&nbsp;
Order Deny,Allow
Deny from All
Allow from 208.113.134.190  64.111.114.111 208.113.134.203 208.113.152.201 env=REDIRECT_STATUS
Satisfy Any
&nbsp;
SecFilterEngine Off</pre>
<h2>More Mod_Security (1)</h2>
<pre>#
# Order Deny,Allow
# First, all Allow directives are evaluated; at least one must match, or the request is rejected.
# Next, all Deny directives are evaluated. If any matches, the request is rejected.
# Last, any requests which do not match an Allow or a Deny directive are denied by default.
#
Order Allow,Deny
Allow from all
Deny from 217.219.
&nbsp;
#Order Deny,Allow
# First, all Deny directives are evaluated; if any match, the request is denied unless it also matches an Allow directive.
# Any requests which do not match any Allow or Deny directives are permitted.
&nbsp;
#SetEnvIf content-type (multipart/form-data)(.*) NEW_CONTENT_TYPE=application/x-www-form-urlencoded$2 OLD_CONTENT_TYPE=$1$2
#RequestHeader set content-type %{NEW_CONTENT_TYPE}e env=NEW_CONTENT_TYPE
SetEnvIfNoCase Content-Type &quot;^multipart/form-data&quot; !MODSEC_NOPOSTBUFFERING
SetEnvIfNoCase Content-Type &quot;^application/x-www-form-urlencoded&quot; !MODSEC_NOPOSTBUFFERING
SetEnv suppress-error-charset
SetEnvIfNoCase Content-Type &quot;^multipart/form-data&quot; !MODSEC_NOPOSTBUFFERING
&nbsp;
SetEnvIf Request_URI &quot;^/(cgi-bin/search\.php|cgi-bin/java\.cgi|wp-admin/.*)&quot; MODSEC_ENABLE=Off
SetEnvIf Request_URI &quot;^/(online-tools/js-compress.*)&quot; &quot;MODSEC_NOPOSTBUFFERING=Do not buffer file uploads&quot;
SetEnvIfNoCase Remote_Addr ^208\.113\.134\.190$ MODSEC_ENABLE=Off
SetEnvIfNoCase Remote_Addr ^64\.111\.114\.111$ MODSEC_ENABLE=Off
&nbsp;
### Section 1: Global Environment
#
# The directives in this section affect the overall operation of Apache,
# such as the number of concurrent requests it can handle or where it
# can find its configuration files.
#
#
# TZ: Your address, where problems with the server should be
# e-mailed.  This address appears on some server-generated pages, such
# as error documents.  e.g. admin@your-domain.com
#
SetEnv TZ America/Indianapolis
&nbsp;
#
# ServerAdmin: Your address, where problems with the server should be
# e-mailed.  This address appears on some server-generated pages, such
# as error documents.  e.g. admin@your-domain.com
#
SetEnv SERVER_ADMIN webmaster@askapache.com
&nbsp;
#
# Optionally add a line containing the server version and virtual host
# name to server-generated pages (internal error documents, FTP directory
# listings, mod_status and mod_info output etc., but not CGI generated
# documents or custom error documents).
# Set to &quot;EMail&quot; to also include a mailto: link to the ServerAdmin.
# Set to one of:  On | Off | EMail
#
ServerSignature Off
&nbsp;
#
# Possible values for the Options directive are &quot;None&quot;, &quot;All&quot;,
# or any combination of:
#   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#
# The Options directive is both complicated and important.  Please see
# http://httpd.apache.org/docs/2.0/mod/core.html#options
# for more information.
#
Options -Indexes -Includes -ExecCGI -MultiViews
&nbsp;
#
# DirectoryIndex: sets the file that Apache will serve if a directory
# is requested.
#
DirectoryIndex index.php
&nbsp;
#
# Action lets you define media types that will execute a script whenever
# a matching file is called. This eliminates the need for repeated URL
# pathnames for oft-used CGI file processors.
# Format: Action media/type /cgi-script/location
# Format: Action handler-name /cgi-script/location
#
Action php5-cgi /bin/php.cgi
&nbsp;
#
# AddHandler allows you to map certain file extensions to &quot;handlers&quot;:
# actions unrelated to filetype. These can be either built into the server
# or added with the Action directive (see below)
#
# To use CGI scripts outside of ScriptAliased directories:
# (You will also need to add &quot;ExecCGI&quot; to the &quot;Options&quot; directive.)
#
AddHandler php5-cgi .php .inc
&nbsp;
#
# Commonly used filename extensions to character sets. You probably
# want to avoid clashes with the language extensions, unless you
# are good at carefully testing your setup after each change.
# See http://www.iana.org/assignments/character-sets for the
# official list of charset names and their respective RFCs.
#
AddDefaultCharset UTF-8
&nbsp;
#
# AddType allows you to add to or override the MIME configuration
# file mime.types for specific file types.
#
#
AddType &#039;application/rdf+xml; charset=UTF-8&#039; .rdf
AddType &#039;application/xhtml+xml; charset=UTF-8&#039; .xhtml
AddType &#039;application/xhtml+xml; charset=UTF-8&#039; .xhtml.gz
AddType &#039;text/html; charset=UTF-8&#039; .html
AddType &#039;text/html; charset=UTF-8&#039; .html.gz
AddType application/octet-stream .rar .chm .bz2 .tgz .msi .pdf .exe
AddType application/vnd.ms-excel .csv
AddType application/x-httpd-php-source .phps
AddType application/x-pilot .prc .pdb
AddType application/x-shockwave-flash .swf
AddType application/xrds+xml .xrdf
AddType text/plain .ini .sh .bsh .bash .awk .nawk .gawk .csh .var .c .in .h .asc .md5 .sha .sha1
AddType video/x-flv .flv
&nbsp;
#
# AddEncoding allows you to have certain browsers uncompress
# information on the fly. Note: Not all browsers support this.
# Despite the name similarity, the following Add* directives have nothing
# to do with the FancyIndexing customization directives above.
#
AddEncoding x-compress .Z
AddEncoding x-gzip .gz .tgz
&nbsp;
#
# DefaultType: the default MIME type the server will use for a document
# if it cannot otherwise determine one, such as from filename extensions.
# If your server contains mostly text or HTML documents, &quot;text/plain&quot; is
# a good value.  If most of your content is binary, such as applications
# or images, you may want to use &quot;application/octet-stream&quot; instead to
# keep browsers from trying to display binary files as though they are
# text.
#
DefaultType text/html</pre>
<h2>Error Documents</h2>
<pre>#
# Customizable error responses come in three flavors:
# 1) plain text 2) local redirects 3) external redirects
#
#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
&nbsp;
#ErrorDocument 100 /e/100_CONTINUE.html
#ErrorDocument 101 /e/101_SWITCHING_PROTOCOLS.html
#ErrorDocument 102 /e/102_PROCESSING.html
&nbsp;
#ErrorDocument 200 /e/200_OK.html
#ErrorDocument 201 /e/201_CREATED.html
#ErrorDocument 202 /e/202_ACCEPTED.html
#ErrorDocument 203 /e/203_NON_AUTHORITATIVE.html
#ErrorDocument 204 /e/204_NO_CONTENT.html
#ErrorDocument 205 /e/205_RESET_CONTENT.html
#ErrorDocument 206 /e/206_PARTIAL_CONTENT.html
#ErrorDocument 207 /e/207_MULTI_STATUS.html
&nbsp;
#ErrorDocument 300 /e/300_MULTIPLE_CHOICES.html
#ErrorDocument 301 /e/301_MOVED_PERMANENTLY.html
#ErrorDocument 302 /e/302_MOVED_TEMPORARILY.html
#ErrorDocument 303 /e/303_SEE_OTHER.html
#ErrorDocument 304 /e/304_NOT_MODIFIED.html
#ErrorDocument 305 /e/305_USE_PROXY.html
#ErrorDocument 307 /e/307_TEMPORARY_REDIRECT.html
&nbsp;
ErrorDocument 400 /e/400_BAD_REQUEST.html
ErrorDocument 401 /e/401_UNAUTHORIZED.html
ErrorDocument 402 /e/402_PAYMENT_REQUIRED.html
ErrorDocument 403 /e/403_FORBIDDEN.html
#ErrorDocument 404 /e/404_NOT_FOUND.html
ErrorDocument 404 /index.php?error=404
ErrorDocument 405 /e/405_METHOD_NOT_ALLOWED.html
ErrorDocument 406 /e/406_NOT_ACCEPTABLE.html
ErrorDocument 407 /e/407_PROXY_AUTHENTICATION_REQUIRED.html
ErrorDocument 408 /e/408_REQUEST_TIME_OUT.html
ErrorDocument 409 /e/409_CONFLICT.html
ErrorDocument 410 /e/410_GONE.html
ErrorDocument 411 /e/411_LENGTH_REQUIRED.html
ErrorDocument 412 /e/412_PRECONDITION_FAILED.html
ErrorDocument 413 /e/413_REQUEST_ENTITY_TOO_LARGE.html
ErrorDocument 414 /e/414_REQUEST_URI_TOO_LARGE.html
ErrorDocument 415 /e/415_UNSUPPORTED_MEDIA_TYPE.html
ErrorDocument 416 /e/416_RANGE_NOT_SATISFIABLE.html
ErrorDocument 417 /e/417_EXPECTATION_FAILED.html
ErrorDocument 422 /e/422_UNPROCESSABLE_ENTITY.html
ErrorDocument 423 /e/423_LOCKED.html
ErrorDocument 424 /e/424_FAILED_DEPENDENCY.html
ErrorDocument 426 /e/426_UPGRADE_REQUIRED.html
ErrorDocument 500 /e/500_INTERNAL_SERVER_ERROR.html
ErrorDocument 501 /e/501_NOT_IMPLEMENTED.html
ErrorDocument 502 /e/502_BAD_GATEWAY.html
ErrorDocument 503 /e/503_SERVICE_UNAVAILABLE.html
ErrorDocument 504 /e/504_GATEWAY_TIME_OUT.html
ErrorDocument 505 /e/505_VERSION_NOT_SUPPORTED.html
ErrorDocument 506 /e/506_VARIANT_ALSO_VARIES.html
ErrorDocument 507 /e/507_INSUFFICIENT_STORAGE.html
ErrorDocument 510 /e/510_NOT_EXTENDED.html</pre>
<h2>Caching</h2>
<p>h2></p>
<pre>#
#  HEADERS and CACHING
#
Header unset Pragma
FileETag None
Header unset ETag
&nbsp;
# 1 YEAR
&lt;FilesMatch &quot;\.(ico|pdf|flv|jpg|jpeg|png|gif|swf)$&quot;&gt;
Header unset P3P
Header unset Pragma
FileETag None
Header unset ETag
Header set Cache-Control &quot;public,max-age=29030400&quot;
Header set Expires &quot;Thu, 15 Apr 2010 20:00:00 GMT&quot;
Header unset Last-Modified
&lt;/FilesMatch&gt;
&nbsp;
# 2 HOURS
&lt;FilesMatch &quot;\.(html|htm|xml|txt|xsl|rdf|rss)$&quot;&gt;
&lt;IfModule mod_expires.c&gt;
ExpiresActive On
ExpiresDefault A3600
&lt;/IfModule&gt;
&lt;/FilesMatch&gt;</pre>
<h2>Redirect Hack</h2>
<pre>#Redirect 400 /e/400
#Redirect 401 /e/401
#Redirect 402 /e/402
#Redirect 403 /e/403
Redirect 404 /index.php?error=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>
<h2>301 PERMANENT REDIRECTS</h2>
<pre>
#
# Redirect allows you to tell clients about documents which used to exist in
# your server&#039;s namespace, but do not anymore. This allows you to tell the
# clients where to look for the relocated document.
#
Redirect 301 /12-lessons-for-those-afraid-of-css.html http://www.askapache.com/css/12-lessons-for-those-afraid-of-css.html
Redirect 301 /2006/htaccess/htaccesselite-ultimate-htaccess-article.html http://www.askapache.com/htaccess/apache-htaccess.html
Redirect 301 /2007/phpbb/sending-post-form-data-with-php-curl.html http://www.askapache.com/htaccess/sending-post-form-data-with-php-curl.html
Redirect 301 /2007/webmaster/custom-phpini-with-fastcgi-on-dreamhost.html http://www.askapache.com/dreamhost/custom-phpini-with-fastcgi-on-dreamhost.html
Redirect 301 /2007/webmaster/custom-phpini-with-fastcgi-on-dreamhost.html http://www.askapache.com/dreamhost/custom-phpini-with-fastcgi-on-dreamhost.html
Redirect 301 /2007/webmaster/php-and-ajax-shell-console.html http://www.askapache.com/tools/php-and-ajax-shell-console.html
Redirect 301 /27-request-methods-for-use-with-apache-and-rewritecond-and-htaccess.html http://www.askapache.com/htaccess/27-request-methods-for-use-with-apache-and-rewritecond-and-htaccess.html
Redirect 301 /404-google-wordpress-plugin.html http://www.askapache.com/seo/404-google-wordpress-plugin.html
Redirect 301 /503-service-temporarily-unavailable.html http://www.askapache.com/htaccess/503-service-temporarily-unavailable.html
Redirect 301 /Overview-about.rdf http://www.askapache.com/askapache-home.rdf
Redirect 301 /abbr-acronym.html http://www.askapache.com/xhtml/abbr-acronym.html
Redirect 301 /adsense-robots.html http://www.askapache.com/google/adsense-robots.html
Redirect 301 /alexa-toolbar-firefox.html http://www.askapache.com/tools/alexa-toolbar-firefox.html
Redirect 301 /allowing-access-from-1-static-ip-and-deny-the-rest.html http://www.askapache.com/htaccess/apache-htaccess.html
Redirect 301 /anti-virus-spyware-rootkit.html http://www.askapache.com/security/anti-virus-spyware-rootkit.html
Redirect 301 /apache-ssl-in-htaccess-examples.html http://www.askapache.com/htaccess/apache-ssl-in-htaccess-examples.html
Redirect 301 /awk-tutorial.html http://www.askapache.com/awk/awk-tutorial.html
Redirect 301 /best-adsense-optimization.html http://www.askapache.com/wordpress/best-adsense-optimization.html
Redirect 301 /commonly-used-htaccess-code-examples.html http://www.askapache.com/htaccess/commonly-used-htaccess-code-examples.html
Redirect 301 /css-background-image-sprite.html http://www.askapache.com/css/css-background-image-sprite.html
Redirect 301 /css-browser-screenshots.html http://www.askapache.com/tools/css-browser-screenshots.html
Redirect 301 /css-class-example.html http://www.askapache.com/css/css-class-example.html
Redirect 301 /curl-multi-downloads.html http://www.askapache.com/php/curl-multi-downloads.html
Redirect 301 /custom-boot-menu-in-windows-xp.html http://www.askapache.com/windows/custom-boot-menu-in-windows-xp.html
Redirect 301 /donate http://www.dreamhost.com/donate.cgi?id=8261
Redirect 301 /donate/ http://www.dreamhost.com/donate.cgi?id=8261
Redirect 301 /htaccess.txt http://z.askapache.com/p/htaccess.txt
Redirect 301 /htaccess/404-errorpages.html http://www.askapache.com/seo/google-ajax-search-seo-tips.html
Redirect 301 /htaccess/feedsmith http://www.askapache.com/htaccess/feedsmith-htaccess.html
Redirect 301 /htaccess/http-status-codes.html http://www.askapache.com/htaccess/apache-status-code-headers-errordocument.html
Redirect 301 /htaccess/instruct-search-engines-to-come-back-to-site-after-you-finish-working-on-it.html http://www.askapache.com/htaccess/503-service-temporarily-unavailable.html
Redirect 301 /htaccess/speed-up-the-apache-web-server-with-configuration-hacks.html http://www.askapache.com/htaccess/apache-web-server-speed-configuration-hacks.html
Redirect 301 /instruct-search-engines-to-come-back-to-site-after-you-finish-working-on-it.html http://www.askapache.com/htaccess/503-service-temporarily-unavailable.html
Redirect 301 /security/bypassing-vlan.html http://www.askapache.com/security/hacking-vlan-switched-networks.html
Redirect 301 /security/bypassing-vlanbypassing-vlan.html http://www.askapache.com/security/hacking-vlan-switched-networks.html
Redirect 301 /security/rigging-the-dreamhost-site-of-the-month-contest.html http://www.askapache.com/dreamhost/rigging-the-dreamhost-site-of-the-month-contest.html
Redirect 301 /seo/tailrankcom-robot.html http://www.askapache.com/seo/tailrank-robot.html
Redirect 301 /webmaster/caching-tutorial-for-webmasters.html http://www.askapache.com/htaccess/caching-tutorial-for-webmasters.html
Redirect 301 /webmaster/lft-traceroute-tool.html http://www.askapache.com/tools/lft-traceroute-tool.html</pre>
<h2>301 PERMANENT REDIRECTMATCH</h2>
<pre>#
#  PERMANENT REDIRECTMATCH
#
#RedirectMatch 301 ^/&amp;(.*)$ http://www.askapache.com/
RedirectMatch 301 ^/(.+)\.html/$ http://www.askapache.com/$1.html
RedirectMatch 301 ^/&amp;amp(.*)$ http://www.askapache.com/
RedirectMatch 301 ^/.*feed\.gif$ http://z.askapache.com/feed.gif
RedirectMatch 301 ^/([^/]+)//$ http://www.askapache.com/$1/
RedirectMatch 301 ^/(.+)/htaccesselite-ultimate-htaccess-article.html(.*) http://www.askapache.com/htaccess/apache-htaccess.html
RedirectMatch 301 ^/(.+)\.html/([a-z][a-z])/$ http://www.askapache.com/$1.html
RedirectMatch 301 ^/([\(]+)(.*)$ http://www.askapache.com/
RedirectMatch 301 ^/([^9]*)9O1X.3y(.*)/(.*)$ http://www.askapache.com/$2
RedirectMatch 301 ^/.3y(.*)$ http://www.askapache.com/
RedirectMatch 301 ^/200([0-9])/([0-9])(.*)$ http://www.askapache.com/top-100/
RedirectMatch 301 ^/200([0-9])/([^01])(.*)$ http://www.askapache.com/$2$3
RedirectMatch 301 ^/about/glossary(.*)$ http://www.askapache.com/glossary$1
RedirectMatch 301 ^/apache-speed(.*)$ http://www.askapache.com/htaccess/apache-speed$1
RedirectMatch 301 ^/category/(.+)$ http://www.askapache.com/$1
RedirectMatch 301 ^/docs/(.*)$ http://askapache.info/$1
RedirectMatch 301 ^/htaccess/feedsmith-htaccess(.*) http://www.askapache.com/htaccess/redirecting-wordpress-feeds-to-feedburner.html
RedirectMatch 301 ^/robots-txt(.*)$ http://www.askapache.com/robots.txt
RedirectMatch 301 ^/hosting/?$ http://www.askapache.com/web-hosting/
RedirectMatch 301 ^/.+favicon.ico$ http://www.askapache.com/favicon.ico
#RedirectMatch 301 ^/wp-content/uploads/(.*)$ http://z.askapache.com/uploads/$1
#RedirectMatch 301 ^/z/(.+)$ http://z.askapache.com/$1
#RedirectMatch 301 ^/(z|t|i|j|c|p)/(.*)$ http://z.askapache.com/$1/$2
&nbsp;
#
#  TEMPORARY REDIRECTMATCH
#
RedirectMatch 307 ^/getflash/?$ http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash
RedirectMatch 307 ^/dream/?$ http://www.askapache.com/dreamhost/
RedirectMatch 307 ^/(cse|apachecse|apachecsetest|apachesearch)/?$ http://www.google.com/coop/cse?cx=002660089121042511758%3Akk7rwc2gx0i
RedirectMatch 307 ^/search/lr-lang(.*)$ http://feeds.askapache.com/apache/htaccess
&nbsp;
#
#  PERMANENT GONE
#
RedirectMatch 410 ^/funny(.*)</pre>
<h2>My Favorite modsec_v1 stuff</h2>
<pre># Pass: Allows request to continue, further filters could still halt request.
# Allow: Allows matching requests through, will not be tested against other filters.
# Deny: Stops the request outright, returns a HTTP 500 error code by default.
# Status: Used to specify an alternate HTTP error code.
# Redirect: Matching requests are redirected to the provided URL.
# Exec: Allows execution of a local system binary or script.
# Log: Logs request only.
# Nolog: Does not log request.
# Chain: Allows you to create list of filters for more granulated security. All filters must be cleared before action is taken with the final filter.
&nbsp;
SecFilterEngine On
SecFilterCheckURLEncoding On
SecFilterCheckUnicodeEncoding Off
SecFilterScanPOST On
&nbsp;
#SecUploadKeepFiles On
#SecUploadDir /home/askapache/sites/askapache.com/logs/sec-upload
#SecUploadApproveScript /home/askapache/sites/askapache.com/htdocs/cgi-bin/check.sh
&nbsp;
#SecRuleEngine On
#SecAuditEngine On
#SecAuditEngine Off
SecAuditEngine RelevantOnly
SecAuditLog /home/askapache/sites/askapache.com/logs/modsec_audit.log
SecFilterDebugLog /home/askapache/sites/askapache.com/logs/modsec_debug.log
SecFilterDebugLevel 1
#SecAuditLogRelevantStatus &quot;^(?:1|2(?!00)|5|4(?!04))&quot;
SecAuditLogRelevantStatus &quot;^(1|2(?!00)|4([0-9](0|1|2|5|6|7|8|9))|5)&quot;
SecFilterForceByteRange 1 255
&nbsp;
#SecFilterInheritance Off
# 0 EMERGENCY - system is unusable
# 1 ALERT - action must be taken immediately
# 2 CRITICAL - critical conditions
# 3 ERROR - error conditions
# 4 WARNING - warning conditions
# 5 NOTICE - normal but significant conditions
# 6 INFO - informational
# 7 DEBUG - debug-level messages
&nbsp;
SecFilterDefaultAction &quot;deny,severity:6,status:403&quot;
&nbsp;
#SecFilterSelective REQUEST_METHOD &quot;POST&quot; &quot;pass,auditlog,severity:6&quot;
SecFilterSelective REQUEST_URI &quot;^/(xmlrpc|wp-comments-post)\.php&quot; &quot;pass,log,auditlog,severity:6&quot;
#SecFilterSelective REMOTE_ADDR ^$ &quot;pass,log,auditlog,severity:6&quot;
#SecFilterSelective REMOTE_ADDR ^203\.221\.91\.20$ &quot;pass,log,auditlog,severity:6&quot;
&nbsp;
#SecFilterSelective REQUEST_URI &quot;^/htaccess.*&quot; &quot;pass,log,auditlog&quot;
#SecFilterSelective REQUEST_URI &quot;^/feed.*&quot; &quot;pass,log,auditlog&quot;
#SecFilterSelective REQUEST_URI &quot;^/.*trackback.*&quot; &quot;pass,log,auditlog&quot;
#SecFilterSelective REQUEST_URI &quot;^/valid.*&quot; &quot;pass,log,auditlog&quot;
&nbsp;
#Enforce proper HTTP requests
SecFilterSelective SERVER_PROTOCOL &quot;!^HTTP/(0\.9|1\.0|1\.1)$&quot; &quot;id:340000,rev:1,severity:6,msg:&#039;Bad HTTP Protocol&#039;&quot;
&nbsp;
# Only accept request encodings we know how to handle
SecFilterSelective REQUEST_METHOD &quot;!^(GET|HEAD|POST)$&quot; &quot;chain,id:340001,rev:1,severity:6,msg:&#039;Restricted HTTP function,status:405&#039;&quot;
SecFilterSelective HTTP_Content-Type &quot;!(^$|^application/x-www-form-urlencoded$|^multipart/form-data)&quot;
&nbsp;
# Require Content-Length to be provided with every POST request
SecFilterSelective REQUEST_METHOD &quot;^POST$&quot; &quot;chain,id:340003,rev:1,severity:6,msg:&#039;Content Length not provided with POST&#039;,status:411&quot;
SecFilterSelective HTTP_Content-Length &quot;^$&quot;
&nbsp;
# Don&#039;t accept transfer encodings we know we don&#039;t handle
# (and you don&#039;t need it anyway)
SecFilterSelective HTTP_Transfer-Encoding &quot;!^$&quot; &quot;id:340004,rev:1,severity:6,msg:&#039;Dis-allowed Transfer Encoding&#039;&quot;
&nbsp;
#Generic rule for allowed characters, adjust for your site before activating
##SecFilterSelective REQUEST_URI &quot;!^[a-zA-Z0-9\.\+\_\/\-\?\=\&amp;\%\#]+$&quot; &quot;chain,id:390002,rev:1,severity:4,msg:&#039;Restricted HTTP character set&#039;&quot;
##SecFilterSelective REQUEST_URI &quot;!^/(openid|wp-admin|wp-includes|wp-content|wp-login.php)&quot;
&nbsp;
#HTTP response splitting generic sigs
#SecFilter &quot;Content-Length\:.*Content-Type\:.*Content-Type\:&quot; &quot;id:340005,rev:1,severity:4,msg:&#039;HTTP response splitting&#039;&quot;
&nbsp;
#HTTP response splitting generic sigs
#SecFilter &quot;Content-Length\:&quot; &quot;chain,id:340006,rev:1,severity:4,msg:&#039;HTTP response splitting&#039;&quot;
#SecFilter &quot;Content-Type\:&quot;
&nbsp;
#catch smuggling attacks
#SecFilter &quot;^(GET|POST).*Host:.*^(GET|POST)&quot;  &quot;id:300012,rev:1,severity:4,msg:&#039;catch smuggling attacks&#039;&quot;
&nbsp;
#XSS insertion into Content-Type
#SecFilterSelective THE_REQUEST &quot;Content-Type\:.*(&lt;[[:space:]]*(script|about|applet|activex|chrome)*&gt;.*(script|about|applet|activex|chrome)[[:space:]]*&gt;|onmouseover=|javascript\:)&quot; &quot;id:300002,rev:1,severity:4,msg:&#039;XSS attack in Content-type header&#039;&quot;
&nbsp;
#Code injection via content length
#SecFilterSelective HTTP_Content-Length|HTTP_USER_AGENT &quot;\;(system|passthru|exec)\(&quot; &quot;id:330003,rev:1,severity:4,msg:&#039;Code Injection in Content-Length header&#039;&quot;
&nbsp;
#Don&#039;t accept chunked encodings modsecurity can not look at these, so this is a hole that can bypass your rules, the rule before this one should cover this, but hey paranoia is cheap
#SecFilterSelective HTTP_Transfer-Encoding &quot;chunked&quot; &quot;id:300003,rev:1,severity:4,msg:&#039;Chunked Transfer Encoding denied&#039;&quot;
&nbsp;
##generic recursion signatures
#SecFilterSelective REQUEST_URI &quot;\.\./\.\./&quot; &quot;id:300004,rev:2,severity:4,msg:&#039;Generic Path Recursion1 denied&#039;&quot;
#SecFilterSelective THE_REQUEST &quot;\.\|\./\.\|\./\.\|&quot; &quot;id:300005,rev:1,severity:4,msg:&#039;Generic Path Recursion2 denied&#039;&quot;
#SecFilterSelective THE_REQUEST &quot;\.\.\./&quot; &quot;id:300006,rev:1,severity:4,msg:&#039;Bogus Path denied&#039;&quot;
&nbsp;
#Generic PHP exploit signatures
#SecFilterSelective REQUEST_URI &quot;&lt;\?php (chr|fwrite|fopen|system|echr|passthru|popen|proc_open|shell_exec|exec|proc_nice|proc_terminate|proc_get_status|proc_close|pfsockopen|leak|apache_child_terminate|posix_kill|posix_mkfifo|posix_setpgid|posix_setsid|posix_setuid|phpinfo)\(.*\)\;&quot; &quot;id:330002,rev:1,severity:4,msg:&#039;Generic PHP exploit pattern denied&#039;&quot;
&nbsp;
#Prevent SQL injection in cookies
##SecFilterSelective COOKIE_VALUES &quot;((select|grant|delete|insert|drop|alter|replace|truncate|update|create|rename|describe)[[:space:]]+[A-Z|a-z|0-9|\*| |\,]+[[:space:]]+(from|into|table|database|index|view)[[:space:]]+[A-Z|a-z|0-9|\*| |\,]|UNION SELECT.*\&#039;.*\&#039;.*,[0-9].*INTO.*FROM)&quot; &quot;id:300011,rev:1,severity:4,msg:&#039;Generic SQL injection in cookie&#039;&quot;
&nbsp;
#Prevent SQL injection in UA
##SecFilterSelective HTTP_USER_AGENT &quot;((select|grant|delete|insert|drop|alter|replace|truncate|update|create|rename|describe)[[:space:]]+[A-Z|a-z|0-9|\*| |\,]+[[:space:]]+(from|into|table|database|index|view)[[:space:]]+[A-Z|a-z|0-9|\*| |\,]|UNION SELECT.*\&#039;.*\&#039;.*,[0-9].*INTO.*FROM)&quot; &quot;id:300012,rev:1,severity:4,msg:&#039;Generic SQL injection in User Agent header&#039;&quot;
&nbsp;
# Generic filter to prevent SQL injection attacks
# Understand that all SQL filters are very limited and are very difficult to prevent false postives and negatives.
# Please report false positives/negatives to mike@gotroot.com
#SecFilter &quot;((select|grant|delete|insert|drop|alter|replace|truncate|update|create|rename|describe)[[:space:]]+[A-Z|a-z|0-9|\*| |\,]+[[:space:]]+(from|into|table|database|index|view)[[:space:]]+[A-Z|a-z|0-9|\*| |\,]|UNION SELECT.*\&#039;.*\&#039;.*,[0-9].*INTO.*FROM)&quot; &quot;id:300013,rev:1,severity:4,msg:&#039;Generic SQL injection protection&#039;&quot;
&nbsp;
#generic XSS PHP attack types
##SecFilterSelective REQUEST_URI &quot;\.php\?&quot; &quot;chain,id:300010,rev:1,severity:4,msg:&#039;Generic PHP XSS exploit pattern denied&#039;&quot;
#SecFilter &quot;(javascript\:/(.*new\x20ActiveXObject.*Sh\.regwrite|.*window\.opener\.document\.body.\innerHTML=window\.opener\.document\.body\.innerHTML\.replace)|onmouseover=\&#039;javascript)&quot;
&nbsp;
#Generic XSS filter
#please report false positives
##SecFilterSelective REQUEST_URI &quot;!/mt\.cgi&quot; &quot;chain,msg:&#039;XSS2&#039;&quot;
#SecFilter &quot;&lt;[[:space:]]*(script|about|applet|activex|chrome)*&gt;.*(script|about|applet|activex|chrome)[[:space:]]*&gt;&quot;
&nbsp;
#XSS in referrer and UA headers
##SecFilterSelective HTTP_REFERER|HTTP_USER_AGENT &quot;&lt;[[:space:]]*(script|about|applet|activex|chrome)*&gt;.*(script|about|applet|activex|chrome)[[:space:]]*&gt;&quot; &quot;msg:&#039;XSS3&#039;&quot;
&nbsp;
#HTTP header PHP code injection attacks
##SecFilterSelective HTTP_CLIENT_IP|HTTP_USER_AGENT|HTTP_Referer &quot;(&lt;\?php|&lt;[[:space:]]?\?[[:space:]]?php|&lt;\? php)&quot; &quot;msg:&#039;PHP1&#039;&quot;
&nbsp;
#Generic PHP remote file injection
##SecFilterSelective REQUEST_URI &quot;!(/do_command)&quot; &quot;chain,msg:&#039;PHP2&#039;&quot;
##SecFilterSelective REQUEST_URI &quot;\.php\?.*=(https?|ftp)\:/.*(cmd|command)=&quot;
&nbsp;
#script, perl, etc. code in HTTP_Referer string
##SecFilterSelective HTTP_Referer &quot;\#\!.*/&quot; &quot;msg:&#039;perl script1&#039;&quot;
&nbsp;
#remote file inclusion generic attack signature
#SecFilterSelective THE_REQUEST  &quot;\.(dat|gif|jpg|png|bmp|txt|vir|dot)\?&quot; &quot;chain,msg:&#039;remote 1&#039;&quot;
#SecFilter &quot;((name|pm_path|pagina|path|include_location|root|page|open)=(http|https|ftp)|(cmd|command|inc)=)&quot;
&nbsp;
#remote file inclusion generic attack signature
#SecFilterSelective THE_REQUEST  &quot;\.(dat|gif|jpg|png|bmp|txt|vir|dot)\?\&amp;(cmd|command|inc|name)=&quot; &quot;msg:&#039;remote2&#039;&quot;
&nbsp;
#remote file inclusion generic attack signature
#SecFilterSelective ARGS  &quot;\.(dat|gif|jpg|png|bmp|txt|vir|dot)&quot; &quot;chain,msg:&#039;file inclusion1&#039;&quot;
#SecFilter &quot;\?\&amp;(cmd|inc|name)=&quot;
&nbsp;
#remote file inclusion generic attack signature
#SecFilterSelective ARGS  &quot;\.(dat|gif|jpg|png|bmp|txt|vir|dot)\?\&amp;(cmd|inc|name)=&quot; &quot;msg:&#039;file inclusion2&#039;&quot;
&nbsp;
#remote file inclusion generic attack signature
#SecFilterSelective REQUEST_URI  &quot;\.php\?.*=(http|https|ftp)\:/.*\?&amp;cmd=&quot; &quot;msg:&#039;file inclusion3&#039;&quot;
&nbsp;
#Bogus file extensions generic signature
#SecFilterSelective THE_REQUEST  &quot;[A-Za-z0-9]\.(gif|jpg|png|bmp)\.txt&quot; &quot;msg:&#039;file extension&#039;&quot;
&nbsp;
#PHP remote path attach generic signature
#SecFilterSelective REQUEST_URI  &quot;\.ph(p(3|4)?).*path=(http|https|ftp)\:/&quot; &quot;msg:&#039;remote path1&#039;&quot;
#SecFilterSelective REQUEST_URI  &quot;\.php.*path=(http|https|ftp)\:/&quot; &quot;msg:&#039;remote path2&#039;&quot;
&nbsp;
#generic php attack sigs
#SecFilterSelective REQUEST_URI &quot;(&amp;(cmd|command)=(id|uname)\x20|cmd\?(cmd|command)=|(spy|cmd|cmd_out|sh)\.(gif|jpg|png|bmp|txt)\?&amp;(cmd|command)=|\.php\?&amp;(cmd|command)=)&quot; &quot;msg:&#039;php attack1&#039;&quot;
&nbsp;
# WEB-MISC apache directory disclosure attempt
#SecFilterSelective THE_REQUEST &quot;////&quot; &quot;msg:&#039;apache directory disclosure&#039;&quot;
&nbsp;
#PHP defenses
##SecFilterSelective ARG_PHPSESSID &quot;!^$&quot; &quot;msg:&#039;something in phpsessid&#039;&quot;
##SecFilterSelective COOKIE_PHPSESSID &quot;!^$&quot; &quot;msg:&#039;something in cookie phpsessid&#039;&quot;
&nbsp;
#PHP defenses
##SecFilterSelective COOKIE_ASKAPACHEID &quot;!^[0-9a-z]*$&quot; &quot;msg:&#039;bad value for cookie&#039;&quot;
&nbsp;
#cross site scripting attempt TYPE + JAVASCRIPT
##SecFilterSelective THE_REQUEST &quot;TYPE\s*=\s*[\&#039;\&quot;]text\/javascript&quot; &quot;msg:&#039;cross-site1&#039;&quot;
&nbsp;
#cross site scripting attempt STYLE + JAVASCRIPT
##SecFilterSelective THE_REQUEST &quot;TYPE\s*=\s*[\&#039;\&quot;]application\/x-javascript&quot; &quot;msg:&#039;cross-site1&#039;&quot;
&nbsp;
#cross site scripting attempt STYLE + JSCRIPT
##SecFilterSelective THE_REQUEST &quot;TYPE\s*=\s*[\&#039;\&quot;]text\/jscript&quot; &quot;msg:&#039;cross-site1&#039;&quot;
&nbsp;
# cross site scripting attempt STYLE + VBSCRIPT
##SecFilterSelective THE_REQUEST &quot;TYPE\s*=\s*[\&#039;\&quot;]text\/vbscript&quot; &quot;msg:&#039;cross-site1&#039;&quot;
&nbsp;
#cross site scripting attempt STYLE + VBSCRIPT
##SecFilterSelective THE_REQUEST &quot;TYPE\s*=\s*[\&#039;\&quot;]application\/x-vbscript&quot; &quot;msg:&#039;cross-site1&#039;&quot;
&nbsp;
#cross site scripting attempt STYLE + ECMACRIPT
##SecFilterSelective THE_REQUEST &quot;TYPE\s*=\s*[\&#039;\&quot;]text\/ecmascript&quot; &quot;msg:&#039;cross-site1&#039;&quot;
&nbsp;
# cross site scripting attempt STYLE + EXPRESSION
##SecFilterSelective THE_REQUEST &quot;STYLE[\s]*=[\s]*[^&gt;]expression[\s]*\(&quot; &quot;msg:&#039;cross-site1&#039;&quot;
&nbsp;
#cross site scripting attempt STYLE + EXPRESSION
##SecFilterSelective THE_REQUEST &quot;[\s]*expression[\s]*\([^}]}[\s]*&lt;\/STYLE&gt;&quot; &quot;msg:&#039;cross-site1&#039;&quot;
&nbsp;
# cross site scripting attempt using XML
##SecFilterSelective THE_REQUEST &quot;&lt;!\[CDATA\[&lt;\]\]&gt;SCRIPT&quot; &quot;msg:&#039;cross-site1&#039;&quot;
&nbsp;
#cross site scripting attempt executing hidden Javascript
##SecFilterSelective THE_REQUEST &quot;eval[\s]*\([\s]*[^\.]\.innerHTML[\s]*\)&quot; &quot;msg:&#039;cross-site1&#039;&quot;
&nbsp;
#cross site scripting attempt executing hidden Javascript
##SecFilterSelective THE_REQUEST &quot;window\.execScript[\s]*\(&quot; &quot;msg:&#039;cross-site1&#039;&quot;
&nbsp;
#cross site scripting attempt to execute Javascript code
###SecFilterSelective THE_REQUEST &quot;/(((URL|SRC|HREF|LOWSRC)[\s]*=)|(url[\s]*[\(]))[\s]*[\&#039;\&quot;]*javascript[\:]&quot; &quot;msg:&#039;cross-site1&#039;&quot;
&nbsp;
#cross site scripting HTML Image tag set to javascript attempt
#SecFilterSelective THE_REQUEST &quot;img src=javascript&quot; &quot;msg:&#039;cross-site1&#039;&quot;
&nbsp;
#Fake image file shell attacvk
#SecFilterSelective HTTP_Content-Type &quot;image/.*&quot; &quot;msg:&#039;image shell 1&#039;&quot;
#SecFilterSelective POST_PAYLOAD &quot;chr\(&quot; &quot;msg:&#039;image shell2&#039;&quot;
&nbsp;
#bogus graphics file
#SecFilterSelective HTTP_Content-Disposition &quot;\.php&quot;  &quot;chain,msg:&#039;bogus graphics&#039;&quot;
#SecFilterSelective HTTP_Content-Type &quot;(image/gif|image/jpg|image/png|image/bmp)&quot;
&nbsp;
# Allow only letters, digits, underscore, and square brackets (for arrays)
# in variable names#
#SecFilterSelective ARGS_NAMES &quot;!^[][a-zA-Z0-9_]+$&quot;
&nbsp;
#&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-
# reject keywords that appear in POST or GET
#=============================================
SecFilterSignatureAction &quot;nolog,auditlog,deny,severity:6,status:403&quot;
&nbsp;
SecFilterSelective REQUEST_URI  &quot;^/.*/wp-comments-post\.php&quot; &quot;id:50200,msg:&#039;WORDPRESS SPAM bad wp-comments-post location&#039;&quot;
&nbsp;
&lt;Files wp-comments-post.php&gt;
# fail for empty comment fields
SecFilterSelective &quot;ARG_comment_post_ID|ARG_submit&quot; &quot;^$&quot; &quot;id:50300,msg:&#039;WORDPRESS SPAM MISSING comment_post_ID&#039;&quot;
SecFilterSelective &quot;ARG_comment_post_ID&quot; &quot;!^[0-9]{1,6}$&quot; &quot;id:50301,msg:&#039;WORDPRESS SPAM BAD comment_post_ID&#039;&quot;
SecFilterSelective &quot;HTTP_Cookie&quot; &quot;^$&quot; &quot;id:50302,msg:&#039;WORDPRESS SPAM No cookie&#039;&quot;
&nbsp;
##SecFilterSelective &quot;comment_post_DI&quot; &quot;^$&quot; &quot;id:50310,msg:&#039;WORDPRESS SPAM MISSING comment_post_DI&#039;&quot;
##SecFilterSelective &quot;comment_post_DI&quot; &quot;!^[0-9]{1,2}$&quot; &quot;id:50311,msg:&#039;WORDPRESS SPAM MISSING comment_post_DI&#039;&quot;
&lt;/Files&gt;
&lt;pre&gt;
&nbsp;
&lt;h2&gt;MODSEC Continued.. Custom Anti-Spam (WordPress) I made&lt;/h2&gt;
&lt;pre&gt;
SecFilterSignatureAction &quot;nolog,noauditlog,deny,severity:6,redirect:http://www.askapache.com/feed/&quot;
SecFilterSelective ARGS|THE_REQUEST &quot;00bp\.com|360\.yahoo|987mb\.com|Ambien|American airline&quot; &quot;id:50010,msg:&#039;SPAM 10&#039;
SecFilterSelective ARGS|THE_REQUEST &quot;Ativan|Caresoprodol|Darvocet|Ephedra|Ephedrine&quot; &quot;id:50011,msg:&#039;SPAM 11&#039;
SecFilterSelective ARGS|THE_REQUEST &quot;Gambling|Lexapro|Tramadol|Venlafaxine&quot; &quot;id:50012,msg:&#039;SPAM 12&#039;
SecFilterSelective ARGS|THE_REQUEST &quot;\[URL=|abgood|acura|acyclovir|adderall&quot; &quot;id:50013,msg:&#039;SPAM 13&#039;
SecFilterSelective ARGS|THE_REQUEST &quot;adipex|alcohol|alprazolam|amateur|amrit&quot; &quot;id:50014,msg:&#039;SPAM 14&#039;
SecFilterSelective ARGS|THE_REQUEST &quot;anal sex|analfinder|angelina jolie|asshole|axspace\.com&quot; &quot;id:50015,msg:&#039;SPAM 15&#039;
SecFilterSelective ARGS|THE_REQUEST &quot;baccarat|bankrupt|bikini|biotic|black jack|blowjob&quot; &quot;id:50016,msg:&#039;SPAM 16&#039;
SecFilterSelective ARGS|THE_REQUEST &quot;blackjack|blog\.360|brutality|buddhism|butalbital&quot; &quot;id:50017,msg:&#039;SPAM 17&#039;
SecFilterSelective ARGS|THE_REQUEST &quot;cadillac|canalis|card credit|card stud|carisoprodol&quot; &quot;id:50018,msg:&#039;SPAM 18&#039;
SecFilterSelective ARGS|THE_REQUEST &quot;carmen|cash advance|cash credit|casino|catch\.com&quot; &quot;id:50019,msg:&#039;SPAM 19&#039;
SecFilterSelective ARGS|THE_REQUEST &quot;celebrex|celexa|cellulite|cheap|cheerleader&quot; &quot;id:50020,msg:&#039;SPAM 20&#039;
SecFilterSelective ARGS|THE_REQUEST &quot;chevrolet|child abuse|cialis|cigarette|cipro&quot; &quot;id:50021,msg:&#039;SPAM 21&#039;
SecFilterSelective ARGS|THE_REQUEST &quot;citroen|claritin|cleavage|clomid|codeine&quot; &quot;id:50022,msg:&#039;SPAM 22&#039;
SecFilterSelective ARGS|THE_REQUEST &quot;consulting23|craps online|credit card|credit debt|crestor&quot; &quot;id:50023,msg:&#039;SPAM 23&#039;
SecFilterSelective ARGS|THE_REQUEST &quot;dealership|debt free|desnudas|diazepam|dick&quot; &quot;id:50024,msg:&#039;SPAM 24&#039;
SecFilterSelective ARGS|THE_REQUEST &quot;dildo|drugstore|earrings|endometrioma|endowment&quot; &quot;id:50025,msg:&#039;SPAM 25&#039;
SecFilterSelective ARGS|THE_REQUEST &quot;erotic|estrogen|fioricet|francaise|freehost\.com&quot; &quot;id:50026,msg:&#039;SPAM 26&#039;
SecFilterSelective ARGS|THE_REQUEST &quot;freehostia|freemb\.com|fuck|geocities\.com|hacking myspace&quot; &quot;id:50027,msg:&#039;SPAM 27&#039;
SecFilterSelective ARGS|THE_REQUEST &quot;holdem|honda|hotels|hydrocodone|hypnotic&quot; &quot;id:50028,msg:&#039;SPAM 28&#039;
SecFilterSelective ARGS|THE_REQUEST &quot;hyundai|implants|incest|instant approval|insurance&quot; &quot;id:50029,msg:&#039;SPAM 29&#039;
SecFilterSelective ARGS|THE_REQUEST &quot;interracial|jaguar|jenny movie|johanson|kasino&quot; &quot;id:50030,msg:&#039;SPAM 30&#039;
SecFilterSelective ARGS|THE_REQUEST &quot;lesbian|levitra|lipitor|loan|lolita&quot; &quot;id:50031,msg:&#039;SPAM 31&#039;
SecFilterSelective ARGS|THE_REQUEST &quot;lorazepam|lorcet|lyrics|madamic|majorette&quot; &quot;id:50032,msg:&#039;SPAM 32&#039;
SecFilterSelective ARGS|THE_REQUEST &quot;malaria|mastercar|masturbate|masturbation|maturewomen&quot; &quot;id:50033,msg:&#039;SPAM 33&#039;
SecFilterSelective ARGS|THE_REQUEST &quot;mazda|medication|medicine|megsfree5\.com|mercedes&quot; &quot;id:50034,msg:&#039;SPAM 34&#039;
SecFilterSelective ARGS|THE_REQUEST &quot;meridia|metformin|mitsubishi|mortgage|myspace profile&quot; &quot;id:50035,msg:&#039;SPAM 35&#039;
SecFilterSelective ARGS|THE_REQUEST &quot;naked|neocool|nexium|nimire\.com|nissan&quot; &quot;id:50036,msg:&#039;SPAM 36&#039;
SecFilterSelective ARGS|THE_REQUEST &quot;nokia|nude|nudism|nymph|open toe&quot; &quot;id:50037,msg:&#039;SPAM 37&#039;
SecFilterSelective ARGS|THE_REQUEST &quot;oprodol|orgasm|oxycodone|oxycontin|packages&quot; &quot;id:50038,msg:&#039;SPAM 38&#039;
SecFilterSelective ARGS|THE_REQUEST &quot;painrelief|pantyhose|paxil|payday|penis&quot; &quot;id:50039,msg:&#039;SPAM 39&#039;
SecFilterSelective ARGS|THE_REQUEST &quot;percocet|pharmacy|phentermine|phetermine|phpbb_root&quot; &quot;id:50040,msg:&#039;SPAM 40&#039;
SecFilterSelective ARGS|THE_REQUEST &quot;pictaboo|pictorial|pills|pissing|play craps&quot; &quot;id:50041,msg:&#039;SPAM 41&#039;
SecFilterSelective ARGS|THE_REQUEST &quot;playgirl|pocker web|poker|pontiac|poquer&quot; &quot;id:50042,msg:&#039;SPAM 42&#039;
SecFilterSelective ARGS|THE_REQUEST &quot;porn|pounder|prescription|preteen|prevacid&quot; &quot;id:50043,msg:&#039;SPAM 43&#039;
SecFilterSelective ARGS|THE_REQUEST &quot;price1|prilosec|propecia|proza|prozac&quot; &quot;id:50044,msg:&#039;SPAM 44&#039;
SecFilterSelective ARGS|THE_REQUEST &quot;puddled|pussy|refinance|rentals|replica&quot; &quot;id:50045,msg:&#039;SPAM 45&#039;
SecFilterSelective ARGS|THE_REQUEST &quot;ringtones|roulette|screensaver|seduced|sexual&quot; &quot;id:50046,msg:&#039;SPAM 46&#039;
SecFilterSelective ARGS|THE_REQUEST &quot;sexy|shemale|shiloh|singulair|site-host&quot; &quot;id:50047,msg:&#039;SPAM 47&#039;
SecFilterSelective ARGS|THE_REQUEST &quot;slot machine|slot maschine|slots machine|solpip\.com|soma&quot; &quot;id:50048,msg:&#039;SPAM 48&#039;
SecFilterSelective ARGS|THE_REQUEST &quot;sperm|starlets|supplier|suzuki|tadalafil&quot; &quot;id:50049,msg:&#039;SPAM 49&#039;
SecFilterSelective ARGS|THE_REQUEST &quot;toyota|tylenol|ultram|valium|viagra&quot; &quot;id:50050,msg:&#039;SPAM 50&#039;
SecFilterSelective ARGS|THE_REQUEST &quot;vigora|vioxx|wallpaper|warez|webcam&quot; &quot;id:50051,msg:&#039;SPAM 51&#039;
SecFilterSelective ARGS|THE_REQUEST &quot;webpages\.com|wellbutrin|whitesluts|wholesale|whore&quot; &quot;id:50052,msg:&#039;SPAM 52&#039;
SecFilterSelective ARGS|THE_REQUEST &quot;windshield|xanax|xenical|y lohan|yourgirls&quot; &quot;id:50053,msg:&#039;SPAM 53&#039;
SecFilterSelective ARGS|THE_REQUEST &quot;youtube\.com|zantac|sex offenders|hotgay|Zoloft|celtic women&quot; &quot;id:50054,msg:&#039;SPAM 54&#039;
SecFilterSelective ARGS|THE_REQUEST &quot;dollhouse|freehot|kardashian|oralsex&quot; &quot;id:50055,msg:&#039;SPAM 55&#039;
SecFilterSelective ARGS|THE_REQUEST &quot;freeimghost&quot; &quot;id:50056,msg:&#039;SPAM 56&#039;</pre>
<h2>Unreleased AskApache Lightning code - caching plugin for WordPress</h2>
<pre>RewriteEngine On
RewriteBase /
&nbsp;
RewriteCond %{REQUEST_URI} ^/(stats/|missing\.html|failed_auth\.html|test/).* [NC,OR]
RewriteCond %{ENV:REDIRECT_STATUS} =200
RewriteRule .* - [L]
&nbsp;
RewriteCond %{HTTP_HOST} !=www.askapache.com
RewriteCond %{HTTP_HOST} !=z.askapache.com
RewriteRule .? http://www.askapache.com%{REQUEST_URI}%{QUERY_STRING} [R=301,L]
&nbsp;
#RewriteCond %{HTTPS} =on
#RewriteCond %{THE_REQUEST} !^[A-Z]{3,9}\ /(wp-login.php|wp-admin)(.*)\ HTTP/ [NC]
#RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(.*)\ HTTP/ [NC]
#RewriteRule .* http://www.askapache.com/$1 [R=301,L]
&nbsp;
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(.+)%20(.+)\ HTTP/ [NC]
RewriteRule .* http://www.askapache.com/%1-%2 [R=301,L]
&nbsp;
RewriteCond %{THE_REQUEST} ^GET\ /valid-html/.*\ HTTP/ [NC]
RewriteCond %{HTTP_REFERER} ^https?://www.askapache.com(.+).*$ [NC]
RewriteRule .* http://validator.w3.org/check?uri=http://www.askapache.com%1;ss=1;outline=1;debug [R=307,L,NE]
&nbsp;
RewriteCond %{THE_REQUEST} ^GET\ /valid-css/.*\ HTTP/ [NC]
RewriteRule .* http://jigsaw.w3.org/css-validator/validator?uri=z.askapache.com/z/c/apache-10.css [R=301,L]
&nbsp;
RewriteCond %{THE_REQUEST} ^GET\ /search/.*\ HTTP/ [NC]
RewriteCond %{QUERY_STRING} ^s=(.+)$ [NC]
RewriteRule .* http://www.askapache.com/search/%1? [R=302,L]
&nbsp;
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}/X%{REQUEST_URI}index.html -f
RewriteRule ^(.*)$ /X%{REQUEST_URI}index.html [L]
&nbsp;
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}/X%{REQUEST_URI} -f
RewriteRule ^(.*)$ /X%{REQUEST_URI} [L]</pre>
<h2>Passing Parameters to CGI through HTTP Headers</h2>
<p>This deserves a note.. this trick lets you bypass so many hosting environment restrictions it&#8217;s not even funny&#8230; like you can run bash as your webserver instead of apache!  (kinda&#8230;)</p>
<pre>RewriteCond %{REQUEST_URI} ^/cgi-bin/(hash|java)\.cgi$ [NC]
RewriteCond %{HTTP:P3P} ^(([^:]+):(.+))$ [NC]
RewriteRule .* - [E=HTTP_JS:%{HTTP:P3P},E=HTTP_US:%2,E=HTTP_PA:%3]</pre>
<h2>Redirect to FeedBurner</h2>
<p>Yes.. I was the first to do this (parse the real rewrites internally in wordpress for no bypassing possibilities)&#8230; </p>
<pre>#RewriteCond %{REQUEST_URI} ^/feed/.*?$ [NC,OR]
#RewriteCond %{HTTP_REFERER} ^https?://www.askapache.com/wp-admin(.+).*$ [NC]
RewriteCond %{HTTP_USER_AGENT} FeedBurner [NC]
RewriteRule .* - [S=1]
&nbsp;
RewriteCond %{REQUEST_URI} ^/(feed|rdf|rss|rss2|atom).* [NC,OR]
RewriteCond %{REQUEST_URI} ^/wp-(feed|rdf|rss|rss2|atom).* [NC,OR]
RewriteCond %{REQUEST_FILENAME} ^.*/(wp-atom|wp-feed|wp-rdf|wp-rss|wp-rss2)\.php$ [NC,OR]
RewriteCond %{REQUEST_FILENAME} ^.*/wp-includes/feed[^\.]*\.php$ [NC,OR]
RewriteCond %{QUERY_STRING} .*(feed|rdf|rss|rss2|atom).* [NC]
RewriteRule .* http://feeds.askapache.com/apache/htaccess? [R=302,L]</pre>
<h2>More Unreleased Caching Tests</h2>
<pre># +ASKAPACHE CRAZYCACHE 2.3
#######################################################
#               __                          __
#   ____ ______/ /______ _____  ____ ______/ /_  ___
#  / __ `/ ___/ //_/ __ `/ __ \/ __ `/ ___/ __ \/ _ \
# / /_/ (__  ) ,&lt; / /_/ / /_/ / /_/ / /__/ / / /  __/
# \__,_/____/_/|_|\__,_/ .___/\__,_/\___/_/ /_/\___/
#                     /_/
# - - - - - - - - - - - - - - - - - - - - - - - - - - -
# +ACACHE RULES
# +RULE
RewriteCond %{THE_REQUEST} ^(GET|HEAD)\ //?(.+)\.rdf\ HTTP/ [NC]
RewriteCond %{DOCUMENT_ROOT}/wp-cache/%2.html/index.rdf -f
RewriteRule ^(.+)\.rdf$ /wp-cache/%2.html/index.rdf [L,S=3]
&nbsp;
RewriteCond %{QUERY_STRING} !^.*cacheit.* [NC]
#RewriteCond %{HTTP_USER_AGENT} W3C_Validator [OR,NC]
#RewriteCond %{REMOTE_ADDR} = [OR]
&nbsp;
RewriteCond %{REQUEST_METHOD} =POST [OR]
RewriteCond %{THE_REQUEST} ^$ [OR]
RewriteCond %{QUERY_STRING} nocache [OR]
RewriteCond %{REMOTE_ADDR} = [OR]
RewriteCond %{HTTP_COOKIE} ^.*wordpress_logged_in_.*$ [NC]
RewriteRule .+ - [S=2]
&nbsp;
RewriteCond %{DOCUMENT_ROOT}/wp-cache%{REQUEST_URI} !-d
RewriteRule .+ - [S=1]
&nbsp;
RewriteCond %{DOCUMENT_ROOT}/wp-cache%{REQUEST_URI}/index.html -f
RewriteRule .+ /wp-cache%{REQUEST_URI}/index.html [L]
# -RULE
# -ACACHE RULES
# - - - - - - - - - - - - - - - - - - - - - - - - - - -
#               __                          __
#   ____ ______/ /______ _____  ____ ______/ /_  ___
#  / __ `/ ___/ //_/ __ `/ __ \/ __ `/ ___/ __ \/ _ \
# / /_/ (__  ) ,&lt; / /_/ / /_/ / /_/ / /__/ / / /  __/
# \__,_/____/_/|_|\__,_/ .___/\__,_/\___/_/ /_/\___/
#                     /_/
#######################################################
# -ASKAPACHE CRAZYCACHE 2.3
&nbsp;
# +ASKAPACHE CRAZYCACHE 2.3
#######################################################
#               __                          __
#   ____ ______/ /______ _____  ____ ______/ /_  ___
#  / __ `/ ___/ //_/ __ `/ __ \/ __ `/ ___/ __ \/ _ \
# / /_/ (__  ) ,&lt; / /_/ / /_/ / /_/ / /__/ / / /  __/
# \__,_/____/_/|_|\__,_/ .___/\__,_/\___/_/ /_/\___/
#                     /_/
# - - - - - - - - - - - - - - - - - - - - - - - - - - -
# +ACACHE RULES
# +RULE
FileETag None
AddOutputFilterByType DEFLATE text/html
&nbsp;
AddType &#039;text/html; charset=UTF-8&#039; .html
&nbsp;
Header set P3P &quot;policyref=\&quot;http://www.askapache.com/w3c/p3p.xml\&quot;&quot;
Header set X-Pingback &quot;http://www.askapache.com/xmlrpc.php&quot;
Header set Content-Language &quot;en-US&quot;
Header set Vary &quot;Accept-Encoding,Accept&quot;
&nbsp;
&lt;IfModule mod_expires.c&gt;
ExpiresActive On
ExpiresDefault M7200
&lt;/IfModule&gt;
# -RULE
# -ACACHE RULES
# - - - - - - - - - - - - - - - - - - - - - - - - - - -
#               __                          __
#   ____ ______/ /______ _____  ____ ______/ /_  ___
#  / __ `/ ___/ //_/ __ `/ __ \/ __ `/ ___/ __ \/ _ \
# / /_/ (__  ) ,&lt; / /_/ / /_/ / /_/ / /__/ / / /  __/
# \__,_/____/_/|_|\__,_/ .___/\__,_/\___/_/ /_/\___/
#                     /_/
#######################################################
# -ASKAPACHE CRAZYCACHE 2.3
&nbsp;
Options +IndexesOptions +FollowSymLinks
AddHandler application/x-httpd-php .php
&nbsp;
RewriteEngine On
RewriteBase /
RewriteCond %{QUERY_STRING} !^tyy+$ [NC]
RewriteCond %{REMOTE_USER} ^(.+)$
RewriteRule ^(.*)$ $1/-%1 [R=302,L]
Options +FollowSymLinks
DirectoryIndex index.php
ErrorDocument 404 /cgi-bin/pro/index.php
&nbsp;
AuthName &quot;Protection&quot;
AuthUserFile /home/askapache/sites/askapache.com/.htpasswda1
AuthGroupFile /dev/null
AuthType Basic
Require valid-user
Satisfy Any
&nbsp;
&lt;IfModule mod_security.c&gt;
SecFilterEngine Off
&lt;/IfModule&gt;
Options +ExecCGI -Indexes -Includes +FollowSymLinks
Order Deny,Allow
Deny from All
Allow from 208.113.134.190 64.111.114.111  env=REDIRECT_STATUS
&nbsp;
#SetEnvIf Remote_Addr ^$ MODSEC_ENABLE=Off
#SetEnvIf Server_Addr ^$ MODSEC_ENABLE=Off
#SetEnvIf Remote_Addr ^({SERVER_ADDR}e)$ GOOD=$1
#SetEnvIf Server_Addr GOOD R</pre>
<h2>Default HTACCESS</h2>
<pre>#
# Directives controlling the display of server-generated directory listings.
#
# Required modules: mod_autoindex, mod_alias
#
# To see the listing of a directory, the Options directive for the
# directory must include &quot;Indexes&quot;, and the directory must not contain
# a file matching those listed in the DirectoryIndex directive.
#
Options +Indexes +MultiViews -ExecCGI +FollowSymLinks
DirectoryIndex index.html
&nbsp;
#
#
# IndexOptions: Controls the appearance of server-generated directory
# listings.
#
IndexOptions FancyIndexing IconHeight=22 IconWidth=20 IgnoreClient NameWidth=* DescriptionWidth=* ScanHTMLTitles SuppressLastModified XHTML FoldersFirst SuppressHTMLPreamble
&nbsp;
#
# AddIcon* directives tell the server which icon to show for different
# files or filename extensions.  These are only displayed for
# FancyIndexed directories.
#
&nbsp;
AddIconByEncoding (CMP,http://z.askapache.com/i/s/compressed.gif) x-compress x-gzip
&nbsp;
AddIconByType (IMG,http://z.askapache.com/i/s/image.gif) image/*
AddIconByType (SND,http://z.askapache.com/i/s/sound2.gif) audio/*
AddIconByType (TXT,http://z.askapache.com/i/s/text.gif) text/*
AddIconByType (VID,http://z.askapache.com/i/s/movie.gif) video/*
&nbsp;
AddIcon http://z.askapache.com/i/s/hand.right.gif README
AddIcon http://z.askapache.com/i/s/folder.gif ^^DIRECTORY^^
AddIcon http://z.askapache.com/i/s/dir.png ^^DIRECTORY^^
AddIcon http://z.askapache.com/i/s/blank.gif ^^BLANKICON^^
AddDescription &quot;100 Continue&quot; 100* 100/index.html
AddDescription &quot;101 Switching Protocols&quot; 101* 101/index.html
AddDescription &quot;102 Processing&quot; 102* 102/index.html
AddDescription &quot;200 OK&quot; 200* 200/index.html
AddDescription &quot;201 Created&quot; 201* 201/index.html
AddDescription &quot;202 Accepted&quot; 202* 202/index.html
AddDescription &quot;203 Non-Authoritative Information&quot; 203* 203/index.html
AddDescription &quot;204 No Content&quot; 204* 204/index.html
AddDescription &quot;205 Reset Content&quot; 205* 205/index.html
AddDescription &quot;206 Partial Content&quot; 206* 206/index.html
AddDescription &quot;207 Multi-Status&quot; 207* 207/index.html
AddDescription &quot;300 Multiple Choices&quot; 300* 300/index.html
AddDescription &quot;301 Moved Permanently&quot; 301* 301/index.html
AddDescription &quot;302 Found&quot; 302* 302/index.html
AddDescription &quot;303 See Other&quot; 303* 303/index.html
AddDescription &quot;304 Not Modified&quot; 304* 304/index.html
AddDescription &quot;305 Use Proxy&quot; 305* 305/index.html
AddDescription &quot;306 unused&quot; 306* 306/index.html
AddDescription &quot;307 Temporary Redirect&quot; 307* 307/index.html
AddDescription &quot;400 Bad Request&quot; 400* 400/index.html
AddDescription &quot;401 Authorization Required&quot; 401* 401/index.html
AddDescription &quot;402 Payment Required&quot; 402* 402/index.html
AddDescription &quot;403 Forbidden&quot; 403* 403/index.html
AddDescription &quot;404 Not Found&quot; 404* 404/index.html
AddDescription &quot;405 Method Not Allowed&quot; 405* 405/index.html
AddDescription &quot;406 Not Acceptable&quot; 406* 406/index.html
AddDescription &quot;407 Proxy Authentication Required&quot; 407* 407/index.html
AddDescription &quot;408 Request Time-out&quot; 408* 408/index.html
AddDescription &quot;409 Conflict&quot; 409* 409/index.html
AddDescription &quot;410 Gone&quot; 410* 410/index.html
AddDescription &quot;411 Length Required&quot; 411* 411/index.html
AddDescription &quot;412 Precondition Failed&quot; 412* 412/index.html
AddDescription &quot;413 Request Entity Too Large&quot; 413* 413/index.html
AddDescription &quot;414 Request-URI Too Large&quot; 414* 414/index.html
AddDescription &quot;415 Unsupported Media Type&quot; 415* 415/index.html
AddDescription &quot;416 Requested Range Not Satisfiable&quot; 416* 416/index.html
AddDescription &quot;417 Expectation Failed&quot; 417* 417/index.html
AddDescription &quot;418 unused&quot; 418* 418/index.html
AddDescription &quot;419 unused&quot; 419* 419/index.html
AddDescription &quot;420 unused&quot; 420* 420/index.html
AddDescription &quot;421 unused&quot; 421* 421/index.html
AddDescription &quot;422 Unprocessable Entity&quot; 422* 422/index.html
AddDescription &quot;423 Locked&quot; 423* 423/index.html
AddDescription &quot;424 Failed Dependency&quot; 424* 424/index.html
AddDescription &quot;425 No code&quot; 425* 425/index.html
AddDescription &quot;426 Upgrade Required&quot; 426* 426/index.html
AddDescription &quot;500 Internal Server Error&quot; 500* 500/index.html
AddDescription &quot;501 Method Not Implemented&quot; 501* 501/index.html
AddDescription &quot;502 Bad Gateway&quot; 502* 502/index.html
AddDescription &quot;503 Service Temporarily Unavailable&quot; 503* 503/index.html
AddDescription &quot;504 Gateway Time-out&quot; 504* 504/index.html
AddDescription &quot;505 HTTP Version Not Supported&quot; 505* 505/index.html
AddDescription &quot;506 Variant Also Negotiates&quot; 506* 506/index.html
AddDescription &quot;507 Insufficient Storage&quot; 507* 507/index.html
AddDescription &quot;508 unused&quot; 508* 508/index.html
AddDescription &quot;509 unused&quot; 509* 509/index.html
AddDescription &quot;510 Not Extended&quot; 510* 510/index.html
AddDescription &quot;.htaccess ErrorDocuments&quot; *
&nbsp;
#
# HeaderName is the name of a file which should be prepended to
# directory indexes.
ReadmeName /X/error/README.html
HeaderName /X/error/HEADER.html
&nbsp;
# DefaultIcon is which icon to show for where none is explicitly set.
DefaultIcon http://z.askapache.com/i/s/generic.gif</pre>
<h2>Ok I&#8217;m done commenting..</h2>
<pre>#
# IndexIgnore is a set of filenames which directory indexing should ignore
# and not include in the listing.  Shell-style wildcarding is permitted.
#
IndexIgnore .??*  *_notes *~
RewriteEngine On
RewriteCond %{HTTPS} !=on [NC]
RewriteRule .* https://www.askapache.com%{REQUEST_URI}
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},E=REMOTE_USER:%{HTTP:Authorization}]
&nbsp;
#RewriteCond %{QUERY_STRING} openid.mode=authorize
#RewriteCond %{REQUEST_URI} ^/openid.*$ [NC]
#RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},E=REMOTE_USER:%{HTTP:Authorization}]
Options +FollowSymLinks
DirectoryIndex index.html
&nbsp;
#SetEnvIfNoCase ^Cookie$ &quot;(.*)&quot; HTTP_MY_COOKIE=$1
#SetEnvIfNoCase Remote_Addr &quot;(.*)&quot; HTTP_MY_REMOTE_ADDR=$1
ExpiresActive Off
FileETag None
Header unset Connection
Header set Connection &quot;close&quot;
Header unset Last-Modified
Header unset ETag
Header unset Accept-Ranges
Header unset Vary
Header unset Content-Type
Header unset X-Pingback
Header unset P3P
#Header add RouterBits &quot;%D %t&quot;
#Header add Location &quot;http://www.askapache.com/feed/&quot;
#Header add Found &quot;http://askapache.com/feed/&quot;
#Header add Content-Location &quot;http://www.askapache.com/feed/&quot;
#Header add Refresh &quot;http://www.askapache.com/feed/&quot;
#Header set Hi &quot;%{HTTP_MY_REMOTE_ADDR}e&quot;
### Section 1: Global Environment
#
# The directives in this section affect the overall operation of Apache,
# such as the number of concurrent requests it can handle or where it
# can find its configuration files.
#
#
# TZ: Your address, where problems with the server should be
# e-mailed.  This address appears on some server-generated pages, such
# as error documents.  e.g. admin@your-domain.com
#
SetEnv TZ America/Indianapolis
&nbsp;
#
# ServerAdmin: Your address, where problems with the server should be
# e-mailed.  This address appears on some server-generated pages, such
# as error documents.  e.g. admin@your-domain.com
#
SetEnv SERVER_ADMIN webmaster@askapache.com
&nbsp;
#
# Possible values for the Options directive are &quot;None&quot;, &quot;All&quot;,
# or any combination of:
#   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#
# The Options directive is both complicated and important.  Please see
# http://httpd.apache.org/docs/2.0/mod/core.html#options
# for more information.
#
Options  +FollowSymLinks -ExecCGI -Indexes -Includes -MultiViews
&nbsp;
#
# DirectoryIndex: sets the file that Apache will serve if a directory
# is requested.
#
DirectoryIndex index.html index.php /index.php
&nbsp;
#
# The following lines prevent .htaccess and .htpasswd files from being
# viewed by Web clients.
#
&lt;FilesMatch &quot;^\.ht&quot;&gt;
    Order allow,deny
    Deny from all
  Satisfy All
&lt;/FilesMatch&gt;
&nbsp;
#
# DefaultType: the default MIME type the server will use for a document
# if it cannot otherwise determine one, such as from filename extensions.
# If your server contains mostly text or HTML documents, &quot;text/plain&quot; is
# a good value.  If most of your content is binary, such as applications
# or images, you may want to use &quot;application/octet-stream&quot; instead to
# keep browsers from trying to display binary files as though they are
# text.
#
DefaultType text/html
&nbsp;
#
# Optionally add a line containing the server version and virtual host
# name to server-generated pages (internal error documents, FTP directory
# listings, mod_status and mod_info output etc., but not CGI generated
# documents or custom error documents).
# Set to &quot;EMail&quot; to also include a mailto: link to the ServerAdmin.
# Set to one of:  On | Off | EMail
#
ServerSignature Off
&nbsp;
##############################################
#           HEADERS and CACHING              #
##############################################
Header unset Pragma
Header unset Last-Modified
FileETag None
&nbsp;
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
&nbsp;

#
# Redirect allows you to tell clients about documents which used to exist in
# your server&#039;s namespace, but do not anymore. This allows you to tell the
# clients where to look for the relocated document.
##############################################
#          PERMANENT REDIRECTS               #
##############################################
Redirect 301 /12-lessons-for-those-afraid-of-css.html http://www.askapache.com/css/12-lessons-for-those-afraid-of-css.html
Redirect 301 /2006/htaccess/htaccesselite-ultimate-htaccess-article.html http://www.askapache.com/htaccess/apache-htaccess.html
Redirect 301 /2007/phpbb/sending-post-form-data-with-php-curl.html http://www.askapache.com/htaccess/sending-post-form-data-with-php-curl.html
Redirect 301 /2007/webmaster/custom-phpini-with-fastcgi-on-dreamhost.html http://www.askapache.com/dreamhost/custom-phpini-with-fastcgi-on-dreamhost.html
Redirect 301 /2007/webmaster/custom-phpini-with-fastcgi-on-dreamhost.html http://www.askapache.com/dreamhost/custom-phpini-with-fastcgi-on-dreamhost.html
Redirect 301 /2007/webmaster/php-and-ajax-shell-console.html http://www.askapache.com/tools/php-and-ajax-shell-console.html
Redirect 301 /27-request-methods-for-use-with-apache-and-rewritecond-and-htaccess.html http://www.askapache.com/htaccess/27-request-methods-for-use-with-apache-and-rewritecond-and-htaccess.html
Redirect 301 /404-google-wordpress-plugin.html http://www.askapache.com/seo/404-google-wordpress-plugin.html
Redirect 301 /503-service-temporarily-unavailable.html http://www.askapache.com/htaccess/503-service-temporarily-unavailable.html
Redirect 301 /Overview-about.rdf http://www.askapache.com/askapache-home.rdf
Redirect 301 /abbr-acronym.html http://www.askapache.com/xhtml/abbr-acronym.html
Redirect 301 /adsense-robots.html http://www.askapache.com/google/adsense-robots.html
Redirect 301 /alexa-toolbar-firefox.html http://www.askapache.com/tools/alexa-toolbar-firefox.html
Redirect 301 /allowing-access-from-1-static-ip-and-deny-the-rest.html http://www.askapache.com/htaccess/apache-htaccess.html
Redirect 301 /anti-virus-spyware-rootkit.html http://www.askapache.com/security/anti-virus-spyware-rootkit.html
Redirect 301 /apache-ssl-in-htaccess-examples.html http://www.askapache.com/htaccess/apache-ssl-in-htaccess-examples.html
Redirect 301 /awk-tutorial.html http://www.askapache.com/awk/awk-tutorial.html
Redirect 301 /best-adsense-optimization.html http://www.askapache.com/wordpress/best-adsense-optimization.html
Redirect 301 /commonly-used-htaccess-code-examples.html http://www.askapache.com/htaccess/commonly-used-htaccess-code-examples.html
Redirect 301 /css-background-image-sprite.html http://www.askapache.com/css/css-background-image-sprite.html
Redirect 301 /css-browser-screenshots.html http://www.askapache.com/tools/css-browser-screenshots.html
Redirect 301 /css-class-example.html http://www.askapache.com/css/css-class-example.html
Redirect 301 /curl-multi-downloads.html http://www.askapache.com/php/curl-multi-downloads.html
Redirect 301 /custom-boot-menu-in-windows-xp.html http://www.askapache.com/windows/custom-boot-menu-in-windows-xp.html
Redirect 301 /donate http://www.dreamhost.com/donate.cgi?id=8261
Redirect 301 /donate/ http://www.dreamhost.com/donate.cgi?id=8261
Redirect 301 /htaccess.txt http://z.askapache.com/p/htaccess.txt
Redirect 301 /htaccess/404-errorpages.html http://www.askapache.com/seo/google-ajax-search-seo-tips.html
Redirect 301 /htaccess/feedsmith http://www.askapache.com/htaccess/feedsmith-htaccess.html
Redirect 301 /htaccess/http-status-codes.html http://www.askapache.com/htaccess/apache-status-code-headers-errordocument.html
Redirect 301 /htaccess/instruct-search-engines-to-come-back-to-site-after-you-finish-working-on-it.html http://www.askapache.com/htaccess/503-service-temporarily-unavailable.html
Redirect 301 /htaccess/speed-up-the-apache-web-server-with-configuration-hacks.html http://www.askapache.com/htaccess/apache-web-server-speed-configuration-hacks.html
Redirect 301 /instruct-search-engines-to-come-back-to-site-after-you-finish-working-on-it.html http://www.askapache.com/htaccess/503-service-temporarily-unavailable.html
Redirect 301 /security/bypassing-vlan.html http://www.askapache.com/security/hacking-vlan-switched-networks.html
Redirect 301 /security/bypassing-vlanbypassing-vlan.html http://www.askapache.com/security/hacking-vlan-switched-networks.html
Redirect 301 /security/rigging-the-dreamhost-site-of-the-month-contest.html http://www.askapache.com/dreamhost/rigging-the-dreamhost-site-of-the-month-contest.html
Redirect 301 /seo/tailrankcom-robot.html http://www.askapache.com/seo/tailrank-robot.html
Redirect 301 /webmaster/caching-tutorial-for-webmasters.html http://www.askapache.com/htaccess/caching-tutorial-for-webmasters.html
Redirect 301 /webmaster/lft-traceroute-tool.html http://www.askapache.com/tools/lft-traceroute-tool.html
&nbsp;
##############################################
#          PERMANENT REDIRECTMATCH           #
##############################################
#RedirectMatch 301 ^/&amp;(.*)$ http://www.askapache.com/
RedirectMatch 301 ^/&amp;amp(.*)$ http://www.askapache.com/
RedirectMatch 301 ^/([^/]+)//$ http://www.askapache.com/$1/
RedirectMatch 301 ^/(.+)/htaccesselite-ultimate-htaccess-article.html(.*) http://www.askapache.com/htaccess/apache-htaccess.html
RedirectMatch 301 ^/(.+)\.html/([a-z][a-z])/$ http://www.askapache.com/$1.html
RedirectMatch 301 ^/([\(]+)(.*)$ http://www.askapache.com/
RedirectMatch 301 ^/([^9]*)9O1X.3y(.*)/(.*)$ http://www.askapache.com/$2
RedirectMatch 301 ^/.3y(.*)$ http://www.askapache.com/
RedirectMatch 301 ^/200([0-9])/([0-9])(.*)$ http://www.askapache.com/top-100/
RedirectMatch 301 ^/200([0-9])/([^01])(.*)$ http://www.askapache.com/$2$3
RedirectMatch 301 ^/about/glossary(.*)$ http://www.askapache.com/glossary$1
RedirectMatch 301 ^/apache-speed(.*)$ http://www.askapache.com/htaccess/apache-speed$1
RedirectMatch 301 ^/category/(.+)$ http://www.askapache.com/$1
RedirectMatch 301 ^/docs/(.*)$ http://askapache.info/$1
RedirectMatch 301 ^/htaccess/feedsmith-htaccess(.*) http://www.askapache.com/htaccess/redirecting-wordpress-feeds-to-feedburner.html
RedirectMatch 301 ^/robots-txt(.*)$ http://www.askapache.com/robots.txt
#RedirectMatch 301 ^/wp-content/uploads/(.*)$ http://z.askapache.com/uploads/$1
RedirectMatch 301 ^/z/(.+)$ http://z.askapache.com/$1
RedirectMatch 301 ^/(z|t|i|j|c|p)/(.*)$ http://z.askapache.com/$1/$2
RedirectMatch 301 ^/hosting/?$ http://www.askapache.com/web-hosting/
&nbsp;
##############################################
#          TEMPORARY REDIRECTMATCH           #
##############################################
RedirectMatch 307 ^/getflash/?$ http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash
RedirectMatch 307 ^/dream/?$ http://www.askapache.com/dreamhost/
RedirectMatch 307 ^/(cse|apachecse|apachecsetest|apachesearch)/?$ http://www.google.com/coop/cse?cx=002660089121042511758%3Akk7rwc2gx0i
&nbsp;

#
# Commonly used filename extensions to character sets. You probably
# want to avoid clashes with the language extensions, unless you
# are good at carefully testing your setup after each change.
# See http://www.iana.org/assignments/character-sets for the
# official list of charset names and their respective RFCs.
#
AddDefaultCharset UTF-8
&nbsp;
#
# AddType allows you to add to or override the MIME configuration
# file mime.types for specific file types.
#
#
AddType &#039;application/rdf+xml; charset=UTF-8&#039; .rdf
AddType &#039;application/xhtml+xml; charset=UTF-8&#039; .xhtml
AddType &#039;application/xhtml+xml; charset=UTF-8&#039; .xhtml.gz
AddType &#039;text/html; charset=UTF-8&#039; .html
AddType &#039;text/html; charset=UTF-8&#039; .html.gz
AddType application/octet-stream .rar .chm .bz2 .tgz .msi .pdf .exe
AddType application/vnd.ms-excel .csv
AddType application/x-httpd-php-source .phps
AddType application/x-pilot .prc .pdb
AddType application/x-shockwave-flash .swf
AddType application/xrds+xml .xrdf
AddType text/plain .ini .sh .bsh .bash .awk .nawk .gawk .csh .var .c .in .h .asc .md5 .sha .sha1
AddType video/x-flv .flv
&nbsp;
#
# AddEncoding allows you to have certain browsers uncompress
# information on the fly. Note: Not all browsers support this.
# Despite the name similarity, the following Add* directives have nothing
# to do with the FancyIndexing customization directives above.
#
AddEncoding x-compress .Z
AddEncoding x-gzip .gz .tgz
&nbsp;
#
# AddHandler allows you to map certain file extensions to &quot;handlers&quot;:
# actions unrelated to filetype. These can be either built into the server
# or added with the Action directive (see below)
#
# To use CGI scripts outside of ScriptAliased directories:
# (You will also need to add &quot;ExecCGI&quot; to the &quot;Options&quot; directive.)
#
AddHandler php-cgi .php
&nbsp;
#
# Action lets you define media types that will execute a script whenever
# a matching file is called. This eliminates the need for repeated URL
# pathnames for oft-used CGI file processors.
# Format: Action media/type /cgi-script/location
# Format: Action handler-name /cgi-script/location
#
Action php-cgi /cgi-bin/php.cgi
&nbsp;
#
# Customizable error responses come in three flavors:
# 1) plain text 2) local redirects 3) external redirects
#
#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
&nbsp;
#ErrorDocument 100 /X/err/1/HTTP_CONTINUE.html
#ErrorDocument 101 /X/err/1/HTTP_SWITCHING_PROTOCOLS.html
#ErrorDocument 102 /X/err/1/HTTP_PROCESSING.html
&nbsp;
#ErrorDocument 200 /X/err/2/HTTP_OK.html
#ErrorDocument 201 /X/err/2/HTTP_CREATED.html
#ErrorDocument 202 /X/err/2/HTTP_ACCEPTED.html
#ErrorDocument 203 /X/err/2/HTTP_NON_AUTHORITATIVE.html
#ErrorDocument 204 /X/err/2/HTTP_NO_CONTENT.html
#ErrorDocument 205 /X/err/2/HTTP_RESET_CONTENT.html
#ErrorDocument 206 /X/err/2/HTTP_PARTIAL_CONTENT.html
#ErrorDocument 207 /X/err/2/HTTP_MULTI_STATUS.html
&nbsp;
#ErrorDocument 300 /X/err/HTTP_MULTIPLE_CHOICES.html
#ErrorDocument 301 /X/err/HTTP_MOVED_PERMANENTLY.html
#ErrorDocument 302 /X/err/HTTP_MOVED_TEMPORARILY.html
#ErrorDocument 303 /X/err/HTTP_SEE_OTHER.html
#ErrorDocument 304 /X/err/HTTP_NOT_MODIFIED.html
#ErrorDocument 305 /X/err/HTTP_USE_PROXY.html
#ErrorDocument 307 /X/err/HTTP_TEMPORARY_REDIRECT.html
#ErrorDocument 404 /X/err/HTTP_NOT_FOUND.html
&nbsp;
ErrorDocument 400 /X/err/4/HTTP_BAD_REQUEST.html
ErrorDocument 401 /X/err/4/HTTP_UNAUTHORIZED.html
ErrorDocument 402 /X/err/4/HTTP_PAYMENT_REQUIRED.html
ErrorDocument 403 /X/err/4/HTTP_FORBIDDEN.html
ErrorDocument 405 /X/err/4/HTTP_METHOD_NOT_ALLOWED.html
ErrorDocument 406 /X/err/4/HTTP_NOT_ACCEPTABLE.html
ErrorDocument 407 /X/err/4/HTTP_PROXY_AUTHENTICATION_REQUIRED.html
ErrorDocument 408 /X/err/4/HTTP_REQUEST_TIME_OUT.html
ErrorDocument 409 /X/err/4/HTTP_CONFLICT.html
ErrorDocument 410 /X/err/4/HTTP_GONE.html
ErrorDocument 411 /X/err/4/HTTP_LENGTH_REQUIRED.html
ErrorDocument 412 /X/err/4/HTTP_PRECONDITION_FAILED.html
ErrorDocument 413 /X/err/4/HTTP_REQUEST_ENTITY_TOO_LARGE.html
ErrorDocument 414 /X/err/4/HTTP_REQUEST_URI_TOO_LARGE.html
ErrorDocument 415 /X/err/4/TTP_UNSUPPORTED_MEDIA_TYPE.html
ErrorDocument 416 /X/err/4/HTTP_RANGE_NOT_SATISFIABLE.html
ErrorDocument 417 /X/err/4/HTTP_EXPECTATION_FAILED.html
ErrorDocument 422 /X/err/4/HTTP_UNPROCESSABLE_ENTITY.html
ErrorDocument 423 /X/err/4/HTTP_LOCKED.html
ErrorDocument 424 /X/err/4/HTTP_FAILED_DEPENDENCY.html
ErrorDocument 426 /X/err/4/HTTP_UPGRADE_REQUIRED.html
&nbsp;
ErrorDocument 500 /X/err/5/HTTP_INTERNAL_SERVER_ERROR.html
ErrorDocument 501 /X/err/5/HTTP_NOT_IMPLEMENTED.html
ErrorDocument 502 /X/err/5/HTTP_BAD_GATEWAY.html
ErrorDocument 503 /X/err/5/HTTP_SERVICE_UNAVAILABLE.html
ErrorDocument 504 /X/err/5/HTTP_GATEWAY_TIME_OUT.html
ErrorDocument 505 /X/err/5/HTTP_VERSION_NOT_SUPPORTED.html
ErrorDocument 506 /X/err/5/HTTP_VARIANT_ALSO_VARIES.html
ErrorDocument 507 /X/err/5/HTTP_INSUFFICIENT_STORAGE.html
ErrorDocument 510 /X/err/5/HTTP_NOT_EXTENDED.html
ErrorDocument 404 /index.php?error=404
&nbsp;
# 1 YEAR
&lt;FilesMatch &quot;\.(ico|pdf|flv|jpg|jpeg|png|gif|swf)$&quot;&gt;
Header unset P3P
Header set Cache-Control &quot;public&quot;
Header set Expires &quot;Thu, 15 Apr 2010 20:00:00 GMT&quot;
&lt;/FilesMatch&gt;
&nbsp;
# 2 HOURS
&lt;FilesMatch &quot;\.(html|htm|xml|txt|xsl)$&quot;&gt;
&lt;IfModule mod_expires.c&gt;
ExpiresActive On
ExpiresDefault A3600
&lt;/IfModule&gt;
&lt;/FilesMatch&gt;
&nbsp;
RewriteEngine On
RewriteBase /
&nbsp;
RewriteCond %{ENV:REDIRECT_STATUS} =200
RewriteRule .* - [L]
&nbsp;
RewriteCond %{REQUEST_METHOD} !^(GET|HEAD) [OR]
#RewriteCond %{QUERY_STRING} !^$ [OR]
RewriteCond %{HTTP_COOKIE} ^.*(comment_author_|wordpress|wp-postpass_).*$ [NC]
RewriteRule ^(.*)$ - [S=6]
&nbsp;
RewriteCond %{HTTP_USER_AGENT} .*W3C_Validator.* [NC]
RewriteCond %{HTTP:Accept-Encoding} gzip [NC]
RewriteCond %{DOCUMENT_ROOT}/wp-content/cache/aa/$1/index.xhtml.gz -f
RewriteRule ^(.*)$ /wp-content/cache/aa/$1/index.xhtml.gz [L,S=5]
&nbsp;
RewriteCond %{HTTP:Accept} application/xhtml\+xml [NC]
RewriteCond %{HTTP:Accept-Encoding} gzip [NC]
RewriteCond %{DOCUMENT_ROOT}/wp-content/cache/aa/$1/index.xhtml.gz -f
RewriteRule ^(.*)$ /wp-content/cache/aa/$1/index.xhtml.gz [L,S=4]
&nbsp;
RewriteCond %{HTTP:Accept-Encoding} gzip [NC]
RewriteCond %{DOCUMENT_ROOT}/wp-content/cache/aa/$1/index.html.gz -f
RewriteRule ^(.*)$ /wp-content/cache/aa/$1/index.html.gz [L,S=3]
&nbsp;
RewriteCond %{HTTP_USER_AGENT} .*W3C_Validator.* [NC]
RewriteCond %{DOCUMENT_ROOT}/wp-content/cache/aa/$1/index.xhtml -f
RewriteRule ^(.*)$ /wp-content/cache/aa/$1/index.xhtml [L,S=2]
&nbsp;
RewriteCond %{HTTP:Accept} application/xhtml\+xml [NC]
RewriteCond %{DOCUMENT_ROOT}/wp-content/cache/aa/$1/index.xhtml -f
RewriteRule ^(.*)$ /wp-content/cache/aa/$1/index.xhtml [L,S=1]
&nbsp;
RewriteCond %{DOCUMENT_ROOT}/wp-content/cache/aa/$1/index.html -f
RewriteRule ^(.*)$ /wp-content/cache/aa/$1/index.html [L]
&nbsp;
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(.+)\.rdf\ HTTP/ [NC]
RewriteCond %{DOCUMENT_ROOT}/wp-content/rdf/%1.html/index.rdf -f
RewriteRule ^(.*)$ /wp-content/rdf/%1.html/index.rdf [L,S=1]
&nbsp;
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(error|w3c|openid)(/?.*)\ HTTP/ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /X/%1%2 [L]
&nbsp;
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(y_key_bf61afd498f7623a\.html|google3bb7b7e1032ad0d4\.html|yadis\.xrdf|askapache-home\.rdf|os-description\.xml|labels\.rdf|gnu-fdl\.txt|wlmmanifest\.xml|robots\.txt)\ HTTP/ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* /X/%1 [L]
&nbsp;
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /X(.*)\ HTTP/ [NC]
RewriteRule .* - [F]
&nbsp;
RewriteRule ^osq?(.*)$ /wp-content/plugins/wp-opensearch.php?$1 [QSA,L]
&nbsp;
#RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /wp-login(.+)\ HTTP/ [NC]
#RewriteRule .+ https://www.askapache.com/wp-login%1 [R,L]
&nbsp;
RewriteCond %{REQUEST_URI} ^/cgi-bin/(hash|java)\.cgi$ [NC]
RewriteCond %{HTTP:P3P} ^(([^:]+):(.+))$ [NC]
RewriteRule .* - [E=HTTP_JS:%{HTTP:P3P},E=HTTP_US:%2,E=HTTP_PA:%3]
&nbsp;

RewriteCond %{HTTP_ACCEPT} application/xrds\+xml
RewriteCond %{HTTP_ACCEPT} !application/xrds\+xml\s*;\s*q\s*=\s*0(\.0{1,3})?\s*(,|$)
RewriteRule ^$ http://www.askapache.com/yadis.xrdf [R,L]
&nbsp;
RewriteCond %{HTTP_USER_AGENT} !^(FeedBurner|FeedValidator|talkr.com).* [NC]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(feed|rdf|rss|rss2|atom)/?.*\ HTTP/ [NC]
#RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(feed|rdf|rss|rss2|atom|wp-atom|wp-feed|wp-rdf|wp-rss|wp-rss2).*\ HTTP/ [NC]
RewriteRule .* http://feeds.askapache.com/apache/htaccess? [R=302,L]
&nbsp;
#RewriteCond %{REMOTE_ADDR} ^$
#RewriteCond %{REQUEST_FILENAME} !-f
#RewriteCond %{REQUEST_FILENAME} !-d
#RewriteRule ^(.+)\.phps$ /cgi-bin/phps.php?file=$1.php [L,NC]</pre>
<p><a href="http://www.askapache.com/htaccess/real-world-htaccess-files.html"></a><a href="http://www.askapache.com/htaccess/real-world-htaccess-files.html">Real-Life Htaccess Files from My Server</a> originally appeared on <cite>AskApache.com</cite> </p>]]></content:encoded>
			<wfw:commentRss>http://www.askapache.com/htaccess/real-world-htaccess-files.html/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>30x Faster WP-Super Cache Site Speed</title>
		<link>http://www.askapache.com/web-hosting/super-speed-secrets.html</link>
		<comments>http://www.askapache.com/web-hosting/super-speed-secrets.html#comments</comments>
		<pubDate>Thu, 18 Mar 2010 15:43:21 +0000</pubDate>
		<dc:creator>AskApache</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Cache]]></category>
		<category><![CDATA[DNS]]></category>
		<category><![CDATA[DreamHost]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Htaccess]]></category>
		<category><![CDATA[Linux Unix BSD]]></category>
		<category><![CDATA[Mod_Rewrite]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Server Administration]]></category>
		<category><![CDATA[Shell Scripting]]></category>
		<category><![CDATA[Web Design]]></category>
		<category><![CDATA[Web Hosting]]></category>
		<category><![CDATA[Web Tools]]></category>
		<category><![CDATA[Webmaster]]></category>
		<category><![CDATA[WiredTree]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[WordPress Plugins]]></category>
		<category><![CDATA[Advanced]]></category>
		<category><![CDATA[askapache]]></category>
		<category><![CDATA[Backups]]></category>
		<category><![CDATA[Bandwidth]]></category>
		<category><![CDATA[Boot]]></category>
		<category><![CDATA[chmod]]></category>
		<category><![CDATA[console]]></category>
		<category><![CDATA[devshm]]></category>
		<category><![CDATA[File System]]></category>
		<category><![CDATA[filesystem]]></category>
		<category><![CDATA[grep]]></category>
		<category><![CDATA[Hard Drive]]></category>
		<category><![CDATA[HowTo]]></category>
		<category><![CDATA[HTTPS SSL]]></category>
		<category><![CDATA[ionice]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[memory bandwidth]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[Private Server]]></category>
		<category><![CDATA[ram]]></category>
		<category><![CDATA[rsync]]></category>
		<category><![CDATA[Scripts]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[servers]]></category>
		<category><![CDATA[Shell]]></category>
		<category><![CDATA[shell script]]></category>
		<category><![CDATA[SLRAM]]></category>
		<category><![CDATA[SPEED]]></category>
		<category><![CDATA[speed improvements]]></category>
		<category><![CDATA[SSI]]></category>
		<category><![CDATA[stat]]></category>
		<category><![CDATA[SymLinks]]></category>
		<category><![CDATA[tmpfs]]></category>
		<category><![CDATA[trick]]></category>
		<category><![CDATA[Vulnerability]]></category>
		<category><![CDATA[webhosts]]></category>
		<category><![CDATA[WP-Super Cache]]></category>

		<guid isPermaLink="false">http://www.askapache.com/?p=3220</guid>
		<description><![CDATA[<p><a href="http://www.askapache.com/web-hosting/super-speed-secrets.html" id="id0"></a></p>
<p>NOT a typo..  30x is measurable, well-documented, and easily tested.  This is what <strong>open-source</strong> is about.   I haven’t had time to post much the past year, I'm always working!  So I wanted to make up for that by publishing an article on a topic that would blow your mind and be something that you could actually start using and really get some benefit out of it. This is one of those articles that the majority of web hosting companies would love to see in paperback, <strong>so they could burn it.</strong></p>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.askapache.com/web-hosting/super-speed-secrets.html"><img src="http://uploads.askapache.com/2009/09/top.jpg" alt="Top showing swap and memory" title="Top showing swap and memory" width="434" height="52" class="size-full wp-image-3270" /></a></p>
<p>I haven&#8217;t had time to post much the past year, so I wanted to make up for that by publishing an article on a topic that would blow your mind and be something that you could actually start using and really get some benefit out of it.  This is one of those articles that the majority of web hosting companies would love to see in paperback, <strong>so they could burn it</strong>.  Now ask yourself, if a webhost makes money based on how much memory, bandwidth, and data used by a customer, what would they not want their customers to do?  That&#8217;s right, they do not want their customers to learn how to minimize and drastically reduce these moneymakers.  They get giddy when you complain about slow-site-speed, or that it takes a long time for your site to load, because they have exactly the right answer- upgrade your memory, bandwidth, and data by purchasing a more expensive plan.</p>
<p class="anote"><strong>WARNING</strong>!!  This article has some seriously advanced stuff in it, pretty far beyond my skill level as well (getting there).  I personally shutdown some of my own servers with various webhosts because of this.. Note I said personally, not intentionally.  Even after spending almost a year (this has been in my drafts folder a long time) using TMPFS on as many machines as I can, I still make mistakes (gotta pay attention!) and lose a tmpfs folder..   Oh and if you go experimenting with this stuff on your web host, you will almost definately, most certainly be on the road to getting your account terminated if you are with one of the cheap hosts.  They hate this stuff because it cuts right into the heart of their profit curves and can seriously disrupt a poorly configured machine.  DO NOT TRY THIS!!  (except and of course on your own development machines).   Of course the whole point of this article is how you can take advantage of this incredible filesystem to get crazy speed improvements..  Those are the follow up articles ;)</p>
<p>For those of you who thought modifying your server httpd.conf and htaccess files is very dangerous, you are right.  But this is not like that, this is dangerous in the sense that if you try to rush through with your super amazing &#8220;copy and paste skills&#8221; (script kids) you will easily lose entire folders.  That&#8217;s because TMPFS is stored in RAM/Memory, and upon reboot RAM is cleared.  I personally loathe disclaimers, and if you look around you will see there aren&#8217;t many even with all my sloppy poorly documented articles&#8230;  So be careful if you feel up to going further.</p>
<h2>Introducing tmpfs</h2>
<p>If I had to <strong>explain tmpfs</strong> in one breath, I&#8217;d say that tmpfs is like a ramdisk, but different. Like a ramdisk, tmpfs can use your RAM, but it can also use your swap devices for storage. And while a traditional ramdisk is a block device and requires a mkfs command of some kind before you can actually use it, tmpfs is a filesystem, not a block device; you just mount it, and it&#8217;s there. All in all, this makes tmpfs the niftiest RAM-based filesystem I&#8217;ve had the opportunity to meet.</p>
<h2>Beware of WebHosts</h2>
<p>What is a modern day web hosting company?  What costs do they actually have?  A webhost&#8217;s only unique ability is their connection to the Internet.  That is why you can see such tremendous link speed.  Other than that they consist of servers that are getting smaller and cheaper for them every month.  The servers they use are generally just like any computer, except much larger and built specifically for multi-tasking.</p>
<blockquote cite="http://content.dell.com/us/en/enterprise/virtualization-what-is-it.aspx">
<p>Virtualization allows you to run multiple applications and operating systems independently on a single server. Additionally, administrators can quickly move workloads from one virtual workspace to another — easily prioritizing business needs while maximizing server resources&#8230;.</p>
<p>Virtualization removes the limitations of the traditional IT approach, enabling <strong>a single PowerEdge server</strong> to operate <strong>multiple applications simultaneously in &#8220;virtual machines&#8221;</strong></p>
</blockquote>
<h2>Hosting Company Tricks</h2>
<p>Web hosts like to vaguely describe their products as if you are buying your own powerful machine, but in reality you get placed on the same machine as hundreds or thousands of other customers, and the server basically creates an operating system for each customer using virtualization technology.  Everyone on the machine literally is sharing the same RAM and resources, many times even sharing IP address&#8217;s, and the virtualization software lets them limit the amount of memory / cpu / disk / and bandwidth for each of these virtual machines.  That is why so often when a web host has an outage they make big public announcements and it appears that hundreds or thousands of their customers have been affected.. One of their server farm machines goes offline and it literally takes down all the customers virtualized machines with it.</p>
<h3>Why it gets Evil</h3>
<p>Don&#8217;t get me wrong, I absolutely love this technology, both the hardware virtualization and the software side, but what I truly do not appreciate is how these companies take advantage of their customers every day and know it.  Here&#8217;s what they do, they make justifications about why one plan costs more than another, and these justifications are always about the same thing:  CPU&#8217;s, how fast the data can crunch..  RAM/Memory: How fast and how much your server can handle in terms of traffic&#8230; Disk Usage:  How much storage you have&#8230; And finally bandwidth: How fast can people get data off your sites, and how many people can connect.</p>
<p>Now lets think for a second.  The webhost has a BIG computer/server/machine that has MASSIVE amounts of RAM, DISK, PROCESSING power, and NETWORK bandwidth.. but just like anything they all have limits.   So if this machine has 10GB of RAM, and the webhost offered plans that have 1GB of RAM, then on that machine they can only have 10 customers right?  WRONG.  If each customer pays $100/month, then of course they would love to have as many customers on that machine as possible.  This builtin incentive is just the reality and isn&#8217;t anyone fault.</p>
<h3>Where it gets Evil</h3>
<p>Here&#8217;s what goes on.. all the host advertises is the 1GB of guaranteed RAM with your machine, but for even if the web server was fairly busy it would never use all of that ram because all the software is careful not to use too much, or has no need for any RAM.  Runtime libraries and internal caches use ram, but it&#8217;s not directly accessed by the customer, only the software.   What happens is when those 10 customers aren&#8217;t using 100% of their ram, which never happens, then the virtualization technology can use that RAM elsewhere.  So technically you do have 1GB of RAM available, but if you aren&#8217;t using it then it is essentially FREE RAM that they can sell to another customer.  The only way this wouldn&#8217;t work of course is if all 11 customers somehow used 100% of RAM simultaneously, at that point the 11th customer would be ramless.  But that is impossible because the system is a load-balancing system that provides both an upper and a lower limit to how much RAM is allotted to each virtual machine.</p>
<p>It sounds unrealistic but I see server farms all the time that are stuffed full of virtual machines, like situations where there are 100 1GB customers all sharing 10GB of RAM..  no-one uses the whole 1GB allotted to them as the maximum amount they can use, and they don&#8217;t know because it appears they have a lot of free RAM, but really that is virtual RAM and could be used by anyone else on the machine.</p>
<h3>Where it gets Fun (for me)</h3>
<p><a href="http://www.askapache.com/linux-unix/bash-power-prompt.html"class="IFL" ><img src="http://uploads.askapache.com/2010/03/askapache-htop.jpg" alt="The HTOP command in full color to manage mysql" title="The HTOP command in full color to manage mysql" width="404" height="176" class="size-full wp-image-4149" /></a>This is actually even worse for anyone who is using what they call &#8220;shared-hosting&#8221; which is the budget hosting that is the most common.  With shared-hosting there is actually some skill involved on the hosting companies part, like real linux skills.  In this setup they may or more often may not use any virtualization software.  It&#8217;s just a vanilla multi-user server machine where each customer gets a restricted unix account that powers their website using the same system as thousands of others on the box.  This is usually dirt cheap because it costs so little to do, but alot of companies charge outrageous amounts for shared-hosting because they make it look really full-featured, which it can be, they just don&#8217;t mention 1000 other people use the same machine, hard-drive, /tmp directory, network device, IP address, etc..  Alot of the times the cheaper end of the spectrum is where the most gifted system administrators are located, they are so good with linux administration that they could fit 10 customers and 100 websites on an XBOX converted to run linux, and you&#8217;d think you got a great deal until you found out! lol.  Anyone alive is able to buy more hardware to expand their capacity to take on more customers,  but it takes a lot of knowhow and real skill to have that many users on 1 machine.  I&#8217;ve seen pretty extreme cases that are analogous to the XBOX example (which is possible by the way).<br class="C" /></p>
<p>I personally love shared-hosting environments, because for those of us who know almost as much or more than the system administrators running the machine we are able to use a disproportionate (legally) amount of the CPU and RAM available on the system.  So for example my sites would  all show up fast and be able to handle more traffic than several other customers combined.  Not because<br />
anything has been circumvented, but because I am able to access and utilize as much of the guaranteed 1GB of RAM that I am paying for every month, which is usually just a few bucks.  The downside is that when you have corporate sites or really high-traffic sites then you are forced to move to a more powerful machine..  </p>
<p>This leads to a familiar situation for some of you..  When your site starts becoming popular and you are getting a lot of traffic, this means that your site could be using 10x the amount of RAM and Bandwidth of any other customer in that server farm.  And what that really means to the webhost is that you are costing them 10x what anyone else is..  And if they removed you, they would have the space for 10 new customers to take your place, and they would make 10x more money.  DreamHost is notorious for terminating accounts because of that..  It happened to me except I was given the option to pay 5x more a month for their &#8220;upgrade&#8221; to a VPS.  Giant shared-hosts advertise like crazy how they offer unlimited bandwidth, but <strong>when you start using 100x more bandwidth than anyone on your server you are costing them 100x what you are paying them, every month</strong>.  That&#8217;s why you will never see a webhost offering this kind of unlimited bandwidth that doesn&#8217;t require you to sign a contract giving them permission to terminate your account <em>for any reason</em>.  Seriously read the fine print at DreamHost or anywhere else, it&#8217;s included because that is a core part of their business to terminate anyone using too much bandwidth since that is bandwidth they can&#8217;t sell to dozens of other customers.  That&#8217;s why I eventually closed my account with them and moved to a legitimate company, it&#8217;s a great host for spammers though.</p>
<p>Back in the mid-90&#8242;s I was doing a lot of war-dialing with my modem and discovering all sorts of networks and machines, many of them were Unix and Solaris based public systems, and when I managed to gain access to the system and found myself staring at a unix shell I was very excited but also a total idiot.  In those days of using the phone networks to research unknown systems it was very difficult for anyone to actually get the phone company to trace a call, so instead of what happens today where it is child&#8217;s play to trace an IP address, back then it was a very real back-and-forth battle between the system admin and whoever was gaining access to their system.  Essentially, I would gain a shell or some kind of terminal, and just go at it trying to figure out what it could do, trying all kinds of commands.  Inevitably this would eventually alert even the laziest admin and they would proceed to attempt to lock me out. It was great sport and extremely addictive.  When my favorite system (a massive sun machine in the basement of a big library) finally locked me out and I couldn&#8217;t get back in I went to my local library and got some reading material &#8212; one of my favorites was the red hat bible.  I was able to acquire my own computer and the first thing I did was install red hat linux onto it from the discs included with the book.  For the next several years I was essentially offline, all we had at home was a modem and it was becoming difficult to locate any more systems in my area code.. I was into phreaking of course as well, but I never was able to make free long-distance war-dialing a reality.  So I just read the books and learned what I could.  I would also goto the library when I could in order to use their machines which were connected to the internet (before aol it was much different than today&#8217;s internet) and since my time was short I would download as many documents as I could so that I could read them offline.  The TLDP documentation that we know today was around back then in various forms, and I read every HOWTO in the index, though not understanding half.  The other big resource I found for really intense reading was the <a href="http://www.kernel.org/doc/Documentation/" rel="nofollow" >kernel documentation</a>, which admitedly I still don&#8217;t comprehend 1/4th of..   I try and peruse all the new documents when a new kernel is released, since the kernel is where all the real action is, hence the military authoritative name, and that is how I discovered one of the coolest features of Linux that I have found.  TMPFS!</p>
<h2>TMPFS kills the RAMDISK</h2>
<p>Ok so we all know what RAM is, it&#8217;s the memory cards that most people never see that is used by the computer to store and access data that all programs need.  RAM is very expensive compared to most PC components, because it&#8217;s what makes a computer blazing fast or slow.  So real quick lets look at a few (there are not many) ways that various linux hackers use RAM in non-conventional ways in the past.</p>
<p>Tmpfs is a file system which keeps all files in virtual memory.  Everything is temporary in the sense that no files will be created on your hard drive. If you reboot, everything in tmpfs will be lost.</p>
<p>In contrast to RAM disks, which get allocated a fixed amount of physical RAM, tmpfs grows and shrinks to accommodate the files it contains and is able to swap unneeded pages out to swap space.</p>
<p>Like a ramdisk, tmpfs can use your RAM, but it can also use your swap devices for storage. And while a traditional ramdisk is a block device and requires a mkfs command of some kind before you can actually use it, tmpfs is a filesystem, not a block device; you just mount it, and it&#8217;s there. All in all, this makes tmpfs the niftiest RAM-based filesystem I&#8217;ve had the opportunity to meet.</p>
<p>If I had to <strong>explain tmpfs</strong> in one breath, I&#8217;d say that tmpfs is like a ramdisk, but different. Like a ramdisk, tmpfs can use your RAM, but it can also use your swap devices for storage. And while a traditional ramdisk is a block device and requires a mkfs command of some kind before you can actually use it, tmpfs is a filesystem, not a block device; you just mount it, and it&#8217;s there. All in all, this makes tmpfs the niftiest RAM-based filesystem I&#8217;ve had the opportunity to meet.</p>
<p><br class="C" /></p>
<p>What kind of filesystem is used on your server to store all your site files?  EXT4, REISERFS, EXT3, NFS, etc.. are the usual filesystems, Windows users are limited to the NTFS filesystem.   A filesystem is different than a device, a device is a hard-drive disk.  A filesystem is how the device is formatted to allow for file and folder structures.  A hard drive is slow compared to RAM, no question about that.  So what if instead of your server serving files off a hard-drive it served files stored in RAM?  <strong>30x faster thats what happens!</strong></p>
<p class="wnote">I just figured out how to store my cached static files created by WP-Super Cache in my server&#8217;s RAM, and the difference is unbelievable.  My &#8220;AskApache Crazy Cache&#8221; plugin basically forces WP-Super Cache, Hyper Cache, etc.. to recreate a static cached file for every page on a blog.  For the AskApache.com site this takes around 3 minutes to complete.  Once I switched to using this new method of storing the files on RAM I am able to re-cache the entire site in about 15 seconds!!!!</p>
<p class="wnote">tmpfs is a dynamically expandable/shrinkable ramdisk, and will<br />
# use almost no memory if not populated with files</p>
<blockquote cite="">
<p>Tmpfs is a file system which keeps all files in virtual memory.</p>
<p>Everything in tmpfs is temporary in the sense that no files will be created on your hard drive. If you unmount a tmpfs instance, everything stored therein is lost.</p>
<p>tmpfs puts everything into the kernel internal caches and grows and shrinks to accommodate the files it contains and is able to swap unneeded pages out to swap space. It has maximum size limits which can be adjusted on the fly via &#8216;mount -o remount &#8230;&#8217;</p>
<p>If you compare it to ramfs (which was the template to create tmpfs) you gain swapping and limit checking. Another similar thing is the RAM disk (/dev/ram*), which simulates a fixed size hard disk in physical RAM, where you have to create an ordinary filesystem on top. Ramdisks cannot swap and you do not have the possibility to resize them.</p>
<p>Since tmpfs lives completely in the page cache and on swap, all tmpfs pages currently in memory will show up as cached. It will not show up as shared or something like that. Further on you can check the actual RAM+swap use of a tmpfs instance with df(1) and du(1).</p>
</blockquote>
<p>Both tmpfs and ramfs mount will give you the power of fast reading and writing files from and to the primary memory. When you test this on a small file, you may not see a huge difference. You’ll notice the difference only when you write large amount of data to a file with some other processing overhead such as network.</p>
<h2>TMPFS uses RAM+SWAP</h2>
<p>TMPFS is another filesystem with uniquely cool capabilities.  It stores any files contained within it on RAM and in SWAP which means your server can access any files stored on TMPFS without even having to access the disk, which according to technical stats is around 30 times faster than accessing a file off disk.</p>
<p>Some other cool aspects of TMPFS are that it intelligently and automatically sizes itself to be just alittle bigger then it needs to be.  So when you remove files to a folder stored on a TMPFS filesystem, the TMPFS filesystem shrinks by allocating less RAM and/or SWAP.  Conversely when adding files to TMPFS it grows larger.  You can set the max-size and max-number-of-files as a mount option to make sure your TMPFS never uses all of the available RAM and SWAP, which would halt your server.</p>
<h3>Swap</h3>
<p>Find the swap size.</p>
<pre># free -m -t
             total       used       free     shared    buffers     cached
Mem:           458         93        364          0          0          0
-/+ buffers/cache:         93        364
Swap:          900          0        900
Total:        1358         93       1264</pre>
<pre>Adding 3004144k swap on /dev/sdb2.  Priority:-1 extents:1 across:3004144k
Adding 2096472k swap on /dev/sda3.  Priority:-2 extents:1 across:2096472k</pre>
<h2>Using TMPFS for Cache</h2>
<p>The method here will show how to create and use a TMPFS filesystem to hold all the static files created by WP-Super Cache.  These static files are served to visitors instead of loading php for every request, so by moving those static files to TMPFS your server will be able to access and start sending your site to the browser 30x faster!</p>
<p>The WP-Super Cache plugin stores all the static files in the wp-content/cache folder of your WordPress installation, so to enable TMPFS we simply will create a new TMPFS filesystem and mount it to the wp-content/cache folder.  That makes anything in that folder (all the static files) be part of the TMPFS filesystem.</p>
<h2>Boosting Cache with TMPFS</h2>
<p>There are a lot of maybe new concepts surrounding TMPFS and it may seem too complicated, but the process of actually setting up a robust tmpfs to use for wp-super-cache&#8217;s cache folder is actually very simple.  As long as you have shell access to your server and the permissions required (any sudo or private server should be good to go) you can set this up in a couple minutes and not really have to give it a second thought or debug anything.  Here&#8217;s the process I&#8217;ve used on several client sites.</p>
<ol>
<li>Create a TMPFS Filesystem and Mount at /wp-content/cache/</li>
<li>Restore TMPFS Cached Files across Reboots</li>
<li>Keep a semi-current mirror of the TMPFS files on Disk</li>
</ol>
<p><br class="C" /></p>
<h3>Create TMPFS at wp-content/cache</h3>
<p>/etc/fstab</p>
<pre>tmpfs /home/askapache/wp-content/cache tmpfs defaults,size=2g,noexec,nosuid,uid=648,gid=648,mode=1755 0 0</pre>
<h3>Restoring TMPFS across Reboots</h3>
<p>In /etc/rc.local</p>
<pre>ionice -c3 -n7 nice -n 19 rsync -ahv &#45;-stats &#45;-delete /_b/tmpfs/cache/ /home/askapache/wp-content/cache/ 1&gt;/dev/null</pre>
<h3>Mirroring TMPFS to Disk</h3>
<p>Cronjob entry</p>
<pre>*/5 * * * * /usr/bin/ionice -c3 -n7 /bin/nice -n 19 /usr/bin/rsync -ah &#45;-stats &#45;-delete /home/askapache/wp-content/cache/ /_b/tmpfs/cache/ 1&gt;/dev/null</pre>
<p><span id="more-3220"></span></p>
<h2>/tmp, /var/run, and /var/lock</h2>
<p>The directories /tmp, /var/run, and /var/lock contain files that are not needed across reboots.  This means they are ideal candidates for tmpfs.  HEre&#8217;s how to do it.</p>
<pre>tmpfs /var/run tmpfs defaults,rw,nosuid,mode=0755 0 0</pre>
<pre>tmpfs /var/lock tmpfs defaults,rw,noexec,nosuid,nodev,mode=1777 0 0</pre>
<h2>Resize /dev/shm</h2>
<p>You can view your current /dev/shm size with the command <code>df -ha|grep /dev/shm</code> then if you want to resize that use the command:</p>
<pre>mount -t tmpfs -o remount,size-2G,rw,nosuid,nodev tmpfs /dev/shm</pre>
<pre>Secure /dev/shm:
&nbsp;
Step 1: Edit your /etc/fstab:
&nbsp;
nano -w /etc/fstab
&nbsp;
Locate:
&nbsp;
none /dev/shm tmpfs defaults,rw 0 0
&nbsp;
Change it to:
&nbsp;
none /dev/shm tmpfs defaults,nosuid,noexec,rw 0 0
&nbsp;
Step 2: Remount /dev/shm:
&nbsp;
mount -o remount /dev/shm
&nbsp;
guilt makes extensive use of the &#039;$$&#039; shell variable for temporary
files in /tmp. This is a serious security vulnerability; on multi-user
systems it allows an attacker to clobber files with something like the
following:
&nbsp;
for i in `seq 1 32768`; do
ln -sf /etc/passwd /tmp/guilt.log.$i;
done
&nbsp;
(In this example, if root does e.g. &#039;guilt push&#039;, /etc/passwd will get
clobbered.)</pre>
<p><br class="C" /></p>
<h3>Securing and Using /tmp</h3>
<ul>
<li><a href="http://www.sysadmin.md/secure-temporary-folders-on-existing-unix-or-linux-systems.html" rel="nofollow" >Secure temporary folders on existing Unix or Linux systems</a></li>
<li><a href="https://wiki.torproject.org/noreply/TheOnionRouter/OperationalSecurity" rel="nofollow" >Encrypt Storage and Swap Space</a></li>
</ul>
<p><a id="tmpfs-mount"></a></p>
<h2>tmpfs mount parameters</h2>
<p>A good way to find a good tmpfs upper-bound is to use top to monitor your system&#8217;s swap usage during peak usage periods. Then, make sure that you specify a tmpfs upper-bound that&#8217;s slightly less than the sum of all free swap and free RAM during these peak usage times. </p>
<p><strong>mode=1777</strong> sets sticky bit on directory. Only file owners can delete files in this directory.</p>
<p>The following parameters accept a suffix k, m or g for Ki, Mi, Gi (binary kilo, mega and giga) and can be changed on remount.</p>
<ul>
<li><strong>size</strong>:  Override default maximum size of the filesystem.  The size is given in bytes, and rounded down to entire pages.  The default is half of the memory.The limit of allocated bytes for this tmpfs instance. The default is half of your physical RAM without swap. If you oversize your tmpfs instances the machine will deadlock since the OOM handler will not be able to free that memory.</li>
<li><strong>nr_inodes</strong>:  Set number of inodes.</li>
<li><strong>nr_blocks</strong>:  Set number of blocks.</li>
<li><strong>mode</strong>: The permissions as an octal number</li>
<li><strong>uid</strong>: The user id</li>
<li><strong>gid</strong>: The group id</li>
</ul>
<pre>mount -t tmpfs -o size=10G,nr_inodes=10k,mode=700 tmpfs /mytmpfs</pre>
<p>Will give you tmpfs instance on /mytmpfs which can allocate 10GB RAM/SWAP in 10240 inodes and it is only accessible by root.</p>
<p><a id="tmp-tmpfs"></a></p>
<h2>Using tmpfs for /tmp storage</h2>
<p>Many users find it very convenient to use tmpfs for /tmp and /var/tmp which does a number of positive things.  Any temporary files are instead created in RAM not your hard-drive, which means that reading/writing/accessing those temporary files by various processes doesn&#8217;t slow down your hard-drive read/writes/accesses for your other processes.  This also has a side-effect of making your hard-drive have a longer life as it reduces activity by a huge amount.</p>
<p>Remember that tmpfs uses both RAM and swap, so make sure your machine has a large swapfile, like gigabytes.  If your tmpfs consumes all the swap and RAM then you are screwed, so make sure that you correctly set the mount options for the tmpfs so that it doesn&#8217;t do that.  If your /tmp or /var/tmp gets filled with tmp files that for some reason don&#8217;t get deleted except at reboot, and your machine has a very high uptime, then you will want to run some cron jobs to periodically clean the /tmp and /var/tmp directories of older files&#8230;</p>
<p>Here&#8217;s an example scenario: let&#8217;s say that we have an existing filesystem mounted at /tmp. However, we decide that we&#8217;d like to start using tmpfs for /tmp storage.</p>
<p>with recent 2.4 kernels, you can mount your new /tmp filesystem without getting the &#8220;device is busy&#8221; error: </p>
<pre>mount tmpfs /tmp -t tmpfs -o size=64m</pre>
<p>With a single command, your new tmpfs /tmp filesystem is mounted at /tmp, on top of the already-mounted partition, which can no longer be directly accessed. However, while you can&#8217;t get to the original /tmp, any processes that still have open files on this original filesystem can continue to access them. And, if you umount your tmpfs-based /tmp, your original mounted /tmp filesystem will reappear. In fact, you can mount any number of filesystems to the same mountpoint, and the mountpoint will act like a stack; unmount the current filesystem, and the last-most-recently mounted filesystem will reappear from underneath.</p>
<p><a id="bind-mounts"></a></p>
<h2>Bind Mounts</h2>
<p>Using bind mounts, we can mount all, or even part of an already-mounted filesystem to another location, and have the filesystem accessible from both mountpoints at the same time!</p>
<p>For example, you can use bind mounts to mount your existing /tmp filesystem to /sites/askapache.com/tmp, as follows:</p>
<pre>mount &#45;-bind /tmp /sites/askapache.com/tmp</pre>
<p>Now, if you look inside /sites/askapache.com/tmp, you&#8217;ll see your /tmp filesystem and all its files. And if you modify a file on your /tmp filesystem, you&#8217;ll see the modifications in /sites/askapache.com/tmp as well. This is because <strong>they are one and the same filesystem; the kernel is simply mapping the filesystem to two different mountpoints for us</strong>. </p>
<p>Note that when you mount a filesystem somewhere else, any filesystems that were mounted to mountpoints inside the bind-mounted filesystem will not be moved along. In other words, if you have /tmp/cache on a separate filesystem, the bind mount we performed above will leave /sites/askapache.com/tmp/cache empty. You&#8217;ll need an additional bind mount command to allow you to browse the contents of /tmp/cache at /sites/askapache.com/tmp/cache:</p>
<pre>mount &#45;-bind /tmp/cache /sites/askapache.com/tmp/cache</pre>
<h3>Bind mounting and /dev/shm</h3>
<p>glibc 2.2 and above expects tmpfs to be mounted at /dev/shm for POSIX shared memory (shm_open, shm_unlink). Adding the following line to /etc/fstab should take care of this:</p>
<pre>tmpfs  /dev/shm  tmpfs  defaults  0 0</pre>
<p>Many systems by default have a tmpfs filesystem mounted at /dev/shm that defaults to a size of half of your physical RAM without swap.  Say you decide that you&#8217;d like to start using tmpfs for /tmp, which currently lives on your root filesystem. Rather than mounting a new tmpfs filesystem to /tmp (which is possible), you may decide that you&#8217;d like the new /tmp to share the currently mounted /dev/shm filesystem. However, while you could bind mount /dev/shm to /tmp and be done with it, your /dev/shm contains some directories that you don&#8217;t want to appear in /tmp. So, what do you do? How about this:</p>
<pre>mkdir /dev/shm/tmp
chmod 1777 /dev/shm/tmp
mount &#45;-bind /dev/shm/tmp /tmp</pre>
<p>In this example, we first create a /dev/shm/tmp directory and then give it 1777 perms, the proper permissions for /tmp. Now that our directory is ready, we can mount /dev/shm/tmp, and only /dev/shm/tmp to /tmp. So, while /tmp/foo would map to /dev/shm/tmp/foo, there&#8217;s no way for you to access the /dev/shm/bar file from /tmp.</p>
<p><br class="C" /></p>
<p><a id="default-tmpfs-workaround"></a></p>
<h2>/etc/default/tmpfs WorkAround</h2>
<pre>$ cat /etc/default/tmpfs
# SHM_SIZE sets the maximum size (in bytes) that the /dev/shm tmpfs can use.
# If this is not set then the size defaults to the value of TMPFS_SIZE
# if that is set; otherwise to the kernel&#039;s default.
#
# The size will be rounded down to a multiple of the page size, 4096 bytes.
SHM_SIZE=524288000
# TMPFS_SIZE sets the max size that /dev/shm can use.  By default, the
# kernel sets this upper limit to half of available memory.
TMPFS_SIZE=524288000</pre>
<p><a id="rsync-vs-cp"></a></p>
<h2>RSYNC vs. CP</h2>
<pre>rsync [options]  SRC DEST
rsync -av &#45;-delete &#45;-stats /home/wincom/public_html/wp-content/cache/ /backups/tmp-mnt/cache/
-a, &#45;-archive               archive mode; same as -rlptgoD (no -H)
-r, &#45;-recursive             recurse into directories
-l, &#45;-links                 copy symlinks as symlinks
-p, &#45;-perms                 preserve permissions
-t, &#45;-times                 preserve times
-g, &#45;-group                 preserve group
-o, &#45;-owner                 preserve owner (super-user only)
-D                          same as &#45;-devices &#45;-specials
    &#45;-devices               preserve device files (super-user only)
    &#45;-specials              preserve special files
 -h, &#45;-human-readable        output numbers in a human-readable format
     &#45;-progress              show progress during transfer</pre>
<p><a id="mount-options"></a></p>
<h2>Mount Options</h2>
<p>The following options apply to any file system that is being mounted (but not every file  system  actually honors them)</p>
<ul>
<li><code>async</code> All I/O to the file system should be done asynchronously.</li>
<li><code>atime</code> Update inode access time for each access. This is the default.</li>
<li><code>auto</code> Can be mounted with the -a option.</li>
<li><code>defaults</code> Use default options: rw, suid, dev, exec, auto, nouser, and async.</li>
<li><code>dev</code> Interpret character or block special devices on the file system.</li>
<li><code>exec</code> Permit execution of binaries.</li>
<li><code>group</code> Allow an ordinary (i.e., non-root) user to mount the file system if one of his groups matches the group of the device.  This option implies the options nosuid and nodev (unless overridden by subsequent options, as in the option line group,dev,suid).</li>
<li><code>mand</code> Allow mandatory locks on this filesystem. See fcntl(2).</li>
<li><code>_netdev</code> The filesystem resides on a device that requires network access (used to prevent the system from attempting to mount these filesystems until the network has been enabled on the system).</li>
<li><code>noatime</code> Do not update inode access times on this file system (e.g, for faster access on the news spool to speed up news servers).</li>
<li><code>nodiratime</code> Do not update directory inode access times on this filesystem.</li>
<li><code>noauto</code> Can only be mounted explicitly (i.e., the -a option will not cause the file system to be mounted).</li>
<li><code>nodev</code> Do not interpret character or block special devices on the file system.</li>
<li><code>noexec</code> Do not allow direct execution of any binaries on the mounted file system.  (Until recently it was possible to run binaries anyway using a command like /lib/ld*.so /mnt/binary. This trick fails since Linux 2.4.25 / 2.6.0.)</li>
<li><code>nomand</code> Do not allow mandatory locks on this filesystem.</li>
<li><code>nosuid</code> Do not allow set-user-identifier or set-group-identifier bits to take effect. (This seems safe, but is in fact rather unsafe if you have suidperl(1) installed.)</li>
<li><code>nouser</code> Forbid an ordinary (i.e., non-root) user to mount the file system.  This is the default.</li>
<li><code>owner</code> Allow an ordinary (i.e., non-root) user to mount the file system if he is the owner of the device.  This option implies the options nosuid and nodev (unless overridden by subsequent options, as in the option line owner,dev,suid).</li>
<li><code>remount</code> Attempt to remount an already-mounted file system.  This is commonly used to change the mount flags for a file system, especially to make a readonly file system writeable. It does not change device or mount point.</li>
<li><code>ro</code> Mount the file system read-only.</li>
<li><code>_rnetdev</code> Like _netdev, except &#8220;fsck -a&#8221; checks this filesystem during rc.sysinit.</li>
<li><code>rw</code> Mount the file system read-write.</li>
<li><code>suid</code> Allow set-user-identifier or set-group-identifier bits to take effect.</li>
<li><code>sync</code> All I/O to the file system should be done synchronously. In case of media with limited number of write cycles (e.g. some flash drives) &#8220;sync&#8221; may cause life-cycle shortening.</li>
<li><code>dirsync</code> All directory updates within the file system should be done synchronously.  This affects the following system calls: creat, link, unlink, symlink, mkdir, rmdir, mknod and rename.</li>
<li><code>user</code> Allow  an ordinary user to mount the file system.  The name of the mounting user is written to mtab so that he can unmount the file system again.  This option implies the options noexec, nosuid, and nodev (unless overridden by subsequent options, as in the option line user,exec,dev,suid).</li>
<li><code>users</code> Allow every user to mount and unmount the file system.  This option implies the options noexec, nosuid, and nodev (unless overridden by subsequent options, as in the option line users,exec,dev,suid).</li>
</ul>
<p><a id="filesystems"></a></p>
<h2>Filesystems</h2>
<p>You can find out what is filesystems are in place by using one of the following linux commands:</p>
<pre>cat /etc/fstab
cat /etc/mtab
cat /proc/mounts
df -a</pre>
<h2>/etc/fstab</h2>
<pre>       /etc/fstab        file system table
       /etc/mtab         table of mounted file systems
       /etc/mtab~        lock file
       /etc/mtab.tmp     temporary file
       /etc/filesystems  a list of filesystem types to try</pre>
<p>From /etc/mtab</p>
<pre>none /tmp tmpfs size=128m,mode=1777 0 0</pre>
<p>From /proc/mounts</p>
<pre>none /tmp tmpfs rw,nodev,relatime,size=131072k 0 0</pre>
<p><br class="C" /></p>
<p><a id="fstab"></a></p>
<h2>/etc/fstab</h2>
<p>It is possible that files /etc/mtab and /proc/mounts don’t match. The first file is based only on the mount command options, but the content of the second file also depends on the kernel and others settings (e.g.  remote NFS server. In particular case  the  mount  command  may reports unreliable information about a NFS mount point and the /proc/mounts file usually contains more reliable information.)</p>
<p>This file is used in three ways:</p>
<ol>
<li>The following command (usually given in a bootscript) causes all file systems mentioned in fstab (of the proper type and/or having or not having the proper options) to be mounted as indicated, except for those whose line contains the noauto keyword. Adding the -F option will  make  mount  fork,  so that the filesystems are mounted simultaneously.
<pre>mount -a [-t type] [-O optlist]</pre>
</li>
<li>When mounting a file system mentioned in fstab, it suffices to give only the device, or only the mount point.</li>
<li>Normally, only the superuser can mount file systems.  However, when fstab contains the user option on a line, anybody can mount the corresponding system.</li>
</ol>
<p>The programs mount and umount maintain a list of currently mounted file systems in the file /etc/mtab.</p>
<p>Only the user that mounted a filesystem can unmount it again.  If any user should be able to unmount, then use users instead of user in the fstab line.  The owner option is similar to the user option, with the restriction that the user must be the owner of the special file.  The group option is similar, with the restriction that the user must be member of the group of the special file.</p>
<p>The order of records in fstab is important because fsck(8), mount(8), and umount(8) sequentially iterate through fstab doing their thing.</p>
<h3>The first field, (fs_spec)</h3>
<p>Describes the block special device or remote filesystem to be mounted.  For ordinary mounts it will hold (a link to) a block special device node (as created by mknod(8)) for the device to be mounted, like ‘/dev/cdrom’ or ‘/dev/sdb7’.  For NFS mounts one will have <code><host>:<dir></code>, e.g., ‘knuth.aeb.nl:/’.  For procfs, use ‘proc’.</p>
<p>Instead of giving the device explicitly, one may indicate the (ext2 or xfs) filesystem that is to be mounted by its UUID or volume label (cf.  e2label(8) or xfs_admin(8)), writing LABEL=<label> or UUID=<uuid>, e.g., ‘LABEL=Boot’ or  ‘UUID=3e6be9de-8139-11d1-9106-a43f08d823a6’.  This will make the system more robust: adding or removing a SCSI disk changes the disk device name but not the filesystem volume label.</p>
<h3>The second field, (fs_file)</h3>
<p>Describes the mount point for the filesystem.  For swap partitions, this field should be specified as ‘none’. If the name of the mount point contains spaces these can be escaped as ‘\040’.</p>
<p>The  third  field,  (fs_vfstype),  describes the type of the filesystem.  Linux supports lots of filesystem types, such as adfs, affs, autofs, coda, coherent, cramfs, devpts, efs, ext2, ext3, hfs, hpfs, iso9660, jfs, minix, msdos, ncpfs, nfs, ntfs, proc, qnx4, reiserfs, romfs, smbfs, sysv, tmpfs, udf, ufs, umsdos, vfat, xenix, xfs, and possibly others. For more details, see mount(8).  <strong>For the filesystems currently supported by the running kernel, see /proc/filesystems</strong>.  An entry swap denotes  a  file  or  partition  to  be  used  for  swapping,  cf.  swapon(8).  An entry ignore causes the line to be ignored.  This is useful to show disk partitions which are currently unused.</p>
<h3>The fourth field, (fs_mntops)</h3>
<p>Describes the mount options associated with the filesystem.  It  is formatted as a comma separated list of options.  It contains at least the type of mount plus any additional options appropriate to the filesystem type.  For documentation on the available options for non-nfs file systems, see mount(8).  For documentation on all nfs-specific options have a look at nfs(5).</p>
<p>Common for all types of file system are the options:</p>
<ul>
<li><strong>noauto</strong>: (do not mount when &#8220;mount -a&#8221; is given, e.g., at boot time)</li>
<li><strong>user</strong>: (allow a user to mount)</li>
<li><strong>owner</strong>: (allow device owner to mount)</li>
<li><strong>pamconsole</strong>: (allow a user at the console to mount)</li>
<li><strong>comment</strong>: (e.g., for use by fstab-maintaining programs).</li>
</ul>
<h3>The fifth field, (fs_freq)</h3>
<p>Used for these filesystems by the dump(8) command to determine which filesystems need to be dumped.  If the fifth field is not present, a value of zero is returned and dump will assume that the filesystem does not need to be dumped.</p>
<h3>The  sixth  field,  (fs_passno)</h3>
<p>Used by the fsck(8) program to determine the order in which filesystem checks are done at reboot time.  The root filesystem should be specified with a fs_passno of 1, and other filesystems should have a fs_passno of 2.  Filesystems within a drive will be checked sequentially, but filesystems on different drives will be checked at the same time to utilize parallelism available in the hardware.  If the sixth field is not present or zero, a value of zero is returned and <strong>fsck will assume that the filesystem does not need to be checked</strong>.</p>
<h3>More Reading</h3>
<ul>
<li><a href="http://www.thegeekstuff.com/2008/11/overview-of-ramfs-and-tmpfs-on-linux/" rel="nofollow" >Overview of RAMFS and TMPFS on Linux</a></li>
<li><a href='http://uploads.askapache.com/2009/09/ramfs-rootfs-initramfs.txt'>ramfs, rootfs and initramfs</a></li>
<li><a href='http://uploads.askapache.com/2009/09/tmpfs.txt'>Tmpfs is a file system which keeps all files in virtual memory</a></li>
<li><a href="http://www.ibm.com/developerworks/library/l-fs3.html" rel="nofollow" >IBM: Advanced filesystem implementor&#8217;s guide, Part 3</a></li>
<li><a href="http://en.wikipedia.org/wiki/TMPFS" rel="nofollow" >TMPFS Wikipedia Entry</a></li>
<li><a href="http://en.wikipedia.org/wiki/Shared_memory" rel="nofollow" >Shared Memory</a></li>
<li><a href="http://kevin.vanzonneveld.net/techblog/article/create_turbocharged_storage_using_tmpfs/" rel="nofollow" >Create turbocharged storage using tmpfs</a></li>
<li><a href="http://dev.mysql.com/doc/refman/4.1/en/temporary-files.html" rel="nofollow" >Where MySQL Stores Temporary Files</a></li>
<li><a href="http://www.linuxized.com/2009/05/speeding-up-firefox-with-tmpfs-and-automatic-rsync/" rel="nofollow" >speeding up firefox with tmpfs and automatic rsync</a> <a href="http://www.linuxized.com/wp-content/uploads/2009/05/speedfox" rel="nofollow" >(shell-script)</a> <a href="http://autoverse.net/blog/2009/apr/23/speed-firefox/" rel="nofollow" >Original</a></li>
<li><a href="http://www.kernel.org/doc/Documentation/filesystems/tmpfs.txt" rel="nofollow" >kernel documentation for tmpfs</a></li>
<li><a href="http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=386368" rel="nofollow" >initscripts: please don&#8217;t mount /dev/shm noexec</a></li>
<li><a href="http://forums.debian.net/viewtopic.php?t=16450" rel="nofollow" >HOWTO: Using tmpfs for /tmp, /var/{log,run,lock&#8230;}</a></li>
<li><a href="http://forums.gentoo.org/viewtopic-t-371889-highlight-tmpfs.html" rel="nofollow" >Gentoo Forums: Using tmpfs for /var/{log,lock,&#8230;}</a></li>
<li><a href="http://forums.gentoo.org/viewtopic-t-717117-highlight-tmpfs.html" rel="nofollow" >[TIP] Firefox and tmpfs: a surprising improvement</a></li>
</ul>
<blockquote cite="http://openquery.com/blog/experiment-mysql-tmpdir-on-tmpfs"><p>
<cite><a href="http://openquery.com/blog/experiment-mysql-tmpdir-on-tmpfs" rel="nofollow" >Experiment: MySQL tmpdir on tmpfs</a></cite></p>
<p>In MySQL, the tmpdir path is mainly used for disk-based sorts (if the sort_buffer_size is not enough) and disk-based temp tables. The latter cannot always be avoided even if you made tmp_table_size and max_heap_table_size quite large, since MEMORY tables don’t support TEXT/BLOB type columns, and also since you just really don’t want to run the risk of exceeding available memory by setting these things too large.</p>
</blockquote>
<p><br class="C" /></p>
<h2>Use tmpfs for MySQL</h2>
<pre>&#45;-tmpdir=path, -t path</pre>
<blockquote cite="http://dev.mysql.com/doc/refman/4.1/en/server-options.html#option_mysqld_tmpdir"><p>The path of the directory to use for creating temporary files. It might be useful if your default /tmp directory resides on a partition that is too small to hold temporary tables. Starting from MySQL 4.1.0, this option accepts several paths that are used in round-robin fashion. Paths should be separated by colon characters (“:”) on Unix and semicolon characters (“;”) on Windows, NetWare, and OS/2. If the MySQL server is acting as a replication slave, you should not set &#8211;tmpdir to point to a directory on a memory-based file system or to a directory that is cleared when the server host restarts. For more information about the storage location of temporary files, see Section A.1.4.4, “Where MySQL Stores Temporary Files”. A replication slave needs some of its temporary files to survive a machine restart so that it can replicate temporary tables or LOAD DATA INFILE operations. If files in the temporary file directory are lost when the server restarts, replication fails. </p></blockquote>
<blockquote cite="http://dev.mysql.com/doc/refman/4.1/en/temporary-files.html"><p>On Unix, MySQL uses the value of the TMPDIR  environment variable as the path name of the directory in which to store temporary files. If TMPDIR  is not set, MySQL uses the system default, which is usually /tmp, /var/tmp, or /usr/tmp. </p>
<p> If the file system containing your temporary file directory is too small, you can use the &#8211;tmpdir option to mysqld to specify a directory in a file system where you have enough space.</p>
<p>Starting from MySQL 4.1, the &#8211;tmpdir option can be set to a list of several paths that are used in round-robin fashion. Paths should be separated by colon characters (“:”) on Unix and semicolon characters (“;”) on Windows, NetWare, and OS/2.<br />
Note</p>
<p>To spread the load effectively, these paths should be located on different physical disks, not different partitions of the same disk.</p>
<p>If the MySQL server is acting as a replication slave, you should not set &#8211;tmpdir to point to a directory on a memory-based file system or to a directory that is cleared when the server host restarts. A replication slave needs some of its temporary files to survive a machine restart so that it can replicate temporary tables or LOAD DATA INFILE operations. If files in the temporary file directory are lost when the server restarts, replication fails.</p>
<p>MySQL creates all temporary files as hidden files. This ensures that the temporary files are removed if mysqld is terminated. The disadvantage of using hidden files is that you do not see a big temporary file that fills up the file system in which the temporary file directory is located.
</p></blockquote>
<p><br class="C" /></p>
<h2>Shell Script for Firefox tmpfs</h2>
<pre>#!/bin/bash
### Bind temporary directories to /dev/shm ###
# I do this instead of mounting tmpfs on the #
# directories, so less memory gets wasted.   #
##############################################
mkdir /dev/shm/{tmp,lock}
mount &#45;-bind /dev/shm/tmp /tmp
mount &#45;-bind /dev/shm/tmp /var/tmp
mount &#45;-bind /dev/shm/lock /var/lock
chmod 1777 /dev/shm/{tmp,lock}</pre>
<hr />
<p><strong>Hey!</strong> You made it!@ at least to the bottom of the page..  I still have to finish this article, so check back in a few months.</p>
<p><a href="http://www.askapache.com/web-hosting/super-speed-secrets.html"></a><a href="http://www.askapache.com/web-hosting/super-speed-secrets.html">30x Faster WP-Super Cache Site Speed</a> originally appeared on <cite>AskApache.com</cite> </p>]]></content:encoded>
			<wfw:commentRss>http://www.askapache.com/web-hosting/super-speed-secrets.html/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Advanced WordPress wp-config.php Tweaks</title>
		<link>http://www.askapache.com/wordpress/advanced-wp-config-php-tweaks.html</link>
		<comments>http://www.askapache.com/wordpress/advanced-wp-config-php-tweaks.html#comments</comments>
		<pubDate>Wed, 03 Mar 2010 08:23:37 +0000</pubDate>
		<dc:creator>AskApache</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Cache]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Htaccess]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Linux Unix BSD]]></category>
		<category><![CDATA[Mod_Rewrite]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Server Administration]]></category>
		<category><![CDATA[Shell Scripting]]></category>
		<category><![CDATA[Web Design]]></category>
		<category><![CDATA[Web Hosting]]></category>
		<category><![CDATA[Webmaster]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[WordPress Plugins]]></category>
		<category><![CDATA[301 Redirect]]></category>
		<category><![CDATA[admin]]></category>
		<category><![CDATA[Advanced]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Anti-Spam]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[askapache]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[bash_profile]]></category>
		<category><![CDATA[caching]]></category>
		<category><![CDATA[cheatsheet]]></category>
		<category><![CDATA[chmod]]></category>
		<category><![CDATA[Cookies]]></category>
		<category><![CDATA[debugging]]></category>
		<category><![CDATA[Elite]]></category>
		<category><![CDATA[encryption]]></category>
		<category><![CDATA[error log]]></category>
		<category><![CDATA[Examples]]></category>
		<category><![CDATA[feed]]></category>
		<category><![CDATA[File Permissions]]></category>
		<category><![CDATA[File System]]></category>
		<category><![CDATA[filesystem]]></category>
		<category><![CDATA[GET]]></category>
		<category><![CDATA[grep]]></category>
		<category><![CDATA[HowTo]]></category>
		<category><![CDATA[HTTP Headers]]></category>
		<category><![CDATA[HTTPS SSL]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Login]]></category>
		<category><![CDATA[Logs]]></category>
		<category><![CDATA[Mod_Rewrite cheatsheet]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[password]]></category>
		<category><![CDATA[php.ini]]></category>
		<category><![CDATA[phpinfo]]></category>
		<category><![CDATA[Port]]></category>
		<category><![CDATA[post]]></category>
		<category><![CDATA[Rewrite Tricks]]></category>
		<category><![CDATA[rewritecond]]></category>
		<category><![CDATA[rewriterule]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[Sessions]]></category>
		<category><![CDATA[Shell]]></category>
		<category><![CDATA[Socket]]></category>
		<category><![CDATA[SPEED]]></category>
		<category><![CDATA[SSH]]></category>
		<category><![CDATA[SSI]]></category>
		<category><![CDATA[stat]]></category>
		<category><![CDATA[trick]]></category>
		<category><![CDATA[umask]]></category>
		<category><![CDATA[Username]]></category>
		<category><![CDATA[wp-config.php]]></category>

		<guid isPermaLink="false">http://www.askapache.com/?p=3341</guid>
		<description><![CDATA[<p>The bottom line for this article is that I want to make WordPress as fast, secure, and easy to install, run, and manage because I am using it more and more for client production sites, I will work for days in order to solve an issue so that I never have to spend time on that issue again. Time is money in this industry and that is ultimately (time) what there is to gain by tweaking WordPress.</p>

<p class="cnote"><strong>Note:</strong> I spent no time on readability, this is primarily a read the code and figure it out article.. This is for advanced users looking for a reference or discussion and for those of you looking to advance.  Feedback would be great <em>if you make it that far..</em></p>]]></description>
			<content:encoded><![CDATA[<p>The bottom line for this article is that I want to make WordPress as fast, secure, and easy to install, run, and manage because I am using it more and more for client production sites, I will work for days in order to solve an issue so that I never have to spend time on that issue again. Time is money in this industry and that is ultimately (time) what there is to gain by tweaking WordPress.</p>
<p class="cnote"><strong>Note:</strong> I spent no time on readability, this is primarily a read the code and figure it out article.. This is for advanced users looking for a reference or discussion and for those of you looking to advance.  Feedback would be great <em>if you make it that far..</em></p>
<p>For a better handle on the way I like to structure web site directories, see <a href="http://www.askapache.com/htaccess/optimize-website-files-cache-security.html">Optimize a Website for Speed, Security, and Easy Management</a> but note it is a bit outdated compared to what I&#8217;m doing now.  I don&#8217;t have the luxury of using only one type of server, or hosting provider anymore, so I have been working towards making things even more portable in order to move from host to host from server to server without issues i.e. my portable <a href="http://www.askapache.com/linux-unix/bash_profile-functions-advanced-shell.html">.bash_profile</a>.</p>
<p>So I&#8217;ve been basically experimenting various ways to accomplish that and thought I would share what I am currently doing for my benefit and hopefully get some input.  All of my WP installs run the development version, and one main idea with my setups is that upgrading is automated.  So I really keep the WordPress install clean and use plugins and wp-config.php to do all the customization.</p>
<ul>
<li>Portability &#8211; Hands-free upgrades and easy to move</li>
<li>Security &#8211; Additional security and protection</li>
<li>Speed &#8211; Less CPU and Disk I/O</li>
<li>Customization &#8211; All my favorite customizations</li>
</ul>
<h2>wp-config.php</h2>
<p>These are the main settings I use.. Seriously this is more like an interactive article, because to understand it you will need to do some code grepping.  You may want to grab a jolt.</p>
<h3>ASKAPACHE_ROOT</h3>
<p>The ASKAPACHE_ROOT variable is just a better way for me to be able to include and access all the different files in my site tree.  For instance, in my non-wp php files, I can do this:</p>
<pre>!defined(&#039;ASKAPACHE_ROOT&#039;) &amp;&amp; require $_SERVER[&#039;DOCUMENT_ROOT&#039;] . &#039;/wp-config.php&#039;;
include(ASKAPACHE_ROOT . &#039;/includes/custom-download.inc.php&#039;);</pre>
<h3>ASKAPACHE_LOCK</h3>
<p>This is one of my all-time favorite hacks, that I think is one of the most useful methods I employ as a web developer.  This allows me to use far-future-expire headers for optimum caching, while still forcing browsers to re-validate every day or so automatically, or forcing them to re-validate whenever I change the suffix.  This takes advantage of the <a href="http://www.askapache.com/htaccess/mod_rewrite-fix-for-caching-updated-files.html">mod_rewrite trick</a> that I use on EVERY site I run, definately worth learning. Because I practice best-practice web-standards, for every web site I create a single css file and javascript file, which I then add to the template like:</p>
<pre>&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; media=&quot;all&quot; href=&quot;http://static.askapache.com/c/apache-0&lt;?php echo ASKAPACHE_LOCK?&gt;.css&quot; /&gt;
&lt;script src=&quot;http://static.askapache.com/j/apache-0&lt;?php echo ASKAPACHE_LOCK;?&gt;.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;</pre>
<pre>&lt;?php
/**
 * The base configurations of the WordPress.
 *
 * This file has the following configurations: MySQL settings, Table Prefix,
 * Secret Keys, WordPress Language, and ABSPATH. You can find more information by
 * visiting {@link http://codex.wordpress.org/Editing_wp-config.php Editing
 * wp-config.php} Codex page. You can get the MySQL settings from your web host.
 *
 * This file is used by the wp-config.php creation script during the
 * installation. You don&#039;t have to use the web site, you can just copy this file
 * to &quot;wp-config.php&quot; and fill in the values.
 *
 * @package WordPress
 */
/* http://codex.wordpress.org/Editing_wp-config.php */
&nbsp;
/** /home/liet/askapache.com */
!defined(&#039;ASKAPACHE_ROOT&#039;) &amp;&amp; define(&#039;ASKAPACHE_ROOT&#039;, str_replace(&#039;/public_html&#039;,&#039;&#039;, $_SERVER[&#039;DOCUMENT_ROOT&#039;]));
&nbsp;
/** The 008 at the end is for manual tweaking.  time() returns seconds since &#039;00:00:00 1970-01-01 UTC&#039;. */
// http://www.askapache.com/htaccess/mod_rewrite-fix-for-caching-updated-files.html
!defined(&#039;ASKAPACHE_LOCK&#039;) &amp;&amp; define(ASKAPACHE_LOCK&#039;, substr(time(),0,5).&#039;008&#039;); // 12533001
&nbsp;
/** absolute path to the WordPress directory */
!defined(&#039;ABSPATH&#039;) &amp;&amp; define(&#039;ABSPATH&#039;, ASKAPACHE_ROOT .&#039;/public_html/&#039;);
&nbsp;
/**
 * WP_SITEURL, defined since WordPress Version 2.2, allows the WordPress address (URL) to be defined. The valued defined is the address where your WordPress core files reside.
 * It should include the http:// part too. Do not put a slash &quot;/&quot; at the end.
 * Setting this value in wp-config.php overrides the wp_options table value for siteurl and disables the WordPress address (URL) field in the Administration &gt; Settings &gt; General panel.
 */
!defined(&#039;WP_SITEURL&#039;) &amp;&amp; define(&#039;WP_SITEURL&#039;, &#039;http://&#039;.$_SERVER[&#039;SERVER_NAME&#039;]);
&nbsp;
/**
 * WP_HOME is another wp-config.php option added in WordPress Version 2.2. Similar to WP_SITEURL,
 * WP_HOME overrides the wp_options table value for home but does not change it permanently.
 * home is the address you want people to type in their browser to reach your WordPress blog. It should include the http:// part. Also, do not put a slash &quot;/&quot; at the end.
 */
!defined(&#039;WP_HOME&#039;) &amp;&amp; define(&#039;WP_HOME&#039;, WP_SITEURL);
&nbsp;
/** no trailing slash, full paths only */
!defined(&#039;WP_CONTENT_DIR&#039;) &amp;&amp; define( &#039;WP_CONTENT_DIR&#039;, ABSPATH . &#039;wp-content&#039; );
&nbsp;
// full url - WP_CONTENT_DIR is defined further up
!defined(&#039;WP_CONTENT_URL&#039;) &amp;&amp; define( &#039;WP_CONTENT_URL&#039;, WP_SITEURL . &#039;/wp-content&#039;);
&nbsp;
/** Allows for the plugins directory to be moved from the default location. @since 2.6.0 */
// full path, no trailing slash
!defined(&#039;WP_PLUGIN_DIR&#039;) &amp;&amp; define( &#039;WP_PLUGIN_DIR&#039;, WP_CONTENT_DIR . &#039;/plugins&#039; );
&nbsp;
/** Allows for the plugins directory to be moved from the default location. @since 2.6.0 */
// full url, no trailing slash
!defined(&#039;WP_PLUGIN_URL&#039;) &amp;&amp; define( &#039;WP_PLUGIN_URL&#039;, WP_CONTENT_URL . &#039;/plugins&#039; );
&nbsp;
/** Allows for the plugins directory to be moved from the default location. @since 2.1.0 */
// Relative to ABSPATH.  For back compat.
//!defined(&#039;PLUGINDIR&#039;) &amp;&amp; define( &#039;PLUGINDIR&#039;, &#039;wp-content/plugins&#039; );
&nbsp;
/** Number of autosaves to save. TRUE is default and enables post revisions, FALSE disables revisions completely. */
!defined(&#039;WP_POST_REVISIONS&#039;) &amp;&amp; define(&#039;WP_POST_REVISIONS&#039;, 150);
&nbsp;
/* ini_set(&#039;memory_limit&#039;, WP_MEMORY_LIMIT); */
!defined(&#039;WP_MEMORY_LIMIT&#039;) &amp;&amp; define(&#039;WP_MEMORY_LIMIT&#039;, &#039;64M&#039;);
&nbsp;
/** Only check at this interval for new messages. Default is 5min */
/** @since 2.9  */
!defined(&#039;WP_MAIL_INTERVAL&#039;) &amp;&amp; define(&#039;WP_MAIL_INTERVAL&#039;, 3600); // 1 hour
&nbsp;
/** Saves updated post values to post from edit window every x seconds. (default 60)
 * When editing a post, WordPress uses Ajax to auto-save revisions to the post as you edit. You may want to increase this setting for longer delays in between auto-saves, or decrease the setting to make sure you never lose changes.
 * @since 2.5.0 */
!defined( &#039;AUTOSAVE_INTERVAL&#039; ) &amp;&amp; define( &#039;AUTOSAVE_INTERVAL&#039;, 60 );
&nbsp;
/** @since 2.9.0  */
/** Permanently deletes posts, pages, attachments, and comments which have been in the trash for EMPTY_TRASH_DAYS. */
!defined( &#039;EMPTY_TRASH_DAYS&#039; ) &amp;&amp; define( &#039;EMPTY_TRASH_DAYS&#039;, 300 );</pre>
<hr class="C" />
<h2>Debugging WordPress</h2>
<p>One of my secrets for getting really good at this stuff is to master debugging.  There is really not ever a time when I am working on a site that I don&#8217;t have <a href="http://www.askapache.com/security/elite-log-file-scrolling-with-color-syntax.html">color-highlighted logs scrolling automatically in an ssh window</a>.  It&#8217;s really almost impossible to fix problems with wordpress or do any kind of advanced anything without being able to view debugging info.  At first I relied heavily on a <a href="http://www.askapache.com/php/custom-phpini-tips-and-tricks.html">custom php.ini</a> being available on the server, but after having to deal with many hosts who don&#8217;t allow <code>php.ini</code> files I now rely completely on setting values using <a href="http://php.net/manual/en/function.ini-set.php" rel="nofollow" >ini_set</a> for ultimate portability. Detailed towards the end of this article and is also included in this <code>wp-config.php</code></p>
<pre>/**#@+
 * DEBUGGING STUFF
 */
/** display of notices during development. if false, error_reporting is E_ERROR | E_WARNING | E_PARSE | E_USER_ERROR | E_USER_WARNING | E_RECOVERABLE_ERROR otherwise E_ALL */
!defined(&#039;WP_DEBUG&#039;) &amp;&amp; define(&#039;WP_DEBUG&#039;, false);
&nbsp;
/** The SAVEQUERIES definition saves the database queries to a array and that array can be displayed to help analyze those queries.
 *  The information saves each query, what function called it, and how long that query took to execute.  */
!defined(&#039;SAVE_QUERIES&#039;) &amp;&amp; define(&#039;SAVE_QUERIES&#039;, WP_DEBUG);
&nbsp;
!defined(&#039;ACTION_DEBUG&#039;) &amp;&amp; define(&#039;ACTION_DEBUG&#039;, WP_DEBUG);
&nbsp;
/** This will allow you to edit the scriptname.dev.js files in the wp-includes/js and wp-admin/js directories.  */
!defined(&#039;SCRIPT_DEBUG&#039;) &amp;&amp; define(&#039;SCRIPT_DEBUG&#039;, WP_DEBUG);

&nbsp;
/** Add define(&#039;WP_DEBUG_LOG&#039;, true); to enable php debug logging to WP_CONTENT_DIR/debug.log */
//!defined(&#039;WP_DEBUG_LOG&#039;) &amp;&amp; define(&#039;WP_DEBUG_LOG&#039;, true);
&nbsp;
/** This determines whether errors should be printed to the screen as part of the output or if they should be hidden from the user.
 *  Add define(&#039;WP_DEBUG_DISPLAY&#039;, false); to wp-config.php to use the globally configured setting for display_errors and not force it to On */
!defined(&#039;WP_DEBUG_DISPLAY&#039;) &amp;&amp; define(&#039;WP_DEBUG_DISPLAY&#039;, false);</pre>
<hr class="C" />
<h2>Ultimate Security Tweaks</h2>
<p>Well, ultimate for WP&#8217;s built-in keys and password functions, this is all for wp-config.php keep in mind.  This is a very neccessary and recommended step, and is one of the only things I modify for each new installation.</p>
<h3>Security KEYS</h3>
<p>If like me you are familiar with password-cracking software like John the ripper, rainbow hash tables, l0pht-crack, etc.. then you will like to know that you can specify your own keys and salts for the encryption used by WP.  They are <code>AUTH_KEY</code>, <code>AUTH_SALT</code>, <code>SECURE_AUTH_KEY</code>, <code>SECURE_AUTH_SALT</code>, <code>LOGGED_IN_KEY</code>, <code>LOGGED_IN_SALT</code>, <code>NONCE_KEY</code>, <code>NONCE_SALT</code>, <code>SECRET_KEY</code> and <code>SECRET_SALT</code>.</p>
<p>A random and long key gives you better encryption, and exponentially increasing that is using a random and long salt for the encryption.  Encryptions with known salts are incredibly easy to decrypt compared to encryptions with secure salts, because the salt + key individually need to be guessed in order to find a matching hash, vs. just the key if the salt is known.  See: <a href="http://www.askapache.com/security/locating-weak-passwords.html">Locating weak passwords</a>.</p>
<blockquote>
<p>A secret key is a hashing salt which makes your site harder to hack and access harder to crack by adding random elements to the password.</p>
<p>In simple terms, a secret key is a password with elements that make it harder to generate enough options to break through your security barriers. A password like &#8220;password&#8221; or &#8220;test&#8221; is simple and easily broken. A random, unpredictable password such as &#8220;88a7da62429ba6ad3cb3c76a09641fc&#8221; takes years to come up with the right combination.</p>
</blockquote>
<p>For more information on the technical background and breakdown of secret keys and secure passwords, see: </p>
<ul>
<li><a href="http://wordpress.org/support/topic/170987" rel="nofollow" >WordPress Support Forum &#8211; HOWTO: Set up secret keys in WordPress 2.6+</a></li>
<li><a href="http://en.wikipedia.org/wiki/Password_cracking" rel="nofollow" >Wikipedia&#8217;s explanation of Password Cracking</a></li>
</ul>
<p>I like to use the <a href="https://api.wordpress.org/secret-key/1.1/" rel="nofollow" >WordPress.org secret-key service</a> 4 times.  That&#8217;s because for each key and salt I like to do: (1 key from api +random keyboard input+1 key from api).</p>
<pre>/**#@+
 * Authentication Unique Keys.
 *
 * Change these to different unique phrases!
 * You can generate these using the {@link https://api.wordpress.org/secret-key/1.1/ WordPress.org secret-key service}
 * You can change these at any point in time to invalidate all existing cookies.
 * This will force all users to have to log in again.
 *
 * @since 2.6.0
 *
 * Get salt to add to hashes to help prevent attacks.
 *
 * The secret key is located in two places: the database in case the secret key
 * isn&#039;t defined in the second place, which is in the wp-config.php file. If you
 * are going to set the secret key, then you must do so in the wp-config.php
 * file.
 *
 * The secret key in the database is randomly generated and will be appended to
 * the secret key that is in wp-config.php file in some instances. It is
 * important to have the secret key defined or changed in wp-config.php.
 *
 * If you have installed WordPress 2.5 or later, then you will have the
 * SECRET_KEY defined in the wp-config.php already. You will want to change the
 * value in it because hackers will know what it is. If you have upgraded to
 * WordPress 2.5 or later version from a version before WordPress 2.5, then you
 * should add the constant to your wp-config.php file.
 *
 * Below is an example of how the SECRET_KEY constant is defined with a value.
 * You must not copy the below example and paste into your wp-config.php. If you
 * need an example, then you can have a
 * {@link https://api.wordpress.org/secret-key/1.1/ secret key created} for you.
 *
 * Salting passwords helps against tools which has stored hashed values of
 * common dictionary strings. The added values makes it harder to crack if given
 * salt string is not weak.
 *
 * @since 2.5
 * @link https://api.wordpress.org/secret-key/1.1/ Create a Secret Key for wp-config.php
 *
 * @return string Salt value from either &#039;SECRET_KEY&#039; or &#039;secret&#039; option
 */
define(&#039;AUTH_KEY&#039;,        &#039;jflkhaskljdfhkljasdhflkjashd;flkjhas;djfh;kajshdflkjashdlfkjhasdlkfhal?p[B+GR{@&gt;{Yq`c|LnG;dvq#| %OA_cbBSU6,rICC1o/c)-|&#039;);
define(&#039;SECURE_AUTH_KEY&#039;, &#039;jflkhaskljdfhkljasdhflkjashd;flkjhas;djfh;kajshdflkjashdlfkjhasdlkfhal?Vp[Bb15baar8&amp;R-r&lt;[T|?(xhJJABGq+Ux+U$)-Hltp/&#039;);
define(&#039;LOGGED_IN_KEY&#039;,   &#039;jflkhaskljdfhkljasdhflkjashd;flkjhas;djfh;kajshdflkjashdlfkjhasdlkfhal?Vp[B&lt;5n6DG|YWnJ9tY2!M1L)`{-$LW~~Ia%.uCbn!P. 41o2$Z$4&#039;);
define(&#039;NONCE_KEY&#039;,       &#039;jflkhaskljdfhkljasdhflkjashd;flkjhas;djfh;kajshdflkjashdlfkjhasdlkfhal?Vp[Bgu&lt;wM*zewR0.{+m:bmrB?wj!B,4]Wo+4 Avk ApR-D?E&#039;);
define(&#039;SECRET_KEY&#039;,     &#039;jflkhaskljdfhkljasdhflkjashd;flkjhas;djfh;kajshdflkjashdlfkjhasdlkfhal?Vp[B52ugH6muE9r4._iZwoYKUybrqLPpv|d Xr+|yrqhUE&#039;);
&nbsp;
define(&#039;AUTH_SALT&#039;,        &#039;123423190847olqkfhladhfsldshafasdfasdf09a7f-90a87df98adfyapoiyaf9asd8f70a9s8d7f908a7sdf97W4qCdm~Ky%+%~PPa5b YEmDI%U[W!-B&#039;);
define(&#039;SECURE_AUTH_SALT&#039;, &#039;123423190847olqkfhladhfsldshafasdfasdf09a7f-90a87df98adfyapoiyaf9asd8f70a9s8d7f908a7sdf97W4qCdmad/7o6.AU3%9o-|Kqm]+eUqr-n~:ag&#039;);
define(&#039;LOGGED_IN_SALT&#039;,   &#039;123423190847olqkfhladhfsldshafasdfasdf09a7f-90a87df98adfyapoiyaf9asd8f70a9s8d7f908a7sdf97W4qCdmsLiCv@KJ{#wd(?qe(KcH3!&#039;);
define(&#039;NONCE_SALT&#039;,       &#039;123423190847olqkfhladhfsldshafasdfasdf09a7f-90a87df98adfyapoiyaf9asd8f70a9s8d7f908a7sdf97W4qCdmG9&gt;+wm 2)bS0Pd_+1rx0brX]ND8|&#039;);
define(&#039;SECRET_SALT&#039;,      &#039;123423190847olqkfhladhfsldshafasdfasdf09a7f-90a87df98adfyapoiyaf9asd8f70a9s8d7f908a7sdf97W4qCdm2&lt;&gt;))U|sty)+4vpWooKls/^[vN&#039;);
/**#@-*/</pre>
<hr class="C" />
<h2>Using SSL for Admin and Login</h2>
<p>SSL is kinda required from my point of view, it is just way to easy to sniff data off the wire otherwise.  At least with SSL you force them to use tools like burpsuite, paros proxy, webscarab, etc..</p>
<pre>/** @since 2.6.0  */
!defined(&#039;FORCE_SSL_ADMIN&#039;) &amp;&amp; define(&#039;FORCE_SSL_ADMIN&#039;, true);
&nbsp;
/** @since 2.6.0  */
!defined(&#039;FORCE_SSL_LOGIN&#039;) &amp;&amp; define(&#039;FORCE_SSL_LOGIN&#039;, true);</pre>
<h3>Mod_Rewrite to Force SSL</h3>
<p>This is pretty cool, it forces non-https for all urls except for /wp-admin and wp-login.php, which both require https.  It also checks for the logged_in_cookie, and if that is present in the request then it doesn't force non-https.  Kinda confusing if you don't have a <a href="http://www.askapache.com/htaccess/mod_rewrite-variables-cheatsheet.html">mod_rewrite cheatsheet</a>.</p>
<pre>RewriteCond %{THE_REQUEST} ^$ [OR]
RewriteCond %{REQUEST_URI} ^/(wp-admin|wp-login\.php).*$ [NC,OR]
RewriteCond %{HTTP_COOKIE} ^.*wp_li_sadfsdfasdf11b361cdsdfasdfasd=.*$ [NC]
RewriteRule .* - [S=1]
&nbsp;
RewriteCond %{HTTPS} =on [OR]
RewriteCond %{HTTP_HOST} !^www\.askapache\.com$ [NC]
RewriteRule .* http://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
&nbsp;
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(wp-admin/.*|wp-login\.php.*)\ HTTP/ [NC]
RewriteCond %{HTTPS} !=on
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]</pre>
<hr class="C" />
<h2>File System Permissions</h2>
<p><a href="http://www.askapache.com/security/chmod-umask-fileperms-stat-tricks.html"class="IFR" ><img src="http://uploads.askapache.com/2008/11/danger-chmod-screenshot.png" alt="chmod, umask, file permissions test" title="chmod, umask, file permissions test" /></a>You can get a basic and solid intro on file permissions by reading: <a href="http://codex.wordpress.org/Changing_File_Permissions" rel="nofollow" >Changing File Permissions</a>, or you can check out some of my <a href="http://www.askapache.com/security/chmod-umask-fileperms-stat-tricks.html">file permission research</a>.<br class="C" />
</p>
<pre>/** The permissions as octal number, usually 0644 for files, 0755 for dirs.
 *  http://codex.wordpress.org/Changing_File_Permissions
 *  if ( !$wp_filesystem-&gt;mkdir($remote_destination, FS_CHMOD_DIR) )
 */
!defined(&#039;FS_CHMOD_DIR&#039;) &amp;&amp; define(&#039;FS_CHMOD_DIR&#039;, (0755 &amp; ~ umask()));
!defined(&#039;FS_CHMOD_FILE&#039;) &amp;&amp; define(&#039;FS_CHMOD_FILE&#039;, (0644 &amp; ~ umask()));
/**#@-*/
&nbsp;
/** Define the timeouts for the connections. Only available after the construct is called to allow for per-transport overriding of the default. */
//stream_set_timeout( $stream, FS_TIMEOUT );
//!defined(&#039;FS_TIMEOUT&#039;) &amp;&amp; define(&#039;FS_TIMEOUT&#039;, 30);
&nbsp;
//$this-&gt;link = @ftp_connect($this-&gt;options[&#039;hostname&#039;], $this-&gt;options[&#039;port&#039;], FS_CONNECT_TIMEOUT);
//!defined(&#039;FS_CONNECT_TIMEOUT&#039;) &amp;&amp; define(&#039;FS_CONNECT_TIMEOUT&#039;, 30);
&nbsp;
// function get_filesystem_method($args = array(), $context = false) {
//  $method = defined(&#039;FS_METHOD&#039;) ? FS_METHOD : false; //Please ensure that this is either &#039;direct&#039;, &#039;ssh&#039;, &#039;ftpext&#039; or &#039;ftpsockets&#039;
//!defined(&#039;FS_METHOD&#039;) &amp;&amp; define(&#039;FS_METHOD&#039;, &#039;direct&#039;);
&nbsp;
/** These methods for the WordPress core, plugin, and theme upgrades try to determine the WordPress path, as reported by PHP, but symlink trickery can sometimes
 * &#039;muck this up&#039; so if you know the paths to the various folders on the server, as seen via your FTP user, you can manually define them in the wp-config.php file.
 * FS_METHOD forces the filesystem method. It should only be &quot;direct&quot;, &quot;ssh&quot;, &quot;ftpext&quot;, or &quot;ftpsockets&quot;.
 * FTP_BASE is the full path to the &quot;base&quot; folder of the WordPress installation.
 * FTP_CONTENT_DIR is the full path to the wp-content folder of the WordPress installation.
 * FTP_PLUGIN_DIR is the full path to the plugins folder of the WordPress installation.
 * FTP_PUBKEY is the full path to your SSH public key.
 * FTP_PRIKEY is the full path to your SSH private key.
 * FTP_USER is either user FTP or SSH username. Most likely these are the same, but use the appropriate one for the type of update you wish to do.
 * FTP_PASS is the password for the username entered for FTP_USER. If you are using SSH public key authentication this can be omitted.
 * FTP_HOST is the hostname:port combination for your SSH/FTP server. The standard FTP port is 21 and the standard SSH port is 22.
 */
//define(&#039;FS_METHOD&#039;, &#039;ftpext&#039;);
//define(&#039;FTP_BASE&#039;, &#039;/path/to/wordpress/&#039;);
//define(&#039;FTP_CONTENT_DIR&#039;, &#039;/path/to/wordpress/wp-content/&#039;);
//define(&#039;FTP_PLUGIN_DIR &#039;, &#039;/path/to/wordpress/wp-content/plugins/&#039;);
//define(&#039;FTP_PUBKEY&#039;, &#039;/home/username/.ssh/id_rsa.pub&#039;);
//define(&#039;FTP_PRIKEY&#039;, &#039;/home/username/.ssh/id_rsa&#039;);
//define(&#039;FTP_USER&#039;, &#039;username&#039;);
//define(&#039;FTP_PASS&#039;, &#039;password&#039;);
//define(&#039;FTP_HOST&#039;, &#039;ftp.example.org:21&#039;);
&nbsp;
/**
 * Block requests through the proxy.
 *
 * Those who are behind a proxy and want to prevent access to certain hosts may do so. This will
 * prevent plugins from working and core functionality, if you don&#039;t include api.wordpress.org.
 *
 * You block external URL requests by defining WP_HTTP_BLOCK_EXTERNAL in your wp-config.php file
 * and this will only allow localhost and your blog to make requests.
 * The constant WP_ACCESSIBLE_HOSTS will allow additional hosts to go through for requests. The format of the
 * WP_ACCESSIBLE_HOSTS constant is a comma separated list of hostnames to allow.
 *
 * @since 2.8.0
 * @link http://core.trac.wordpress.org/ticket/8927 Allow preventing external requests.
/** @since 2.9  */
//!defined(&#039;WP_HTTP_BLOCK_EXTERNAL&#039;) &amp;&amp; define( &#039;WP_HTTP_BLOCK_EXTERNAL&#039;, false );
&nbsp;
/*
 * The constant WP_ACCESSIBLE_HOSTS will allow additional hosts to go through for requests. The format of the
 * WP_ACCESSIBLE_HOSTS constant is a comma separated list of hostnames to allow.
 *
 * @since 2.8.0
 * @link http://core.trac.wordpress.org/ticket/8927 Allow preventing external requests.
 * $accessible_hosts = preg_split(&#039;|,\s*|&#039;, WP_ACCESSIBLE_HOSTS);
 * return !in_array( $check[&#039;host&#039;], $accessible_hosts ); //Inverse logic, If its in the array, then we can&#039;t access it.
 */
//!defined(&#039;WP_ACCESSIBLE_HOSTS&#039;) &amp;&amp; define( &#039;WP_ACCESSIBLE_HOSTS&#039;, &#039;askapache.com,askapache.org&#039; );</pre>
<hr class="C" />
<h3>Cookies!</h3>
<p>There&#8217;s always a little comfort in having non-default cookies for security (against auto-bots), and using shorter names also means smaller HTTP Packets.</p>
<p>The <code>$cookie_hash</code> is my hack to get around the fact that <code>COOKIEHASH</code> isn&#8217;t definable in <code>wp-config</code>.</p>
<pre>/**#@+
 * COOKIES
 * Used to guarantee unique hash cookies @since 1.5 */
$cookie_hash=md5(WP_SITEURL);
&nbsp;
/** Set a cookie now to see if they are supported by the browser.
 * setcookie(TEST_COOKIE, &#039;WP Cookie check&#039;, 0, COOKIEPATH, COOKIE_DOMAIN);
 * @since 2.3.0 */
!defined(&#039;TEST_COOKIE&#039;) &amp;&amp; define(&#039;TEST_COOKIE&#039;, &#039;wp_tc&#039;);
&nbsp;
/* @since 2.6.0 */
!defined(&#039;LOGGED_IN_COOKIE&#039;) &amp;&amp; define(&#039;LOGGED_IN_COOKIE&#039;, &#039;wp_li_&#039; . $cookie_hash);
&nbsp;
/* @since 2.6.0 */
!defined(&#039;SECURE_AUTH_COOKIE&#039;) &amp;&amp; define(&#039;SECURE_AUTH_COOKIE&#039;, &#039;wp_sa_&#039; . $cookie_hash);
&nbsp;
/* @since 2.5.0 */
!defined(&#039;AUTH_COOKIE&#039;) &amp;&amp; define(&#039;AUTH_COOKIE&#039;, &#039;wp_a_&#039; . $cookie_hash);
&nbsp;
/* @since 2.0.0 */
!defined(&#039;PASS_COOKIE&#039;) &amp;&amp; define(&#039;PASS_COOKIE&#039;, &#039;wp_p_&#039; . $cookie_hash);
&nbsp;
/* @since 2.0.0 */
!defined(&#039;USER_COOKIE&#039;) &amp;&amp; define(&#039;USER_COOKIE&#039;, &#039;wp_u_&#039; . $cookie_hash);
&nbsp;
/* ok unset this var, its not needed as COOKIEHASH will have this value, but is not definable in wp-config.php */
unset($cookie_hash);
&nbsp;
/** @since 1.2.0 */
!defined(&#039;COOKIEPATH&#039;) &amp;&amp; define(&#039;COOKIEPATH&#039;, preg_replace(&#039;|https?://[^/]+|i&#039;, &#039;&#039;, WP_HOME . &#039;/&#039; ) );
&nbsp;
/** @since 1.5.0 */
!defined(&#039;SITECOOKIEPATH&#039;) &amp;&amp; define(&#039;SITECOOKIEPATH&#039;, preg_replace(&#039;|https?://[^/]+|i&#039;, &#039;&#039;, WP_SITEURL . &#039;/&#039; ) );
&nbsp;
/** @since 2.6.0 */
!defined(&#039;ADMIN_COOKIE_PATH&#039;) &amp;&amp; define( &#039;ADMIN_COOKIE_PATH&#039;, SITECOOKIEPATH . &#039;wp-admin&#039; );
&nbsp;
/** @since 2.6.0 */
!defined(&#039;PLUGINS_COOKIE_PATH&#039;) &amp;&amp; define( &#039;PLUGINS_COOKIE_PATH&#039;, preg_replace(&#039;|https?://[^/]+|i&#039;, &#039;&#039;, WP_PLUGIN_URL)  );
&nbsp;
/** @since 2.0.0 */
!defined(&#039;COOKIE_DOMAIN&#039;) &amp;&amp; define(&#039;COOKIE_DOMAIN&#039;, $_SERVER[&#039;SERVER_NAME&#039;]);</pre>
<hr class="C" />
<pre>/**
  * The WP_CACHE setting, if true, includes the wp-content/advanced-cache.php script, when executing wp-settings.php.
  * For an advanced caching plugin to use, static because you would only want one
  * if ( defined(&#039;WP_CACHE&#039;) )@include WP_CONTENT_DIR . &#039;/advanced-cache.php&#039;;
  */
!defined(&#039;WP_CACHE&#039;) &amp;&amp; define(&#039;WP_CACHE&#039;, true);
&nbsp;
/** WordPress Localized Language, defaults to en_US.
 *
 * Change this to localize WordPress.  A corresponding MO file for the chosen
 * language must be installed to wp-content/languages. For example, install
 * de.mo to wp-content/languages and set WPLANG to &#039;de&#039; to enable German
 * language support. */
!defined(&#039;WPLANG&#039;) &amp;&amp; define (&#039;WPLANG&#039;, &#039;en_US&#039;);
&nbsp;
/** Stores the location of the language directory. First looks for language folder in WP_CONTENT_DIR
 *   and uses that folder if it exists. Or it uses the &quot;languages&quot; folder in WPINC. @since 2.1.0 */
//!defined(&#039;WP_LANG_DIR&#039;) &amp;&amp; define(&#039;WP_LANG_DIR&#039;, ABSPATH . WPINC . &#039;/languages&#039;);
&nbsp;
/** LANGDIR defines what directory the WPLANG .mo file resides. If LANGDIR is not defined WordPress looks first to wp-content/languages and then wp-includes/languages for the .mo defined by WPLANG file.  Old static relative path maintained for limited backwards compatibility - won&#039;t work in some cases*/
//!defined(&#039;LANGDIR&#039;) &amp;&amp; define(&#039;LANGDIR&#039;, &#039;wp-content/languages&#039;);
&nbsp;
/** Stores the location of the WordPress directory of functions, classes, and core content. @since 1.0.0 */
//!defined(&#039;WPINC&#039;) &amp;&amp; define(&#039;WPINC&#039;, &#039;wp-includes&#039;);</pre>
<hr class="C" />
<h2>WPMU Stuff</h2>
<p>I personally don&#8217;t use.</p>
<pre>/** Allows for the mu-plugins directory to be moved from the default location. @since 2.8.0 */
//!defined(&#039;WPMU_PLUGIN_DIR&#039;) &amp;&amp; define( &#039;WPMU_PLUGIN_DIR&#039;, WP_CONTENT_DIR . &#039;/mu-plugins&#039; ); // full path, no trailing slash
&nbsp;
/** Allows for the mu-plugins directory to be moved from the default location. @since 2.8.0 */
//!defined(&#039;WPMU_PLUGIN_URL&#039;) &amp;&amp; define( &#039;WPMU_PLUGIN_URL&#039;, WP_CONTENT_URL . &#039;/mu-plugins&#039; ); // full url, no trailing slash
&nbsp;
/** Allows for the mu-plugins directory to be moved from the default location. @since 2.8.0 */
//!defined( &#039;MUPLUGINDIR&#039; ) &amp;&amp; define( &#039;MUPLUGINDIR&#039;, &#039;wp-content/mu-plugins&#039; ); // Relative to ABSPATH.  For back compat.</pre>
<hr class="C" />
<h2>WordPress Database</h2>
<p>This is usually the only thing I have to manually edit when creating a new site, unless I just use the same DB and modify the $table_prefix, (farther down). I run everything I possibly can in UTF-8, but if you don&#8217;t already know alot about character sets, wow it is one of the most confusing things so you may want to save learning about that topic for another day.  Otherwise the following are helpful (<em>and show how confusing character sets are!</em>)</p>
<ul>
<li><a href="http://dev.mysql.com/doc/refman/5.0/en/charset-charsets.html" rel="nofollow" >Character Sets and Collations MySQL Support</a></li>
<li><a href="http://codex.wordpress.org/Converting_Database_Character_Sets" rel="nofollow" >Converting Database Character Sets</a></li>
<li><a href="http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-sets.html" rel="nofollow" >UTF-8 character sets</a> (<a href="http://en.wikipedia.org/wiki/UTF-8" rel="nofollow" >UTF-8</a>)</li>
</ul>
<p>If you ever setup WP to use the builtin membership features, make sure you learn about the <code>CUSTOM_USER_TABLE</code> and <code>CUSTOM_USER_META_TABLE</code> constants, I&#8217;ve found them very helpful.</p>
<pre>/**#@+
 * MySQL settings
 */
/** The name of the database for WordPress */
define(&#039;DB_NAME&#039;, &#039;askapachewpblog75&#039;);
&nbsp;
/** The username to access the database */
define(&#039;DB_USER&#039;, &#039;askapache245d&#039;);
&nbsp;
/** The password for the username to access the database */
define(&#039;DB_PASSWORD&#039;, &#039;asdfklj2340&#039;);
&nbsp;
/** The hostname to connect to the database at */
define(&#039;DB_HOST&#039;, &#039;mysql.askapache.com&#039;);
&nbsp;
/** The charset of the database */
define(&#039;DB_CHARSET&#039;, &#039;utf8&#039;);
&nbsp;
/** The collation of the database */
define(&#039;DB_COLLATE&#039;, &#039;utf8_general_ci&#039;);</pre>
<hr class="C" />
<h2>$table_prefix</h2>
<p>The <code>$table_prefix</code> is the value placed in the front of your database tables. Change the value if you want to use something other than wp_ for your database prefix. Typically this is changed if you are <a href="http://codex.wordpress.org/Installing_Multiple_Blogs" rel="nofollow" >installing multiple WordPress blogs</a> in the same database, and also for enhanced security.</p>
<p>Its a safe and good idea to change this value pre-installation to add more security to your WordPress blog. Exploits attempted against your WordPress blog by malicious crackers often are built with the premise that your blog uses the prefix wp_, by changing the value you mitigate some attack vectors. </p>
<pre>/**
 * WordPress Database Table prefix.
 *
 * You can have multiple installations in one database if you give each a unique
 * prefix. Only numbers, letters, and underscores please!
 */
$table_prefix  = &#039;ar15_&#039;;
&nbsp;
/** CUSTOM_USER_TABLE and CUSTOM_USER_META_TABLE are used to designated that the user and usermeta tables normally utilized by WordPress are not used, instead these values/tables are used to store your user information. */
//!defined(&#039;CUSTOM_USER_TABLE&#039;) &amp;&amp; define(&#039;CUSTOM_USER_TABLE&#039;, $table_prefix . &#039;my_users&#039;);
//!defined(&#039;CUSTOM_USER_META_TABLE&#039;) &amp;&amp; define(&#039;CUSTOM_USER_META_TABLE&#039;, $table_prefix . &#039;my_usermeta&#039;);</pre>
<h2>Setup PHP Ini Settings</h2>
<pre>&nbsp;
/** Turns the output of errors on or off, you really never want this on, you should only view errors by reading the log file. */
ini_set(&#039;display_errors&#039;, WP_DEBUG_DISPLAY);
&nbsp;
/** Tells whether script error messages should be logged to the server&#039;s error log or error_log. */
ini_set(&#039;log_errors&#039;, &#039;On&#039;);
&nbsp;
/** http://us.php.net/manual/en/timezones.php */
ini_set(&#039;date.timezone&#039;, &#039;America/Indianapolis&#039;);
&nbsp;
/** Where to log php errors */
ini_set(&#039;error_log&#039;, ASKAPACHE_ROOT . &#039;/logs/php_error.log&#039;);
&nbsp;
/** Set the memory limit, otherwise defaults to &#039;32M&#039; */
ini_set(&#039;memory_limit&#039;, WP_MEMORY_LIMIT);</pre>
<h2>Sessions are slow</h2>
<p>So I only use sessions when I have a specific use&#8230; In this case I need sessions only when one of the tools in the /online-tools/ directory is being used.  And that is for the <a href="http://www.askapache.com/security/php-captcha-anti-spam-example.html">captcha image</a>.  In the future I won&#8217;t ever use sessions.</p>
<pre>if(preg_match( &#039;#^/online-tools/#&#039;,$_SERVER[&#039;REQUEST_URI&#039;])) session_start();</pre>
<h2>Include Custom Files</h2>
<p>Sure you could use the my-hacks.php that WP allows, or you can just stick your functions in your <code>TEMPLATEPATH/functions.php</code> file, but they are executed only after the wp-settings.php file, which may be too late for your file.</p>
<p>In the past I&#8217;ve also used the <a href="http://us2.php.net/manual/en/ini.core.php#ini.auto-prepend-file" rel="nofollow" >auto_prepend_file</a> settings to run my script before anything (index.php) but I ran into some issues on different hosts, and it wasn&#8217;t as portable.</p>
<p>This is useful because you can have a file with globally available functions that you can use in non-WP areas as well as WP areas.  I am moving away from this more and more as I learn more about classes and build plugins instead for portability.</p>
<pre>include_once ASKAPACHE_ROOT . &#039;/includes/myfunctions.inc&#039;;
&nbsp;
/** Sets up WordPress vars and included files. */
require_once(ABSPATH . &#039;wp-settings.php&#039;);
?&gt;</pre>
<h2>Some Useful PHP</h2>
<p>I am constantly trying to make my sites and code more portable, so I am using plugins alot more to accomplish things that I use to do with separate php.  Here are some examples of minimal php.</p>
<pre>add_filter(&quot;the_generator&quot;, create_function(&#039;$a&#039;,&#039;return &quot;&quot;;&#039;));
add_filter(&#039;the_content&#039;, create_function(&#039;$a&#039;, &#039;return ((is_feed())? $a.&quot;&lt;p&gt;&lt;a href=\&quot;&quot;.get_permalink().&quot;\&quot;&gt;&quot;.get_the_title().&quot;&lt;/a&gt; originally appeared on &quot;.get_bloginfo(&quot;name&quot;).&quot;.&lt;/p&gt;&quot; : $a);&#039;), 99999);
add_filter(&#039;excerpt_length&#039;, create_function(&#039;$a&#039;, &#039;return 300;&#039;),99);
add_filter(&#039;excerpt_more&#039;, create_function(&#039;$a&#039;, &#039;return &quot;&amp;hellip;&quot;;&#039;),99);
add_action( &#039;wp_head&#039;, create_function(&#039;$a&#039;,&#039;echo &quot;&lt;link rel=\&quot;pingback\&quot; href=\&quot;&#039;.get_bloginfo(&#039;pingback_url&#039;).&#039;\&quot; /&gt;\n&quot;;&#039;), 95 );
add_action( &#039;wp_head&#039;, create_function(&#039;$a&#039;,&#039;echo &quot;&lt;link rel=\&quot;schema.rss\&quot; href=\&quot;http://purl.org/rss/1.0/\&quot; /&gt;\n&quot;;&#039;), 96 );
add_action( &#039;wp_head&#039;, create_function(&#039;$a&#039;,&#039;echo &quot;&lt;link rel=\&quot;schema.rel\&quot; href=\&quot;http://purl.org/vocab/relationship/\&quot; /&gt;\n&quot;;&#039;), 97 );
add_action( &#039;wp_head&#039;, create_function(&#039;$a&#039;,&#039;echo &quot;&lt;link rel=\&quot;meta\&quot; type=\&quot;application/rdf+xml\&quot; href=\&quot;/foaf.rdf\&quot; /&gt;\n&quot;;&#039;), 98 );
add_action( &#039;wp_head&#039;, create_function(&#039;$a&#039;,&#039;echo &quot;&lt;link href=\&quot;/favicon.ico\&quot; rel=\&quot;shortcut icon\&quot; type=\&quot;image/x-icon\&quot; /&gt;\n&quot;;&#039;), 99 );</pre>
<h2>Debugging Note</h2>
<p><a href="http://wordpress.org/extend/plugins/askapache-debug-viewer/screenshots/" rel="nofollow" ><img alt="AskApache Advanced Debugging Output" src="http://s.wordpress.org/extend/plugins/askapache-debug-viewer/screenshot-1.png?r=160129" title="AskApache Advanced Debugging Output" width="625" height="548" /></a>If you read this far than you probably know how important debugging is, but I sometimes like to stick the best tips deep in my articles to make sure only YOU find it.  GRTFM isn&#8217;t used on this site, it&#8217;s mostly a requirement because my writing can get pretty bad..  The point, debugging is more than a crucial requirement if you want to do anything cool.  Don&#8217;t worry I got you.. check my <a href="http://wordpress.org/extend/plugins/askapache-debug-viewer/" rel="nofollow" >AskApache Debug Viewer Plugin from the official WP site</a>.  It&#8217;s pretty close to providing as verbose amount of information that I could possibly figure out how to get out of php, probably more than you have ever seen at least, I focused on quantity.  I use it all the time on new installs as there is no setup required and it tells me advanced information about the setup of the server, hacker code for sure.<br class="C" />
</p>
<p>Here&#8217;s a quick function to see set global vars, I just think this is interesting code.</p>
<pre>function askapache_global_debug(){
  global $_GET,$_POST,$_COOKIE,$_SESSION,$_ENV,$_FILES,$_SERVER,$_REQUEST,$HTTP_POST_FILES,$HTTP_POST_VARS,$HTTP_SERVER_VARS,$HTTP_RAW_POST_DATA,$HTTP_GET_VARS,$HTTP_COOKIE_VARS,$HTTP_ENV_VARS;
  $gv=create_function(&#039;$n&#039;,&#039;global $$n; ob_start(); if ( is_array($$n) &amp;&amp; sizeof($$n)&gt;0 &amp;&amp; print(&quot;[{$n}]\n&quot;) ) print_r($$n);return ob_get_clean();&#039;);
  foreach (array(&#039;_GET&#039;,&#039;_POST&#039;,&#039;_COOKIE&#039;,&#039;_SESSION&#039;,&#039;_ENV&#039;,&#039;_FILES&#039;,&#039;_SERVER&#039;,&#039;_REQUEST&#039;,&#039;HTTP_POST_FILES&#039;,&#039;HTTP_POST_VARS&#039;,&#039;HTTP_SERVER_VARS&#039;,&#039;HTTP_RAW_POST_DATA&#039;,&#039;HTTP_GET_VARS&#039;,&#039;HTTP_COOKIE_VARS&#039;,&#039;HTTP_ENV_VARS&#039;) as $k)echo $gv($k);
  print_r(get_defined_constants());
}</pre>
<p class="anote">Also check the WordPress Codex page: <a href="http://codex.wordpress.org/Editing_wp-config.php" rel="nofollow" >Editing wp-config.php</a> and Perishable Press&#8217;s: <a href="http://perishablepress.com/press/2009/12/01/stupid-wordpress-tricks/" rel="nofollow" >Stupid WordPress Tricks</a></p>
<p><a href="http://www.askapache.com/wordpress/advanced-wp-config-php-tweaks.html"></a><a href="http://www.askapache.com/wordpress/advanced-wp-config-php-tweaks.html">Advanced WordPress wp-config.php Tweaks</a> originally appeared on <cite>AskApache.com</cite> </p>]]></content:encoded>
			<wfw:commentRss>http://www.askapache.com/wordpress/advanced-wp-config-php-tweaks.html/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>PortaPutty Auto-Reconnecting SSH Tunnels on an Encrypted TrueCrypt Portable USB Key w GPG</title>
		<link>http://www.askapache.com/hacking/ssh-tunnels-truecrypt-gpg.html</link>
		<comments>http://www.askapache.com/hacking/ssh-tunnels-truecrypt-gpg.html#comments</comments>
		<pubDate>Tue, 23 Feb 2010 10:11:11 +0000</pubDate>
		<dc:creator>AskApache</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Cache]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Htaccess]]></category>
		<category><![CDATA[Linux Unix BSD]]></category>
		<category><![CDATA[Making Money]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Web Design]]></category>
		<category><![CDATA[Web Hosting]]></category>
		<category><![CDATA[Web Tools]]></category>
		<category><![CDATA[Webmaster]]></category>
		<category><![CDATA[WiredTree]]></category>
		<category><![CDATA[401]]></category>
		<category><![CDATA[askapache]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[Backups]]></category>
		<category><![CDATA[Bandwidth]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[bash_profile]]></category>
		<category><![CDATA[Boot]]></category>
		<category><![CDATA[compression]]></category>
		<category><![CDATA[curl]]></category>
		<category><![CDATA[Defrag]]></category>
		<category><![CDATA[Email]]></category>
		<category><![CDATA[encryption]]></category>
		<category><![CDATA[filesystem]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[GET]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[GPG]]></category>
		<category><![CDATA[Hard Drive]]></category>
		<category><![CDATA[ionice]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Login]]></category>
		<category><![CDATA[Nice]]></category>
		<category><![CDATA[PageDefrag]]></category>
		<category><![CDATA[password]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Pipelining]]></category>
		<category><![CDATA[Plink]]></category>
		<category><![CDATA[Port]]></category>
		<category><![CDATA[post]]></category>
		<category><![CDATA[Prompt]]></category>
		<category><![CDATA[Putty]]></category>
		<category><![CDATA[ram]]></category>
		<category><![CDATA[rsync]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[servers]]></category>
		<category><![CDATA[Shell]]></category>
		<category><![CDATA[SOCKS]]></category>
		<category><![CDATA[SPEED]]></category>
		<category><![CDATA[SSH]]></category>
		<category><![CDATA[SSH Tunnels]]></category>
		<category><![CDATA[SSI]]></category>
		<category><![CDATA[stat]]></category>
		<category><![CDATA[trick]]></category>
		<category><![CDATA[TrueCrupt]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[USB Drives]]></category>

		<guid isPermaLink="false">http://askapache.com/?p=4001</guid>
		<description><![CDATA[<p><a class="IFL" id="id6" href="http://www.askapache.com/hacking/ssh-tunnels-truecrypt-gpg.html"></a>Ok I just came back up to write the intro.. I'm trying to keep it short to avoid getting bogged down by the coolness of each step.  Here is what goes on.   When I logon to my XP machine at work, I bring my usb key and plug it in first.  On logging a window pops up first and it's a password prompt to mount my encrypted drive leonardo.  It also checks a keyfile that is located on my usb key, but all I do now is type in my password.  That causes my encrypted folder to be accessible to me like a normal drive, and it autoruns a startup batch file. <br /><br />The batch file causes <strong>Portable</strong> versions of Firefox (<em>all my bookmarks, my settings</em>) to load, and launches <strong>Portable</strong> Mozilla Thunderbird (IMAP makes this work well), which is my favorite program (<em>great GPG features and open-source!</em>).  Also Some Adobe CS4 software is loaded from the hard drive, like DreamWeaver.  In the background, a service we created executes a PortaPuttY plink command to create forwarded tunnels from various remote servers and accounts, all using key-based encryption.  These tunnels are automatically reconnected if they are disconnected, meaning you can use a socks 5 if you want or even better!<br class="C" /></p>
<p><strong>Part 1 of 5</strong></p>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.tigerdirect.com/applications/SearchTools/item-details.asp?EdpNo=4329073&#038;CatId=3786" rel="nofollow" id="id6" class="IFL"  title="This ones over $400 dollars! 128GB!"></a>Ok I just came back up to write the intro.. I&#8217;m trying to keep it short to avoid getting bogged down by the coolness of each step.  Here is what goes on.   When I logon to my XP machine at work, I bring my usb key and plug it in first.  On logging a window pops up first and it&#8217;s a password prompt to mount my encrypted drive leonardo.  It also checks a keyfile that is located on my usb key, but all I do now is type in my password.  That causes my encrypted folder to be accessible to me like a normal drive, and it autoruns a startup batch file.  The batch file causes <strong>Portable</strong> versions of Firefox (<em>all my bookmarks, my settings</em>) to load, and launches <strong>Portable</strong> Mozilla Thunderbird (IMAP makes this work well), which is my favorite program (<em>great GPG features and open-source!</em>).  Also Some Adobe CS4 software is loaded from the hard drive, like DreamWeaver.<br class="C" /></p>
<p>The batch file also runs PortaPuttY plink to create forwarded tunnels from various remote servers and accounts, all using key-based encryption.  This includes dynamic SOCKS 4/5 tunnels, VPN tun device tunnels, and of course the basic SSH port forwarding tunnels that are so powerful.  These tunnels are automatically reconnected if they are disconnected, using simple windows builtin command-line tools.  And believe me it was not easy to figure out how to make this all work using plink ( essentially the same as putty minus the gui ), I literally had to use almost all of my Windows kung fu to finally end up with this.</p>
<h2>Using MyEnTunnel</h2>
<p>Initially I was using the <a href="http://nemesis2.qx.net" rel="nofollow" >MyEnTunnel</a> program combined with a custom windows batch install script I wrote to handle the tunnels.</p>
<p>The tunnels are very important to making things easy while improving security.  It&#8217;s not easy to understand at first, but basically it means <strong>you can now connect to ANY IP address:port as if you were on that very machine connecting to localhost, like if you pinged yourself!</strong>.  The result is any traffic you want is now encrypted, and you can set up your servers to only accept connections from localhost, which could save you tons of memory, bandwidth, and security attack vectors to think about.   So I configure everything to use these tunnels as proxies, like Mozilla Thunderbird and Chrome, Firefox, Pidgeon, all portable versions and running from my encrypted usb drive.</p>
<p>This means you can walk into my house with that usb key, plug into any computer here, and surf the web/check your emails all across SSH&#8230; I know for a fact <strong>I wouldn&#8217;t be able to snoop that</strong> traffic!  There is a lot of exciting things going on around here, new servers and all.. Its going to take a couple more posts for me to finish this up, enjoy the article and comment.</p>
<h2>Buy a couple USB Mini Drives</h2>
<p>The first thing to do, is purchase a USB thumb drive..   My favorite store, <a href="http://www.tigerdirect.com/applications/category/category_slc.asp?Recs=30&#038;Nav=|c:379|lp:0.01:hp:24.99|&#038;Sort=4" rel="nofollow"  title="Highly recommended, this is not an affiliate link">TigerDirect.com</a>, has over 104 tiny usb drives for under $24.. I&#8217;ve used them since the late 90&#8242;s.</p>
<p>I bought some 4GB PNY&#8217;s the size of a fingernail at a gas station and they are amazing, way faster than say a dvd drive.  Just try to do some research of the differences between the 16GB vs the $4 1GB drives.. You want speed because the whole drive will be encrypted.   <em>If you can afford the super excellent and crazy fast ones, hey send me one!</em> Buying cheap means you can buy 3 or 4 so you can always have backups.  This device will make you Internationally mobile, untethered from a box, maybe getting some work done at a cafe in Florenze, or at a beach hotel in Miami.  Keep dreaming, but that is more possible with a better organized system.</p>
<h3>Backup the USB Drive</h3>
<p>You only need to know 1 way that works, there are several.  The way I do backups is to copy the entire disk image of the usb, that way I can always access it in case of usb key failure, which does happen.  Free software like <a href="http://clonezilla.org/" rel="nofollow" >CloneZilla live CD</a> with its crazy cluster computing power, or Self Image, which is free for both linux and Windows.  And you could never go wrong with <a href="http://www.symantec.com/norton/ghost" rel="nofollow" >GHOST</a>, one of the first to make mega bucks in the market.. it&#8217;s some seriously impressive software <em>but not open-source</em>.  Even easier for some is to just set a cron job for dd to pipe the entire drive image to a remote computer using netcat, or sshfs, or curlftpfs, or just <strong>simple ssh</strong> like below.  Once setup (without stupid, bulky, dangerous software), the files on your encrypted usb don&#8217;t change often, otherwise I would want to sync a backup to happen automatically every X number of logins or days (<em>test logfile time in bash_profile?</em>)..</p>
<h4>SSH Back-ups To Remote Server</h4>
<p>Files and data on your drives slow it down tremendously, meaning a web server storing backups locally is slower than one storing them externally.</p>
<p>Notice how much safer this command is by optimizing both the <a href="http://www.askapache.com/linux-unix/optimize-nice-ionice.html">CPU and DISK I/O</a>..  Though it&#8217;s much smarter to create a new separate ssh user, one with no shell and a passwordless safer key-based encryption.  Then in your /etc/security/limits.conf file or your initscript you can cause that user to have <code>nice -19</code> and <code>ionice -c2 -n7</code> priority set all the time automatically, since sshd, compression, and disk writing are this accounts only job.  turboslow is an alias defined in a ssh_config file so you don&#8217;t have to type the host, port, and settings each time.</p>
<pre>#
# much better ways to do this on google!!!!!!!
#
ionice -c2 -n7 nice -n 19 dd if=/dev/sdb2 bs=1k conv=sync,noerror | gzip -c | ssh turboslow &quot;dd of=sdb2.gz bs=1k&quot;</pre>
<p>Note that you may decide it would be better to configure the ssh connection to a less CPU intensive algorithm, perhaps even <em>protocol 1</em> and <em>DES</em>.  That&#8217;s perfectly alright, but the tradeoff is that the encryption can be broken much quicker, and so you would have to implement a cron job to create new keys on both ends of the tunnel every few hours.. It&#8217;s really not a big deal to setup, kind of sweet way to use key-based encryption.  Also, important files ( those containing passwords, any database ) are encrypted before transport using private GPG keys, which don&#8217;t need to be changed.  The other thing to think about too is only letting your main PC send/write on the backup host, so the backup host is only authorized to rx and can never login back to yours. </p>
<p>Hey! the Internet is a dangerous place you better believe it!  And it&#8217;s only going to get more interesting with cloud computing&#8217;s breakthrough&#8217;s&#8230; More people who know they&#8217;re way around&#8230; I can always use an extra server, I&#8217;d love to expand my network another node without having to pay for it (free cloud computing?), so make sure your servers are locked up strenuously.  Not super perfect, just a little unique or creative in your defense to avoid any coming super-worm&#8217;s that may be employing vast arsenals of the deadliest attack-engines like metasploit..  Scarry rumors.</p>
<h4>Compression Speeds: PBZip2, Rzip, Lzop, Gzip</h4>
<p>Probably the fastest is to use rsync over ssh, which is what I&#8217;m doing, since the algorithms used by rsync are much faster and safer.  <a href="http://www.askapache.com/security/mirror-using-rsync-ssh.html">Rsync also lets you specify a compression program</a>, so depending on your machine you will want pbzip2 (for multi processors) or rzip which are the 2 fastest I know of, though I have had some reliability issues with rzip for gigabyte transfers.  Pbzip2 is amazing, blew me away the first time being 8x faster (8 CPUs) then <strong>anything</strong>.  You can get it and compile a static binary for your thumb drive if want at <a href="http://compression.ca/pbzip2/" rel="nofollow" >Parallel BZIP2 (PBZIP2)</a>. Heavy code, re: this note by Jeff Gilchrist</p>
<p><quote><strong>NOTE</strong>: If you are looking for a parallel BZIP2 that works on cluster machines, you should check out <strong>MPIBZIP2</strong> <strong>which was designed for a distributed-memory message-passing architecture</strong>.</quote></p>
<pre>tar cpf &quot;$G&quot; &#45;-use-compress-prog=pbzip2 ./</pre>
<p><a href="http://uploads.askapache.com/2010/02/pbzip2.gif" rel="nofollow" ><img src="http://uploads.askapache.com/2010/02/pbzip2.gif" alt="Parallel BZIP2 (PBZIP2)" title="pbzip2" class="size-medium wp-image-4002" /></a></p>
<h4>Benchmarking for Performance</h4>
<p>Finally a couple tips, you should get an idea what the device can do, format it a few times for linux and test it on windows, and vice versa.. Some drives are too small or too old and can only support fat32 filesystems on winblows, you DO NOT want fat32 because this drive is going to be 100% encrypted and then 100% transparently decrypted as you use it, </p>
<pre># note this is 512MB
dd if=/dev/sda1 of=/dev/null bs=512 count=1000000
512000000 bytes (512 MB) copied, 5.16588 s, 99.1 MB/s</pre>
<h2>Part II:  Encrypted AutoRunning USB Key with TrueCrypt</h2>
<p>Now this section anyone can do, it&#8217;s so easy on Windows.   What I&#8217;m going to show you how to do is get setup the right way super-fast.  There are many ways to use TrueCrypt, it&#8217;s one of the nicest built software programs&#8217;s I&#8217;ve ever used&#8230; Sadly, it is not licensed open-source, and that is often a deal-breaker for security-conscious folks or anti-pirate anarchists.  From the very helpful TrueCrypt web site:</p>
<blockquote cite="">
<ul type="disc">
<li>Creates a <strong>virtual encrypted disk</strong> within a file and mounts  it as a real disk. </li>
<li>Encrypts an<strong> entire partition or storage device</strong> such as USB flash drive or hard drive.</li>
<li>Encrypts a <strong>partition or drive where Windows is installed</strong> (<a href="http://www.truecrypt.org/docs/?s=system-encryption" rel="nofollow" >pre-boot authentication</a>).</li>
<li>Encryption is <a href="http://www.truecrypt.org/docs/" rel="nofollow" ><strong>automatic</strong>, <strong>real-time</strong> (on-the-fly) and <strong>transparent</strong></a>.</li>
<li> <a href="http://www.truecrypt.org/docs/?s=parallelization" rel="nofollow" >Parallelization</a> and <a href="http://www.truecrypt.org/docs/?s=pipelining" rel="nofollow" >pipelining</a> allow data to be read and written as fast as if the drive was not encrypted.</li>
<li>Provides <strong><a href="http://www.truecrypt.org/docs/?s=plausible-deniability" rel="nofollow" >plausible deniability</a></strong>, in case an adversary  forces you to reveal the password: <strong><a href="http://www.truecrypt.org/hiddenvolume" rel="nofollow" >Hidden volume</a></strong> (steganography) and <strong><a href="http://www.truecrypt.org/docs/?s=hidden-operating-system" rel="nofollow" >hidden operating system</a></strong>.</li>
<li><a href="http://www.truecrypt.org/docs/?s=encryption-algorithms" rel="nofollow" >Encryption algorithms</a>: <a href="http://www.truecrypt.org/docs/?s=aes" rel="nofollow" >AES-256</a>, <a href="http://www.truecrypt.org/docs/?s=serpent" rel="nofollow" >Serpent</a>, and <a href="http://www.truecrypt.org/docs/?s=twofish" rel="nofollow" >Twofish</a>.  Mode of operation: <a href="http://www.truecrypt.org/docs/?s=modes-of-operation" rel="nofollow" >XTS</a>.</li>
</ul>
</blockquote>
<h2>Further Reading</h2>
<ul>
<li><a href="http://ultra.ap.krakow.pl/~bar/DOC/ssh_backup.html" rel="nofollow" >Network File Copy using SSH</a></li>
<li>Check out the trunk version of PuTTY:<code>~ svn co svn://svn.tartarus.org/sgt/putty</code>
</ul>
<hr class="C" />
<p>The real fun doesn&#8217;t start till all the automation starts, automating all of that from a couple batch files I wrote, one click setup.  Kind of like building your own knoppix for when you have to use Windows.  To begin this tutorial, setup a truecrypt traveller setup on your usb and also install the portaputty package onto the usb.  You do this by creating a 3GB or whatever file on the usb and then mounting that file like you would mount an iso file.   I will show the Windows Batch file I use and the tricks with Windows Volume names and how to consistently make it all work.   Then we will setup MyEnTunnel with a customized batch file that forces all puttys to use portaputty (<code>sweet hack stolen from sysinternals pagedefrag tool</code>).<strong>Stay Tuned!</strong></p>
<p><a href="http://www.askapache.com/hacking/ssh-tunnels-truecrypt-gpg.html"></a><a href="http://www.askapache.com/hacking/ssh-tunnels-truecrypt-gpg.html">PortaPutty Auto-Reconnecting SSH Tunnels on an Encrypted TrueCrypt Portable USB Key w GPG</a> originally appeared on <cite>AskApache.com</cite> </p>]]></content:encoded>
			<wfw:commentRss>http://www.askapache.com/hacking/ssh-tunnels-truecrypt-gpg.html/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Optimize a Website for Speed, Security, and Easy Management</title>
		<link>http://www.askapache.com/htaccess/optimize-website-files-cache-security.html</link>
		<comments>http://www.askapache.com/htaccess/optimize-website-files-cache-security.html#comments</comments>
		<pubDate>Fri, 19 Feb 2010 00:45:26 +0000</pubDate>
		<dc:creator>AskApache</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Cache]]></category>
		<category><![CDATA[DreamHost]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Htaccess]]></category>
		<category><![CDATA[Linux Unix BSD]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Shell Scripting]]></category>
		<category><![CDATA[Web Design]]></category>
		<category><![CDATA[Web Hosting]]></category>
		<category><![CDATA[Webmaster]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[301 Redirect]]></category>
		<category><![CDATA[admin]]></category>
		<category><![CDATA[Advanced]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[apache server]]></category>
		<category><![CDATA[askapache]]></category>
		<category><![CDATA[Backups]]></category>
		<category><![CDATA[Bandwidth]]></category>
		<category><![CDATA[bleeding edge]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[Cache-Control]]></category>
		<category><![CDATA[caching]]></category>
		<category><![CDATA[ColdFusion]]></category>
		<category><![CDATA[compression]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Dig]]></category>
		<category><![CDATA[DNS]]></category>
		<category><![CDATA[errordocument]]></category>
		<category><![CDATA[Etags]]></category>
		<category><![CDATA[Examples]]></category>
		<category><![CDATA[expires header]]></category>
		<category><![CDATA[feed]]></category>
		<category><![CDATA[File Permissions]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[GET]]></category>
		<category><![CDATA[hacks]]></category>
		<category><![CDATA[htaccess files]]></category>
		<category><![CDATA[Htpasswd]]></category>
		<category><![CDATA[HTTP Error]]></category>
		<category><![CDATA[HTTP Headers]]></category>
		<category><![CDATA[HTTP Status Codes]]></category>
		<category><![CDATA[HTTPS SSL]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Login]]></category>
		<category><![CDATA[Logs]]></category>
		<category><![CDATA[Mod_Rewrite]]></category>
		<category><![CDATA[Optimization]]></category>
		<category><![CDATA[optimizations]]></category>
		<category><![CDATA[optimized website]]></category>
		<category><![CDATA[password]]></category>
		<category><![CDATA[password protection]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[php.ini]]></category>
		<category><![CDATA[Port]]></category>
		<category><![CDATA[post]]></category>
		<category><![CDATA[ram]]></category>
		<category><![CDATA[real deal]]></category>
		<category><![CDATA[Redirect]]></category>
		<category><![CDATA[Redirection]]></category>
		<category><![CDATA[Rewrite Tricks]]></category>
		<category><![CDATA[Robot]]></category>
		<category><![CDATA[robots]]></category>
		<category><![CDATA[robots.txt]]></category>
		<category><![CDATA[Scripts]]></category>
		<category><![CDATA[search and replace]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[server config]]></category>
		<category><![CDATA[servers]]></category>
		<category><![CDATA[SPEED]]></category>
		<category><![CDATA[SSI]]></category>
		<category><![CDATA[stat]]></category>
		<category><![CDATA[SymLinks]]></category>
		<category><![CDATA[trial and error]]></category>
		<category><![CDATA[trick]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[web server]]></category>
		<category><![CDATA[WordPress Plugins]]></category>

		<guid isPermaLink="false">http://www.askapache.com/?p=1380</guid>
		<description><![CDATA[<p><a href="http://www.askapache.com/htaccess/optimize-website-files-cache-security.html" class="IFL hs hs37" title="Discover how to setup and manage a website from top to bottom for optimized speed, security, and simplicity"></a>Learn how to setup, configure, secure, optimize, and create a low-maintenance website the AskApache way.  I'm piecing together all the hacks, tricks, methods, and ideas discussed throughout this blog and all across Netdom and glueing them all together to show you how to have the most optimized, crazy fastest, and best website setup I can think of.<br class="C" /></p>]]></description>
			<content:encoded><![CDATA[<p><img class="IFL" src="http://uploads.askapache.com/2008/09/computerimg.jpg" alt="optimized server setup" title="optimized server setup" />Over the past 10 or so years I&#8217;ve been directly or indirectly involved in configuring/administrating/hacking thousands of websites, and I realized today that I&#8217;ve actually learned quite a bit about how to really make them work hard for me, instead of the other way around. It came as a mild shock to think of where I was back then vs. now because the improvements and optimizations are hundreds of smaller improvements, but taken together, the  optimization hacks I&#8217;ve found through trial and error and much reading are as Donald would say, <strong>YOOUUGE</strong> compared to a basic website setup.<br class="C" /></p>
<p class="cnote">I use this awesome skeleton setup for all my high-paying clients <em>sorry poor people!</em> and also of course on this blog, which I use as a bleeding-edge dev server for my crazy testing.  So realize that I&#8217;m already past this setup and using it to do cooler stuff.  In order for you to use these more advanced ideas, you first need to get up to speed on what I&#8217;m doing so you know what I&#8217;m talking about.  This article tries to help you accomplish that&#8230; remains to be seen.</p>
<h2>An Optimized Website, The Real Deal</h2>
<p>This first article is to give you some ideas and get you thinking and reading before the first article in this series comes out.  This series details how to setup, configure, secure, optimize, and manage a website the best possible way I can come up with.  It pieces together all the AskApache hacks and tricks and uses methods and ideas discussed all over this blog and all over the net and glues them all together to show you how to have the most optimized, fastest, best website setup I can think of.</p>
<p>Knowing the why and how behind the operation of a Web Server allows us to optimize that operation.  For this example we will be creating the website <code>www.askapache.com</code>, which will be running WordPress and php.  We will also set up <code>static.askapache.com</code> to serve all of our sites uploads, images, css and javascript files, flash files, etc. with advanced caching and security using Apache Server .htaccess files.  So lets get started and take a look at this site structure for a moment.</p>
<pre>/home/askapache.com
|&#45;- /home/askapache.com/backups/
|&#45;- /home/askapache.com/public_html/
|&#45;- /home/askapache.com/inc/
|&#45;- /home/askapache.com/logs/
|&#45;- /home/askapache.com/static/
|&#45;- /home/askapache.com/tmp/
|&#45;- /home/askapache.com/.htpasswd-basic
`&#45;- /home/askapache.com/.htpasswd-digest</pre>
<ul>
<li><code>/backups/</code> &#8211; For <a href="http://www.askapache.com/wordpress/encrypted-wordpress-site-backups.html">encrypted backups of WordPress database and site files</a>. And any other backups.</li>
<li><code>/public_html/</code> &#8211; The document root for <code>www.askapache.com</code></li>
<li><code>/inc/</code> &#8211; Folder to keep your php include files for extra security and easy management.</li>
<li><code>/logs/</code> &#8211; Save your php, apache, and other logs here or create symlinks to them.</li>
<li><code>/static/</code> &#8211; The document root for <code>static.askapache.com</code></li>
<li><code>/tmp/</code> &#8211; Only need this if your host doesn&#8217;t already have a /tmp folder</li>
</ul>
<hr class="HR0" />
<h2>Strong Security, Top to Bottom</h2>
<p><img class="IFL" src="http://uploads.askapache.com/2008/09/1023103_warning_icon_32.jpg" width="150" alt="Optimize a Website for Speed, Security, and Easy Management" title="Site Security with Apache" />Simply by implementing correct access permissions, file permissions, password protection and segmenting various folders and services we are already ahead of the game.  I&#8217;ve always taken security extremely seriously, so you can benefit from alot of the simple solutions I&#8217;m recommending for a really locked down site.<br class="C" /></p>
<p>Indeed, security is a major part of every step of this setup process, as security concerns are what drives a lot of the motivations I have for coming up with this setup in the first place.  We will be doing very simple but very effective site security like the following items, which is a short list compared to everything we will be doing.</p>
<ul>
<li>Fixing file permissions automatically</li>
<li>Searching for modified files on the server</li>
<li>Encrypting your backups</li>
<li>Get alerted to breakin attempts</li>
<li>Block tons of bad clients</li>
<li>Disallowing cgi scripts or any other handlers, just serve files.</li>
<li>Configuring PHP</li>
<li>Password Protection for certain areas</li>
</ul>
<h3>Ready for Warfare?</h3>
<p>My past work for an Internet Service Provider, followed by 4 years of auditing the security of organizations external/internal networks has given me a fresh perspective on website security, and I think it allows me to see what would really be effective at preventing and killing attacks.  In fact just last night I was once again doing some research into some off-the-wall security topics, and I discovered a new defense method that I will be writing about very soon.  I believe that this new method,  could be quickly adopted and implemented by hosting providers and software developers, which would result in us finally taking the Internet back from all those zombies and robots.  This method will be discussed in great detail soon, and will be a core part of this site setups security and optimization.</p>
<hr class="HR0" />
<h2>Built to <span style="color:red">Bleed Speed</span></h2>
<p><img class="IFL" src="http://uploads.askapache.com/2008/09/speedontheroadimg.jpg" width="150" alt="Optimize a Website for Speed, Security, and Easy Management" title="326255_speed_on_the_road" />Serve&#8217;s files as fast and efficiently as possible using advanced caching, HTTP Protocols, php/server configurations.<br class="C" /></p>
<p>Many of the articles and research on this blog is about improving the speed and efficiency of your website.  In fact that is why I am helping develop open-source software to block spammers from WordPress blogs&#8230; not because I&#8217;m bothered by the spam, but because they make the net slow!  So lets look at some of the ideas we&#8217;ll be implementing.</p>
<p>Many techniques I&#8217;ve been using and tweaking for several years, and recently many of them were included in the high-performance websites list.  Of course we will be taking a look at this list in practical terms, meaning almost all of it, the caching, compression, etc., will be automated in keeping with our &#8220;comfort&#8221; goal, which is to say we want to make the Web Developer and Server Admin&#8217;s lives as easy and comfy as possible.  After all, we do the work right?</p>
<ol>
<li>Reduce HTTP requests &#8211; <a href="http://www.askapache.com/htaccess/speed-up-sites-with-htaccess-caching.html" title="304 If Modified article">Reducing 304 requests with Cache-Control Headers</a></li>
<li>Use a customized php.ini &#8211; <a href="http://www.askapache.com/php/custom-phpini-tips-and-tricks.html">Creating and using a custom PHP.ini</a></li>
<li>Add an Expires header &#8211; <a href="http://www.askapache.com/htaccess/speed-up-your-site-with-caching-and-cache-control.html#caching-with-mod_expires" title="mod_expires Caching article">Caching with mod_expires on Apache</a></li>
<li>Gzip components</li>
<li>Make CSS and unobtrusive Javascript as external files not inline</li>
<li>Reduce DNS lookups &#8211; Use Static IP address, use a subdomain with static IP address for static content.</li>
<li>Minimize Javascript &#8211; Refactor the code, compress with <a href="http://dojotoolkit.org/docs/shrinksafe" rel="nofollow" >dojo</a></li>
<li>Avoid external redirects &#8211; <a href="http://www.askapache.com/htaccess/mod_rewrite-tips-and-tricks.html" title="mod_rewrite internal redirection and rewrites">Use internal redirection with mod_rewrite</a>, <a href="http://www.askapache.com/htaccess/301-redirect-with-mod_rewrite-or-redirectmatch.html" title="301 Redirect with mod_rewrite or RedirectMatch">The correct way to redirect with 301</a></li>
<li>Turn off ETags &#8211; <a href="http://www.askapache.com/htaccess/using-http-headers-with-htaccess.html#prevent-caching-with-htaccess">Prevent Caching with htaccess</a></li>
<li>Make AJAX cacheable and small</li>
</ol>
<h3>AskApache.com, Fastest Site Ever!</h3>
<p>Ok it <em>might</em> not be the #1, but surely the top 10.. ;)</p>
<p>I&#8217;m very proud of the performance I am able to achieve on this site.  Very proud.  I started looking for ways to improve the wp-cache and wp-super-cache WordPress plugins, and came up with hacks for both of them.. but they still didn&#8217;t do what I wanted so I started from scratch and wrote my own caching plugin.</p>
<p>With much more advanced caching options and unquestionably higher performance and lower time usage on the machine.  I&#8217;m hesitant to release it to the public until I get faded on it.. I just really love it.. it has been running my site for several months now and I keep finding ways to improve it.. Stay tuned.</p>
<p>One feature it has is the ability to allow negotiation of a resource between apache and the client.  Think almost transparent mutli-lingual blogs, mutliple formats per document (look at the rdf for this page for an example*). But that plugin is the future and this is the present.. so back to it we go.</p>
<hr class="HR0" />
<h2>Pamper the Webmaster with Extreme Comfort</h2>
<p><img class="IFL" src="http://uploads.askapache.com/2008/09/wwwonthebeachimg.jpg" width="150" alt="Optimize a Website for Speed, Security, and Easy Management" title="Low Maintenance Web Development" />This section alone would make this setup appealing.  I have developed all types of techniques and methods to make my life as easy as possible.  I could literally DIE right now and this blog would continue to run and operate for years on its own.   The general philosophy that I have used to get to where I can goto the beach with my laptop and do all this crazy stuff is <strong>the idea of perfection</strong>.  That may sound a little put-offish, but it basically means I will focus in on one very specific area for improvement or research and just get sick with it.  Most of this blogs articles are enlightening examples of this in action.  I will take a relatively unknown or unused piece of code or software and experiment with it until I feel I have it down, then I move on to the next item of never-ending research.  Mostly I think this is just plain habit from when I was studying security.  I&#8217;m much better at this then that :)</p>
<h3>Apache ErrorDocuments</h3>
<p>The <a href="http://www.askapache.com/htaccess/apache-status-code-headers-errordocument.html">57 HTTP Status Codes and Apache ErrorDocuments</a> article is a prime example.  I was simply searching for an authoritative list of HTTP status codes, an issue not many web people find worth their time, and that search led to some of the most useful stuff I&#8217;ve found about the Web</p>
<p>This &#8220;Comfort&#8221; article will include multi-language, intelligent, and optimized error documents for handling any type of HTTP error with class and allow us to stop spammers, save bandwidth, redirect correctly, etc..  You will probably be surprised at all the uses an Apache ErrorDocument can have.. It IS one of the foundations of the HTTP-based Net after all.<br class="C" /></p>
<h3>Emphasis on Easy Upgrades</h3>
<p>The whole setup is geared to make hassle-free WordPress/PHP/application upgrades possible by keeping different types of files in separate places, keeping backups, other misc tricks and since all of these files are in /home/askapache.com, your FTP connection can still access every file easily.  Sometimes security and optimizing your server can lead to it being more of a pain to do updates, backups, and general maintenance.  This article tries to overwhelm the balance with a trifecta of goals.</p>
<h3>Move to a new host? Ok!</h3>
<p>Comfort to me also means being able to pack up the whole website and database and move to another web host in under an hour.  I can move the whole AskApache site to one of several other hosting providers accounts I have in about 30minutes.  If this was a clients site or I was getting paid more, I&#8217;d also be focused on round-robin DNS technology, balance-load setups, and just go crazy making it fast.</p>
<h3>Staying Online, Improving Uptime</h3>
<p>Ever since I started sharing information and software to stop all these resource hogging zombies attacking everything I&#8217;ve been attacked several times.  Normally I get over 10K exploit attempts or requests per day, which I pretty much block 100%.  But a few times they&#8217;ve actually tried to DDOS me off the net in a distributed attack.  I have implemented several &#8220;poor mans&#8221; techniques to put up your best effort at surviving, which I did.  Basically you want to configure your server to KILL connections just as fast as possible and prevent your server resources from skyrocketing and surpassing your quotas.  A skilled attacker could easily shut you down even without the use of a widespread botnet if they are clever, which could be devastating to your small blog or site if it goes down at a crucial instant.</p>
<hr class="HR0" />
<h2>Organization with Templates and Systems</h2>
<p>I used to work with a guy who did alot of the coldfusion programming for us, and I used to cringe every  time I was called in to upgrade a site or do a re-design.  Files and folders EVERYWHERE!  Literally images in every folder, multiple index.html, index1.html, index-old.html, and on and on it went.. It would take me hours just to reverse-engineer the site enough so I could modify files on it without having some unkown consequence happen.</p>
<h3>Do You Have a Cluttered Desktop?</h3>
<p>Everyone has this problem, what I do all the time is just grab everything on my desktop and put it in a folder named with the date.  Then the process repeats itself and invariably a few months later I&#8217;m looking at a cluttered screen again.</p>
<p>This absolutely is the worst thing that can happen to a website, worst for security, comfort for webmaster, and speed.  So this setup addresses that issue completely heads on.  With all the different pages, tools, and resources available on this blog, I can almost promise you that my site has less files than yours.  No small feat to be sure, but worth every second I spent researching how to do it now that its on and popping.</p>
<hr class="HR0" />
<h2>What&#8217;s a Website really?</h2>
<p>All hosts are different, but any host worth their salt is running some kind of <a href="http://www.askapache.com/linux-unix/">BSD/Linux</a> operating system, and that is good news because those operating systems all use very similarly excellent file/folder structures with huge organization systems.  If your web hosting provider is running on a Windows based operating system or other locked/proprietary software than this article is not for you and I would recommend switching hosts to a BSD/Linux open-source operating system.</p>
<h3>Listening for Requests with Web Hosting and DNS</h3>
<p>First you set your website up so it can start serving.</p>
<ol>
<li>You buy your domain name, which just gives you the right to use it.</li>
<li>You pay your webhost for an account on their machine running a Server connected to the Net <em>via a fast connection link</em>.</li>
<li>You pay a DNS provider to redirect requests for your domain  name to be sent to your webhosts machine running the server.</li>
</ol>
<h2>Sub-Domain for Serving Assets</h2>
<p>This is a very cool method I&#8217;ve been using more and more frequently because it makes updates, upgrades, and changes so much easier to manage.  And segmenting various parts of the site is smart security, and even smarter in the way of speeding up a website and keeping your <strong>servers running mean and lean</strong>.</p>
<h2>Full Site Structure Expanded</h2>
<pre>/home/askapache.com
|&#45;- /home/askapache.com/backups/
|&#45;- /home/askapache.com/public_html/
|   |&#45;- /home/askapache.com/public_html/about/
|   |&#45;- /home/askapache.com/public_html/admin/
|   |&#45;- /home/askapache.com/public_html/cgi-bin/
|   |&#45;- /home/askapache.com/public_html/.htaccess
|   |&#45;- /home/askapache.com/public_html/index.php
|   `&#45;- /home/askapache.com/public_html/robots.txt
|&#45;- /home/askapache.com/inc/
|   |&#45;- /home/askapache.com/inc/config.inc.php
|   `&#45;- /home/askapache.com/inc/settings.inc.php
|&#45;- /home/askapache.com/logs/
|   |&#45;- /home/askapache.com/logs/access.log
|   |&#45;- /home/askapache.com/logs/error.log
|   |&#45;- /home/askapache.com/logs/logins.log
|   |&#45;- /home/askapache.com/logs/modsec_audit.log
|   |&#45;- /home/askapache.com/logs/modsec_debug.log
|   `&#45;- /home/askapache.com/logs/php_error.log
|&#45;- /home/askapache.com/static/
|   |&#45;- /home/askapache.com/static/css/
|   |&#45;- /home/askapache.com/static/flv/
|   |&#45;- /home/askapache.com/static/img/
|   |&#45;- /home/askapache.com/static/js/
|   |&#45;- /home/askapache.com/static/mp3/
|   |&#45;- /home/askapache.com/static/pdf/
|   |&#45;- /home/askapache.com/static/swf/
|   |&#45;- /home/askapache.com/static/.htaccess
|   |&#45;- /home/askapache.com/static/index.html
|   `&#45;- /home/askapache.com/static/robots.txt
|&#45;- /home/askapache.com/tmp/
|&#45;- /home/askapache.com/.htpasswd-basic
`&#45;- /home/askapache.com/.htpasswd-digest</pre>
<h2>Full Expanded Structure</h2>
<pre>/home/askapache.com
|&#45;- /home/askapache.com/backups/
|&#45;- /home/askapache.com/public_html/
|   |&#45;- /home/askapache.com/public_html/about/
|   |   `&#45;- /home/askapache.com/public_html/about/index.html
|   |&#45;- /home/askapache.com/public_html/admin/
|   |   |&#45;- /home/askapache.com/public_html/admin/.htaccess
|   |   `&#45;- /home/askapache.com/public_html/admin/index.html
|   |&#45;- /home/askapache.com/public_html/cgi-bin/
|   |   |&#45;- /home/askapache.com/public_html/cgi-bin/bin/
|   |   |   |&#45;- /home/askapache.com/public_html/cgi-bin/bin/.htaccess
|   |   |   |&#45;- /home/askapache.com/public_html/cgi-bin/bin/php.cgi*
|   |   |   |&#45;- /home/askapache.com/public_html/cgi-bin/bin/php.ini
|   |   |   |&#45;- /home/askapache.com/public_html/cgi-bin/bin/php4.cgi*
|   |   |   `&#45;- /home/askapache.com/public_html/cgi-bin/bin/php5.cgi*
|   |   |&#45;- /home/askapache.com/public_html/cgi-bin/private/
|   |   |   |&#45;- /home/askapache.com/public_html/cgi-bin/private/.htaccess
|   |   |   |&#45;- /home/askapache.com/public_html/cgi-bin/private/debug.php
|   |   |   `&#45;- /home/askapache.com/public_html/cgi-bin/private/stats.php
|   |   |&#45;- /home/askapache.com/public_html/cgi-bin/.htaccess
|   |   |&#45;- /home/askapache.com/public_html/cgi-bin/login.php
|   |   |&#45;- /home/askapache.com/public_html/cgi-bin/printenv.cgi*
&nbsp;
|   |   `&#45;- /home/askapache.com/public_html/cgi-bin/redir.cgi*
|   |&#45;- /home/askapache.com/public_html/.htaccess
|   |&#45;- /home/askapache.com/public_html/index.php
|   `&#45;- /home/askapache.com/public_html/robots.txt
|&#45;- /home/askapache.com/inc/
|   |&#45;- /home/askapache.com/inc/config.php
|   `&#45;- /home/askapache.com/inc/functions.php
|&#45;- /home/askapache.com/logs/
|   |&#45;- /home/askapache.com/logs/access.log
|   |&#45;- /home/askapache.com/logs/error.log
|   |&#45;- /home/askapache.com/logs/logins.log
|   |&#45;- /home/askapache.com/logs/modsec_audit.log
|   |&#45;- /home/askapache.com/logs/modsec_debug.log
|   `&#45;- /home/askapache.com/logs/php_error.log
|&#45;- /home/askapache.com/static/
|   |&#45;- /home/askapache.com/static/css/
|   |   `&#45;- /home/askapache.com/static/css/apache.css
|   |&#45;- /home/askapache.com/static/flv/
|   |   `&#45;- /home/askapache.com/static/flv/apache.flv
|   |&#45;- /home/askapache.com/static/img/
|   |   |&#45;- /home/askapache.com/static/img/apache.gif
|   |   |&#45;- /home/askapache.com/static/img/apache.jpg
|   |   `&#45;- /home/askapache.com/static/img/apache.png
|   |&#45;- /home/askapache.com/static/js/
|   |   `&#45;- /home/askapache.com/static/js/apache.js
|   |&#45;- /home/askapache.com/static/mp3/
|   |   `&#45;- /home/askapache.com/static/mp3/apache.mp3
|   |&#45;- /home/askapache.com/static/pdf/
|   |   `&#45;- /home/askapache.com/static/pdf/apache.pdf
|   |&#45;- /home/askapache.com/static/swf/
|   |   `&#45;- /home/askapache.com/static/swf/apache.swf
|   |&#45;- /home/askapache.com/static/.htaccess
|   |&#45;- /home/askapache.com/static/index.html
|   `&#45;- /home/askapache.com/static/robots.txt
|&#45;- /home/askapache.com/tmp/
|&#45;- /home/askapache.com/.htpasswd-basic
`&#45;- /home/askapache.com/.htpasswd-digest</pre>
<p>The buzz about apache and open-source is very real, apache is becoming more of a discussed topic as people realize the power and importance of <q cite="LL Cool J">Doing it and Doing it and Doing it well.</q> &#8211;  <small><a href="http://www.webmonkey.com/blog/Jumpbox_Offers_an_Easier_Way_to_Install_Movable_Type" rel="nofollow" >Movable Type Apache Installs made easy</a>, <a href="http://www.ubuntugeek.com/webalizer-apache-web-server-log-file-analysis-tool.html" rel="nofollow" >Checking out Apache Web logs</a>, <a href="http://eventurebiz.com/blog/securing-securing-your-wordpress-blog-post-6-protecting-the-wp-configphp-file/" rel="nofollow" >Securing WordPress with .htaccess</a>, <a href="http://marketingdefined.com/blog/wordpress/using-wordpress-permalink-redirect-plugins-correctly/" rel="nofollow" >WordPress Permalinks and .htaccess</a>, <a href="http://corpocrat.com/2008/09/19/install-apache-mod_substitute/" rel="nofollow" >New search and replace module for apache!</a>, <a href="http://www.csskarma.com/blog/creating-an-htaccess-template/" rel="nofollow" >creating an .htaccess template</a>, <a href="http://www.thelinuxblog.com/htaccess-allow-from/" rel="nofollow" >.htaccess allow directive</a></small></p>
<p class="anote">Check back in a week for the first article, or better yet subscribe to my <a href="http://www.askapache.com/feed/">rss feed</a> or use the comment form below to get notified.</p>
<p><a href="http://www.askapache.com/htaccess/optimize-website-files-cache-security.html"></a><a href="http://www.askapache.com/htaccess/optimize-website-files-cache-security.html">Optimize a Website for Speed, Security, and Easy Management</a> originally appeared on <cite>AskApache.com</cite> </p>]]></content:encoded>
			<wfw:commentRss>http://www.askapache.com/htaccess/optimize-website-files-cache-security.html/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Vetted &#8211; Top 3 WordPress Speed Plugins</title>
		<link>http://www.askapache.com/wordpress/fastest-caching-plugins.html</link>
		<comments>http://www.askapache.com/wordpress/fastest-caching-plugins.html#comments</comments>
		<pubDate>Sun, 29 Nov 2009 19:14:16 +0000</pubDate>
		<dc:creator>AskApache</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Cache]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[Mod_Rewrite]]></category>
		<category><![CDATA[Review]]></category>
		<category><![CDATA[Server Administration]]></category>
		<category><![CDATA[Web Hosting]]></category>
		<category><![CDATA[Webmaster]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[WordPress Plugins]]></category>
		<category><![CDATA[admin]]></category>
		<category><![CDATA[askapache]]></category>
		<category><![CDATA[AskApache Crazy Cache]]></category>
		<category><![CDATA[Bandwidth]]></category>
		<category><![CDATA[Bottleneck]]></category>
		<category><![CDATA[caching]]></category>
		<category><![CDATA[compression]]></category>
		<category><![CDATA[Dig]]></category>
		<category><![CDATA[filesystem]]></category>
		<category><![CDATA[GET]]></category>
		<category><![CDATA[httpd]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[Networking]]></category>
		<category><![CDATA[password]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[post]]></category>
		<category><![CDATA[Private Server]]></category>
		<category><![CDATA[ram]]></category>
		<category><![CDATA[Scripts]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[servers]]></category>
		<category><![CDATA[SPEED]]></category>
		<category><![CDATA[SSI]]></category>
		<category><![CDATA[stat]]></category>
		<category><![CDATA[WordPress Optimizing]]></category>
		<category><![CDATA[WordPress Speed]]></category>
		<category><![CDATA[WP-Super Cache]]></category>

		<guid isPermaLink="false">http://www.askapache.com/?p=3701</guid>
		<description><![CDATA[<p><a class="IFL" id="id15" href="http://www.askapache.com/wordpress/fastest-caching-plugins.html" title="Top 3 WordPress Plugins for a Faster Blog"></a>There are so many WordPress plugins out there now that I wanted to post my favorite 3 plugins for speeding up a WP-Powered blog.  These are the 3 plugins that I install for pretty much all of my WP-Powered sites, which I run about 300 now.  They work together to provide a very optimized blog for speed.<br /><br /><strong>DB-Cache Reloaded does something entirely different</strong>, it saves the mysql queries that are made to the WP-database, as well as the mysql results to static files, and then through php serves those cached-files instead of re-querying the mysql database. Most mysql databases are stored on separate servers, and although many are on the same local network there is a limit to how many queries, and how many connections can take place.<br /><br />So DB-Cache Reloaded basically makes WP-Super Cache work alot faster when generating the cache files, and DB-Cache Reloaded helps in a number of areas un-related to WP-Super Cache, like in the admin panel.  And DB-Cache without WP-Super-Cache is a joke because it still uses the application-level and php for everything.  <em>Gotta use both (or just WPSC)</em>.<br class="C" /></p>
]]></description>
			<content:encoded><![CDATA[<p>There are so many WordPress plugins out there now that I wanted to post my favorite 3 plugins for speeding up a WP-Powered blog (including one of <a href="http://wordpress.org/extend/plugins/profile/askapache" rel="nofollow" >my plugins</a>).  These are the 3 plugins that I install for pretty much all of my WP-Powered sites, which I run about 300 now.  They work together to provide a very optimized blog for speed.</p>
<h2>Top 3 WordPress Speed Plugins</h2>
<ol class="TOC">
<li><a href="http://www.askapache.com/wordpress/fastest-caching-plugins.html#db-cache-reloaded">DB Cache Reloaded</a></li>
<li><a href="http://www.askapache.com/wordpress/fastest-caching-plugins.html#wp-super-cache">WP Super Cache</a></li>
<li><a href="http://www.askapache.com/wordpress/fastest-caching-plugins.html#crazy-cache">AskApache Crazy Cache</a></li>
</ol>
<h2>WP Caching Overview</h2>
<p>Each request to your blog has to fire up the php interpreter and query the mysql database to create the output that you see in your browser.  Using a plugin like WP Super Cache simply saves the output of that request as a static HTML file and serves that to a request instead of using php and mysql every time.  DB Cache Reloaded takes this a step further by optimizing the mysql queries.  Finally, AskApache Crazy Cache is used to keep a cache fully primed and ready.</p>
<h3>Why Caching?</h3>
<p>If you have a private server, or you want to keep your MEMORY, BANDWIDTH, and CPU usage down for your server, these plugins will be dramatic.  If you have a site that is updated maybe once a month and gets a very small amount of traffic, then the AskApache Crazy Cache would be redundant.  That plugin is geared for the heaviest traffic sites.</p>
<h3>Request and Response</h3>
<p>Most HTTP communication is initiated by a user agent (browser) and consists of a request to a resource on some origin server. In the simplest case, this may be accomplished via a single connection (v) between the user agent (UA) and the origin server (O).</p>
<pre>             request chain &#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&gt;
          UA &#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;&#45;-v&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;&#45;- O
             &lt;&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;&#45;&#45;- response chain</pre>
<p>If a browser requests a WP-driven page, the server generates the response (the outputted html) by loading a php interpreter or module to read the WP php files and load all the settings.  WP stores the settings in a mysql database and has to query the mysql database for all the data (like the content of your post that becomes html).  Finally php sends the output through the server back to the browser.  This is the norm for most PHP applications.  Every time an interpreter is loaded additional CPU and Memory are used.  And perhaps even more troublesome for shared-hosting using a virtual or network filesystem, each load causes many hard-disk accesses, additional processes, etc.</p>
<h3>Cache PHP</h3>
<p>By saving the php-generated output of a page to a static html file, your server can entirely skip loading a php interpreter or other process.  Originally servers were needed and created to essentially open a static file on disk and send that file back to the requesting user.  So servers are specialized for this as it&#8217;s their core function.</p>
<p><strong>WP-Super cache does this for you by saving the output into a static html file</strong>, and by instructing the server to skip loading php.  It basically only uses php for creating the cached version, in the same way that you can save this webpage as an html file, WP-Super cache saves all the WP-blog permalinks to static files.</p>
<p><strong>DB-Cache Reloaded does something entirely different</strong>, it saves the mysql queries that are made to the WP-database, as well as the mysql results to static files, and then through php serves those cached-files instead of re-querying the mysql database. Most mysql databases are stored on separate servers, and although many are on the same local network there is a limit to how many queries, and how many connections can take place.  But mysql is maybe the fastest thing I&#8217;ve seen, so your bottlenecks almost never happen there (if configured correctly).</p>
<p>So DB-Cache Reloaded basically makes WP-Super Cache work alot faster when generating the cache files, and DB-Cache Reloaded helps in a number of areas un-related to WP-Super Cache, like in the admin panel.  And DB-Cache without WP-Super-Cache is a joke because it still uses the application-level and php for everything.  <em>Gotta use both (or just WPSC)</em>.</p>
<p><strong>AskApache Crazy Cache is a plugin I wrote</strong> to do one thing very well, it runs at intervals via the WP-cron and forces WP-Super-Cache to create a static cache file for all the posts, pages, etc. on your site.  Without this WPSC likes to do dumb things like try to manage it&#8217;s own cache with stale files and expired files, which equals a lot more php interpreters getting loaded instead of cached static files.  For sites with more than a visit/page/10minutes this plugin keeps a full primed cache built by WPSC.</p>
<h3>Compression and WP-Super Cache</h3>
<p><strong>Enabling compression in WP-Super Cache</strong> is almost always a great idea.  I&#8217;ve never had a problem other than some php compat issues with not-updated php installations.  This option basically lets WP-Super Cache compress the generated output of a page and save that to the static file.  Normally Apache, Lighttpd, Nginx, etc. open the static file and compress it before it is sent to the browser, then the browser automatically decompresses it to view.  This happens so fast because it is run by the server.</p>
<p>This lets WPSC instruct your server to send the compressed version to all browsers that accept compression, and send the uncompressed static file to any other browsers.  So this is helpful because it eliminates your server having to do any transparent compressing, it can instead just focus on what it does best, serving static files.</p>
<p>PHP is an application so it requires memory, hard-drive access, and CPU time.  Check out the protocol hierarchy:</p>
<pre>       +&#45;&#45;-&#45;&#45;-+ +&#45;&#45;&#45;&#45;-+ +&#45;&#45;&#45;&#45;-+       +&#45;&#45;&#45;&#45;-+
       |Telnet| | FTP | |Voice|  &#46;..  |     |  Application Level
       +&#45;&#45;-&#45;&#45;-+ +&#45;&#45;&#45;&#45;-+ +&#45;&#45;&#45;&#45;-+       +&#45;&#45;&#45;&#45;-+
             |   |         |             |
            +&#45;&#45;&#45;&#45;-+     +&#45;&#45;&#45;&#45;-+       +&#45;&#45;&#45;&#45;-+
            | TCP |     | RTP |  &#46;..  |     |  Host Level
            +&#45;&#45;&#45;&#45;-+     +&#45;&#45;&#45;&#45;-+       +&#45;&#45;&#45;&#45;-+
               |           |             |
            +&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;&#45;-+
            |    Internet Protocol &amp; ICMP   |  Gateway Level
            +&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;&#45;-+
                           |
              +&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-+
              |   Local Network Protocol  |    Network Level
              +&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-+       </pre>
<p><a id="db-cache-reloaded" name="db-cache-reloaded"></a></p>
<h3>DB Cache Reloaded</h3>
<p><a href="http://wordpress.org/extend/plugins/db-cache-reloaded/" rel="nofollow" >DB Cache Reloaded Plugin Page</a> &#8211; <a href="http://wordpress.org/tags/db-cache-reloaded?forum_id=10" rel="nofollow" >News</a></p>
<p><a href="http://uploads.askapache.com/2009/11/db-cache-reloaded.png" rel="nofollow" class="IFL" ><img src="http://uploads.askapache.com/2009/11/db-cache-reloaded-116x64.png" alt="DB Cache Reloaded" title="DB Cache Reloaded" width="116" height="64" /></a>This plugin caches every database query with given lifetime. It is much faster than other html caching plugins and uses less disk space for caching.</p>
<p>I think you&#8217;ve heard of WP-Cache or WP Super Cache, they are both top plugins for WordPress, which make your site faster and responsive. Forget about them &#8211; with DB Cache Reloaded your site will work much faster and will use less disk space for cached files. Your visitors will always get actual information in sidebars and server CPU loads will be as low as possible.<br class="C" /></p>
<blockquote cite="http://wordpress.org/extend/plugins/db-cache-reloaded/faq/">
<h4>Why is DB Cache Reloaded better than WP Super Cache?</h4>
<p>This plugin is based on a fundamentally different principle of caching queries to database instead of full pages, which optimises WordPress from the very beginning and uses less disk space for cache files because it saves only useful information. It saves information separately and also caches hidden requests to database.</p>
</blockquote>
<p><a id="wp-super-cache" name="wp-super-cache"></a></p>
<h3>WP Super Cache</h3>
<p><a href="http://wordpress.org/extend/plugins/wp-super-cache/" rel="nofollow" >WP Super Cache Plugin Page</a> &#8211; <a href="http://wordpress.org/tags/wp-super-cache?forum_id=10" rel="nofollow" >News</a></p>
<p><a href="http://uploads.askapache.com/2009/11/wp-super-cache.png" rel="nofollow" class="IFL" ><img src="http://uploads.askapache.com/2009/11/wp-super-cache-116x61.png" alt="WP Super Cache" title="WP Super Cache" width="116" height="61" /></a>This plugin generates static html files from your dynamic WordPress blog. After a html file is generated your webserver will serve that file instead of processing the comparatively heavier and more expensive WordPress PHP scripts.</p>
<p>The static html files will be served to the vast majority of your users, but because a user&#8217;s details are displayed in the comment form after they leave a comment those requests are handled by PHP. Static files are served to:</p>
<p>&middot; Users who are not logged in.<br />&middot; Users who have not left a comment on your blog.<br />&middot; Or users who have not viewed a password protected post.</p>
<p>99% of your visitors will be served static html files. Those users who don&#8217;t see the static files will still benefit because they will see regular WP-Cache cached files and your server won&#8217;t be as busy as before. This plugin will help your server cope with a front page appearance on digg.com or other social networking site.<br class="C" /></p>
<blockquote cite="http://wordpress.org/extend/plugins/wp-super-cache/faq/">
<h4>Why is WP-Super-Cache better than WP-Cache?</h4>
<p>This plugin is based on the excellent WP-Cache plugin and therefore brings all the benefits of that plugin to WordPress. On top of that it creates copies of every page that is accessed on a blog in a form that is quickly served by the web server. It&#8217;s almost as quick as if the you had saved a page in your browser and uploaded it to replace your homepage.</p>
</blockquote>
<blockquote cite="http://wordpress.org/extend/plugins/wp-super-cache/faq/">
<h4>Will the Super Cache compression slow down my server?</h4>
<p>No, it will do the opposite in fact. Super Cache files are compressed and stored that way so the heavy compression is done only once. These files are generally much smaller and are sent to a visitor&#8217;s browser much more quickly than uncompressed html. As a result, your server spends less time talking over the network which saves CPU time and bandwidth, and can also serve the next request much more quickly.</p>
</blockquote>
<p><a id="crazy-cache" name="crazy-cache"></a></p>
<h3>AskApache Crazy Cache</h3>
<p><a href="http://wordpress.org/extend/plugins/askapache-crazy-cache/" rel="nofollow" >AskApache Crazy Cache Plugin Page</a> &#8211; <a href="http://wordpress.org/tags/askapache-crazy-cache?forum_id=10" rel="nofollow" >News</a></p>
<blockquote cite="http://wordpress.org/extend/plugins/askapache-crazy-cache/">
<p>
<p><a href="http://uploads.askapache.com/2009/11/askapache-crazy-cache.png" rel="nofollow" class="IFL" ><img src="http://uploads.askapache.com/2009/11/askapache-crazy-cache-116x36.png" alt="AskApache Crazy Cache" title="AskApache Crazy Cache" width="116" height="36" /></a>This sweet little plugin does one thing very well. It caches all the posts on your entire blog at the same time, if you are using WP-Cache, WP-Super-Cache, or Hyper-Cache.<br class="C" /></p>
</p>
</blockquote>
<pre>
                              +&#45;&#45;-&#45;&#45;-&#45;&#45;-+ &#45;&#45;-&#45;&#45;-&#45;&#45;-\      active OPEN
                              |  CLOSED |            \    &#45;&#45;-&#45;&#45;-&#45;&#45;&#45;&#45;-
                              +&#45;&#45;-&#45;&#45;-&#45;&#45;-+&lt;&#45;&#45;-&#45;&#45;-&#45;&#45;-\   \   create TCB
                                |     ^              \   \  snd SYN
                   passive OPEN |     |   CLOSE        \   \
                   &#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;- |     | &#45;&#45;-&#45;&#45;-&#45;&#45;&#45;-       \   \
                    create TCB  |     | delete TCB         \   \
                                V     |                      \   \
                              +&#45;&#45;-&#45;&#45;-&#45;&#45;-+            CLOSE    |    \
                              |  LISTEN |          &#45;&#45;-&#45;&#45;-&#45;&#45;&#45;- |     |
                              +&#45;&#45;-&#45;&#45;-&#45;&#45;-+          delete TCB |     |
                   rcv SYN      |     |     SEND              |     |
                  &#45;&#45;-&#45;&#45;-&#45;&#45;&#45;&#45;-   |     |    &#45;&#45;-&#45;&#45;&#45;-            |     V
 +&#45;&#45;-&#45;&#45;-&#45;&#45;-+      snd SYN,ACK  /       \   snd SYN          +&#45;&#45;-&#45;&#45;-&#45;&#45;-+
 |         |&lt;&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;&#45;&#45;-           &#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&gt;|         |
 |   SYN   |                    rcv SYN                     |   SYN   |
 |   RCVD  |&lt;&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;&#45;&#45;-|   SENT  |
 |         |                    snd ACK                     |         |
 |         |&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-           &#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;&#45;-|         |
 +&#45;&#45;-&#45;&#45;-&#45;&#45;-+   rcv ACK of SYN  \       /  rcv SYN,ACK       +&#45;&#45;-&#45;&#45;-&#45;&#45;-+
   |           &#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;&#45;&#45;-   |     |   &#45;&#45;-&#45;&#45;-&#45;&#45;&#45;&#45;-
   |                  x         |     |     snd ACK
   |                            V     V
   |  CLOSE                   +&#45;&#45;-&#45;&#45;-&#45;&#45;-+
   | &#45;&#45;-&#45;&#45;&#45;-                  |  ESTAB  |
   | snd FIN                  +&#45;&#45;-&#45;&#45;-&#45;&#45;-+
   |                   CLOSE    |     |    rcv FIN
   V                  &#45;&#45;-&#45;&#45;&#45;-   |     |    &#45;&#45;-&#45;&#45;&#45;-
 +&#45;&#45;-&#45;&#45;-&#45;&#45;-+          snd FIN  /       \   snd ACK          +&#45;&#45;-&#45;&#45;-&#45;&#45;-+
 |  FIN    |&lt;&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;&#45;&#45;-           &#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&gt;|  CLOSE  |
 | WAIT-1  |&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-                              |   WAIT  |
 +&#45;&#45;-&#45;&#45;-&#45;&#45;-+          rcv FIN  \                            +&#45;&#45;-&#45;&#45;-&#45;&#45;-+
   | rcv ACK of FIN   &#45;&#45;-&#45;&#45;&#45;-   |                            CLOSE  |
   | &#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;&#45;&#45;-   snd ACK   |                           &#45;&#45;-&#45;&#45;&#45;- |
   V        x                   V                           snd FIN V
 +&#45;&#45;-&#45;&#45;-&#45;&#45;-+                  +&#45;&#45;-&#45;&#45;-&#45;&#45;-+                   +&#45;&#45;-&#45;&#45;-&#45;&#45;-+
 |FINWAIT-2|                  | CLOSING |                   | LAST-ACK|
 +&#45;&#45;-&#45;&#45;-&#45;&#45;-+                  +&#45;&#45;-&#45;&#45;-&#45;&#45;-+                   +&#45;&#45;-&#45;&#45;-&#45;&#45;-+
   |                rcv ACK of FIN |                 rcv ACK of FIN |
   |  rcv FIN       &#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;&#45;&#45;- |    Timeout=2MSL &#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;&#45;&#45;- |
   |  &#45;&#45;-&#45;&#45;&#45;-              x       V    &#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-        x       V
    \ snd ACK                 +&#45;&#45;-&#45;&#45;-&#45;&#45;-+delete TCB         +&#45;&#45;-&#45;&#45;-&#45;&#45;-+
     &#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&gt;|TIME WAIT|&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&#45;&#45;-&gt;| CLOSED  |
                              +&#45;&#45;-&#45;&#45;-&#45;&#45;-+                   +&#45;&#45;-&#45;&#45;-&#45;&#45;-+
&nbsp;
                      TCP Connection State Diagram</pre>
<p><a href="http://www.askapache.com/wordpress/fastest-caching-plugins.html"></a><a href="http://www.askapache.com/wordpress/fastest-caching-plugins.html">Vetted &#8211; Top 3 WordPress Speed Plugins</a> originally appeared on <cite>AskApache.com</cite> </p>]]></content:encoded>
			<wfw:commentRss>http://www.askapache.com/wordpress/fastest-caching-plugins.html/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Firefox Add-ons for Web Developers</title>
		<link>http://www.askapache.com/firefox/best-firefox-addons-webdev.html</link>
		<comments>http://www.askapache.com/firefox/best-firefox-addons-webdev.html#comments</comments>
		<pubDate>Mon, 19 Oct 2009 00:14:07 +0000</pubDate>
		<dc:creator>AskApache</dc:creator>
				<category><![CDATA[Cache]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Making Money]]></category>
		<category><![CDATA[Music]]></category>
		<category><![CDATA[Review]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Web Design]]></category>
		<category><![CDATA[Web Tools]]></category>
		<category><![CDATA[Webmaster]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[401]]></category>
		<category><![CDATA[403 Forbidden]]></category>
		<category><![CDATA[500]]></category>
		<category><![CDATA[Accessibility]]></category>
		<category><![CDATA[Advanced]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[askapache]]></category>
		<category><![CDATA[Backups]]></category>
		<category><![CDATA[caching]]></category>
		<category><![CDATA[CommandLine]]></category>
		<category><![CDATA[console]]></category>
		<category><![CDATA[Cookies]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[debugging]]></category>
		<category><![CDATA[Dig]]></category>
		<category><![CDATA[DNS]]></category>
		<category><![CDATA[Email]]></category>
		<category><![CDATA[encryption]]></category>
		<category><![CDATA[feed]]></category>
		<category><![CDATA[Firebug]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Forms]]></category>
		<category><![CDATA[GET]]></category>
		<category><![CDATA[Gmail]]></category>
		<category><![CDATA[HTTP Headers]]></category>
		<category><![CDATA[HTTPS SSL]]></category>
		<category><![CDATA[Login]]></category>
		<category><![CDATA[Networking]]></category>
		<category><![CDATA[Nice]]></category>
		<category><![CDATA[Pagerank]]></category>
		<category><![CDATA[password]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Port]]></category>
		<category><![CDATA[post]]></category>
		<category><![CDATA[ram]]></category>
		<category><![CDATA[Scripts]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[servers]]></category>
		<category><![CDATA[SOCKS]]></category>
		<category><![CDATA[Source Code]]></category>
		<category><![CDATA[SPEED]]></category>
		<category><![CDATA[SSH]]></category>
		<category><![CDATA[SSH Tunnels]]></category>
		<category><![CDATA[SSI]]></category>
		<category><![CDATA[stat]]></category>
		<category><![CDATA[tmpfs]]></category>
		<category><![CDATA[trick]]></category>
		<category><![CDATA[Username]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[Wireshark]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[YSlow]]></category>

		<guid isPermaLink="false">http://www.askapache.com/?p=3301</guid>
		<description><![CDATA[<p><a href="http://www.askapache.com/firefox/best-firefox-addons-webdev.html" class="IFL"><img src="http://uploads.askapache.com/2009/10/askapache-firefox-cache-116x102.png" alt="askapache favorite addons" title="askapache favorite addons" width="116" height="102" /></a><a href="https://addons.mozilla.org/en-US/firefox/collection/advanced-webdevelopment">Advanced Web Development by AskApache</a> is a <dfn title="Collections are groups of related add-ons assembled for easy sharing">Firefox Collection</dfn> I created since I'm always trying new Addons out and using multiple computers and I wanted a quick and easy way to install my favorite's and keep a running list.  Firebug, YSlow, LastPass, and Web Developer are the only ones I always use regularly.<br /><br />I like the idea of the last.fm but it's not as powerful as the site, which is awesome.  <em>Lately listening to <a href="http://www.last.fm/listen/artist/Kings%2Bof%2BLeon/similarartists">Kings of Leon Radio</a>...</em><br class="C" /></p>]]></description>
			<content:encoded><![CDATA[<p><a href="https://addons.mozilla.org/en-US/firefox/collection/advanced-webdevelopment" rel="nofollow" class="IFL" ><img src="https://addons.mozilla.org/en-US/firefox/images/collection_icon/27412/1253649941" title=" web cache" alt="Firefox Add ons for Web Developers" /></a><a href="https://addons.mozilla.org/en-US/firefox/collection/advanced-webdevelopment" rel="nofollow" >Advanced Web Development by AskApache</a> is a <dfn title="Collections are groups of related add-ons assembled for easy sharing">Firefox Collection</dfn> I created for myself to make finding and installing my favorite Firefox Add-ons simple and easy.</p>
<h2>My Setup</h2>
<p><img class="IFL" src="http://uploads.askapache.com/2009/10/askapache-firefox-cache.png" alt="askapache favorite addons" title="askapache favorite addons" width="283" height="250" />As this screenshot shows, I only use a handful of add-ons at a time.  These buttons allow me to clear the DNS/Cookies/Cache for whichever site I&#8217;m on when I click it.  Very very helpful for me as a web designer.  The 4th button there is just a restart button.  Other than those, Firebug, YSlow, LastPass, and Web Developer are the only ones I always use regularly.</p>
<p>I like the idea of the last.fm but it&#8217;s not as powerful as the site, which is awesome.  Lately I&#8217;ve been listening to <a href="http://www.last.fm/listen/artist/Kings%2Bof%2BLeon/similarartists" rel="nofollow" >Kings of Leon Radio</a>&#8230; <br class="C" /></p>
<h2>Slow Firefox</h2>
<p><strong>The more add-ons you have</strong>, disabled or not, the slower Firefox is. (<em>unless you are running your profile folder in TMPFS</em>).   Also, bookmarks and settings like that have a performance hit.  I have been using Firefox since it launched way back when, and I have always kept my bookmarks when moving to new machines and new installations..  So with over 5 thousand bookmarks I finally did some debugging and discovered that was a huge cause of Firefox acting slow.  Now I am trying to migrate them all over to Google&#8217;s Gmarks, which knowing Google will be awesome eventually.</p>
<h2>Multiple Firefox Installations, Sorta</h2>
<p>The solution to all these problems is to use <strong>separate Firefox profiles</strong> which use separate folders to store your profile-specific extensions and settings.  So I have profiles with upwards of 40 Addons installed and enabled, and another profile that is built for speed&#8230; It&#8217;s very very slow to be running Firebug and have multiple tabs open..  You can use the profilemanager to load them specific profiles from the command line.  I personally use separate icons on my Windows Quick Launch that I just modified the shortcut pointing to firefox to also have the profile commandline.   Note also that you can have multiple profiles open and running simultaneously.. This lets you do some crazy networking and other random hacks like having many Firefox instances running each of which is configured to use a separate SOCKS Proxy or network interface, so you can really open up those pipes for some intense txrx.</p>
<p>You can do some very powerful things with Firefox that most people are unaware of, if you are interested start with these:</p>
<ul>
<li><a href="https://developer.mozilla.org/en/Setting_up_extension_development_environment" rel="nofollow" >Setting up an extension development environment</a></li>
<li><a href="https://developer.mozilla.org/en/Command_Line_Options" rel="nofollow" >Firefox Command Line Options</a></li>
</ul>
<hr class="C" />
<h3>About This Collection</h3>
<p>Web Development Add-ons for Advanced Web Developers.  I personally use these to work on Sites, Servers, WordPress, Javascript, PHP, CSS, XHTML, validation, page-loading, SEO, optimizing, and much more.  <a href="https://addons.mozilla.org/en-US/firefox/users/login?to=en-US%2Ffirefox%2Fcollection%2Fadvanced-webdevelopment%3Fadvancedsearch%3D1%26show%3D100" rel="nofollow" >Add this collection</a>.</p>
<p><strong>Created by:</strong><a href="https://addons.mozilla.org/en-US/firefox/user/145961" rel="nofollow" >AskApache</a></p>
<p><strong>Updated:</strong>September 22, 2009 </p>
<h3>Share this Collection</h3>
<ul>
<li class="digg"><a href="https://addons.mozilla.org/en-US/firefox/collections/share/advanced-webdevelopment?service=digg" rel="nofollow" >Digg this!</a></li>
<li class="facebook"><a href="https://addons.mozilla.org/en-US/firefox/collections/share/advanced-webdevelopment?service=facebook" rel="nofollow" >Post to Facebook</a></li>
<li class="delicious"><a href="https://addons.mozilla.org/en-US/firefox/collections/share/advanced-webdevelopment?service=delicious" rel="nofollow" >Add to Delicious</a></li>
<li class="myspace"><a href="https://addons.mozilla.org/en-US/firefox/collections/share/advanced-webdevelopment?service=myspace" rel="nofollow" >Post to MySpace</a></li>
<li class="friendfeed"><a href="https://addons.mozilla.org/en-US/firefox/collections/share/advanced-webdevelopment?service=friendfeed" rel="nofollow" >Share on FriendFeed</a></li>
<li class="twitter"><a href="https://addons.mozilla.org/en-US/firefox/collections/share/advanced-webdevelopment?service=twitter" rel="nofollow" >Post to Twitter</a></li>
</ul>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/13316?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >History Tree</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/13316/1254409345" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Find any page you have visited quickly and easily. Shows your browsing history as a tree of tabs, with thumbnail screenshots of the web-pages in every tab you have opened. <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/4882?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Tab Scope</a></h4>
<p><img src="https://addons.mozilla.org/img/default_icon.png" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title="default icon web cache" />Preview and navigate tab contents through popup. <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/1480?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Tab Control</a></h4>
<p><img src="https://addons.mozilla.org/img/default_icon.png" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title="default icon web cache" />Take control of your tabs!  Purposely lightweight extension with the following features&#8230; <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/5000?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >ShareThis</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/5000/1248389010" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />ShareThis makes sharing any online content quick and easy. The ShareThis plugin allows you to share to any contact via email, text message, Facebook, Twitter and more.  You can also store your shares for later to reshare with the ShareThis ShareBox. <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/12377?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >FirePalette</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/12377/1244736178" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Adds a color picker to Firebug&#8217;s CSS panel. <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/13000?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Tab History Menu</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/13000/1252809752" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />When click on the selected tab, a history menu corresponding to it will display. <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/8426?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >SyncPlaces</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/8426/1252087590" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Synchronizes your bookmarks, passwords and password exceptions between browsers. Uses your own (or third party) web or ftp server so you have complete control and privacy. <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/10704?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >CSS Usage</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/10704/1255464704" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Firebug extension to view which CSS rules are actually used. <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/9641?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Inline Code Finder for Firebug</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/9641/1246025189" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Inline Code Finder is an add-on to Firebug, to be able to find HTML elements<br class="C" /></p>
<blockquote class="publisher-comment"><p>Provides some additional capabilities to firebug to find inline code as opposed to external files.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/4723?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Save Complete</a></h4>
<p><img src="https://addons.mozilla.org/img/default_icon.png" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title="default icon web cache" />Saves a webpage completely, providing a better alternative to the flawed built-in save functionality of Firefox. <br class="C" /></p>
<blockquote class="publisher-comment"><p>Another of my personal favorites, modifies the &#8220;Save complete page&#8221; option of firefox to truly be more complete, I don&#8217;t understand why firefox doesn&#8217;t already do this.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/10615?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >FireDownload</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/10615/1249999245" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />The FireDownload extension for Firefox and Wyzo lets you manage and accelerate your web downloads up to 10x faster! With FireDownload, download acceleration is seamlessly displayed within the downloads window. Try the ultimate download accelerator! <br class="C" /></p>
<blockquote class="publisher-comment"><p>Pretty nice and unobtrusive download enhancer.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/13255?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Xmarks BYOS Edition</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/13255/1248393038" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Bookmark Sync &#8220;Bring Your Own Server&#8221; Edition (BYOS). For expert users who wish to sync their bookmarks and passwords using their own FTP or WebDAV server. <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/13128?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >FormBug</a></h4>
<p><img src="https://addons.mozilla.org/img/default_icon.png" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title="default icon web cache" />An extension to Firebug to make dealing with forms easier <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/13135?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Widerbug</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/13135/1247888469" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Firebug Evolved. <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/11588?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >SyntaxHighlighter</a></h4>
<p><img src="https://addons.mozilla.org/img/default_icon.png" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title="default icon web cache" />a syntax highlighter, based on SyntaxHighlighter(http://code.google.com/p/syntaxhighlighter/), support lots of program languages. <br class="C" /></p>
<blockquote class="publisher-comment"><p>Adds syntax highlighting, somewhat intensive.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/2318?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Total Validator</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/2318/1252747670" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Perform multiple validations and take screen shots in one go. This 5-in-1 validator works with external, internal, or local web pages using the Total Validator service or local copy of the desktop tool&#8230; <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/115?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >ReloadEvery</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/115/1250716156" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Reloads web pages every so many seconds or minutes. The function is accessible via the context menu (menu you get when you right click on a web page) or via a drop down menu on the reload button &#8230; <br class="C" /></p>
<blockquote class="publisher-comment"><p>Love this plugin, replaces the reload button with a look-alike button with a drop-down menu that lets you enable automatic reloading of a tab (or all tabs) and set the number of seconds between reloads.  I&#8217;ve found it very useful for checking cookie behaviour and cache setups, its also nice if you want to keep checking a page for updates.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/1985?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Window Resizer</a></h4>
<p><img src="https://addons.mozilla.org/img/default_icon.png" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title="default icon web cache" />Resize your browser to various standard resolution sizes&#8230; <br class="C" /></p>
<blockquote class="publisher-comment"><p>Quickly resize your window to the common sizes to see what a site looks like for users with that resolution.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/4415?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Font Finder</a></h4>
<p><img src="https://addons.mozilla.org/img/default_icon.png" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title="default icon web cache" />Get all CSS styles of selected text in Firefox / Thunderbird&#8230; <br class="C" /></p>
<blockquote class="publisher-comment"><p>Locate the fonts that are in use on a webpage.  Small and unobtrusive.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/12632?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >FireQuery</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/12632/1248402877" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Firebug enhancements for jQuery (requires Firebug 1.3+) <br class="C" /></p>
<blockquote class="publisher-comment"><p>Adds jquery support, I usually keep disabled even though I personally use jquery for web development.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/5362?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Alexa Sparky</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/5362/1255562428" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Alexa Internet&#8217;s official add-on for Firefox!  Get Alexa data in your status bar. <br class="C" /></p>
<blockquote class="publisher-comment"><p>Shows the alexa rank of a site, I like it but it does make new HTTP requests for each page, so I disable it alot for privacy or speed.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/5392?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Dust-Me Selectors</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/5392/1246551563" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Finds unused CSS selectors. <br class="C" /></p>
<blockquote class="publisher-comment"><p>One of the newer add-ons I&#8217;ve been using.  Lets you find which CSS rules are actually in use on a page, thus helping you to minimize and streamline CSS.  Very cool but it is a little resource intensive so by default I keep it disabled.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/11249?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >ToggleUseDocColors</a></h4>
<p><img src="https://addons.mozilla.org/img/default_icon.png" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title="default icon web cache" />Toggles Tools-&gt;Options-&gt;Content-&gt;Colors:Allow pages to choose their own colors&#8230; option with a single keystroke (Ctrl+M) <br class="C" /></p>
<blockquote class="publisher-comment"><p>Use the documents colors or other.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/3606?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >FoxTor</a></h4>
<p><img src="https://addons.mozilla.org/img/default_icon.png" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title="default icon web cache" />FoxTor: Anonymous Web Browsing using the encrypted TOR network&#8230; <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/10434?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Bing</a></h4>
<p> <img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/10434/1247527217" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />This is the only officially supported Bing add-on, provided by the Bing team in Microsoft. Bing is a search engine that finds and organizes the answers you need so you can make faster, more informed decisions. <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/9640?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Inline Code Finder</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/9640/1245858044" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Inline Code Finder is a tool to traverse through all elements in a web page, and when it finds a HTML element with any of these, it will highlight them: * Inline JavaScript events * Inline style * javascript: links <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/2648?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >MM3-ProxySwitch</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/2648/1233685187" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />In the Firefox Browser (and other Mozilla programs) you can per default configure only the setting for one internet connection. With the MM3-ProxySwitch you can manage different configurations and simply switch over between these. <br class="C" /></p>
<blockquote class="publisher-comment"><p>If like me you often connect to websites by proxying firefox through SSH Tunnels, then you can use this MM3-ProxySwitch add-on to run 3 different instances of firefox (by using multiple firefox profiles) that EACH use a different Proxy.  This is useful if you want to MAX out your download speed by downloading using multiple tunnels to do the work. </p>
<p>            Also useful for just plain multiple proxy configurations, very easy, and super extremely unobtrusive and low-resource intensive.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/6683?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Firecookie</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/6683/1251484013" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Firecookie is an extension for Firebug that makes possible to view and manage cookies in your browser <br class="C" /></p>
<blockquote class="publisher-comment"><p>One of my personal favorites, adds a tab to firebug that lets you view live cookies being set, deleted, and updated, and lets you edit, and delete cookies of a page LIVE.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/9780?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >RESTClient</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/9780/1250817670" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />RESTClient is a firefox extension use to visit and test RESTful/WebDav services. <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/5403?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Java Console 6.0.02</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/5403/1189002765" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Java Console Extension for Java SE 1.6.0_02 (version 6 update 2). <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/2325?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >RSS Ticker</a></h4>
<p><img src="https://addons.mozilla.org/img/default_icon.png" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title="default icon web cache" />RSS Ticker loads your Live Bookmarks and scrolls their entries across your screen while you surf. <br class="C" /></p>
<blockquote class="publisher-comment"><p>Amazingly awesome add-on that scrolls rss feeds across a small area, helpful to keep track of various feeds and your own sites feeds.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/6535?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Tab Sidebar</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/6535/1244499111" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Displays previews of your tabs in your sidebar. <br class="C" /></p>
<blockquote class="publisher-comment"><p>I like this one more than the tab preview add-ons, lets me find a tab quickly but only when I want by opening the sidebar.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/12065?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >CryptoFox</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/12065/1255638751" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />CryptoFox is an encryption/decryption tool for Mozilla Firefox, with dictionary attack support for cracking MD5 passwords. <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/9027?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Bookmark Current Tab Set</a></h4>
<p><img src="https://addons.mozilla.org/img/default_icon.png" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title="default icon web cache" />Adds options to quickly bookmark all tabs in a window and store them in a bookmark folder that is given the date (and optionally the time) as its name. <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/3362?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Update Scanner</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/3362/1252360045" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Monitors web pages for updates. Useful for websites that don&#8217;t provide Atom or RSS feeds. <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/139?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Image Zoom</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/139/1231445959" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Adds zoom functionality for images&#8230; <br class="C" /></p>
<blockquote class="publisher-comment"><p>Simple image zooming functionality.  Small and useful add-on.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/3780?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >FaviconizeTab</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/3780/1218612666" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />This extension adds a new &#8220;FaviconizeTab&#8221; option to the context menu of the tab&#8230; <br class="C" /></p>
<blockquote class="publisher-comment"><p>Nice to Faviconize your most-often-used sites</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/2489?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >CacheViewer</a></h4>
<p><img src="https://addons.mozilla.org/img/default_icon.png" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title="default icon web cache" />This extenion is GUI Front-end of &#8220;about:cache&#8221;&#8230; <br class="C" /></p>
<blockquote class="publisher-comment"><p>Just a shortcut to the about:cache area.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/6366?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >FireGestures</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/6366/1254150116" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />A customizable mouse gestures extension which enables you to execute various commands and user scripts with five types of gestures. <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/7189?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Firebug Net History Panel Overlay</a></h4>
<p><img src="https://addons.mozilla.org/img/default_icon.png" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title="default icon web cache" />Adds history functionality to firebug net panel. Requires Firebug 1.2.0b4 or 1.2.0b6 For Firebug versions 1.1.* please use Net Panel Add-on Version 0.2.1 <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/3880?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Add Bookmark Here ²</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/3880/1253393237" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Add a menuitem &#8220;Add Bookmark Here&#8230;&#8221; to Bookmarks&#8230; <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/5914?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >DNS Cache</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/5914/1246397200" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Allows you to disable and enable the DNS Cache of Firefox <br class="C" /></p>
<blockquote class="publisher-comment"><p>The final caching add-on that I absolutely LOVE.  Lets you add anywhere on your toolbar to clear the DNS cache of firefox.  I have  this, clear cache, and clear cookies next to each other on the far left of my bookmarks toolbar, I use them ALOT.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/7907?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Manage Folders</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/7907/1248060550" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Places a &#8220;Manage Folder&#8221; item on the context menu of bookmark folders, which opens the &#8220;Places Organizer&#8221; expanded to that folder. <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/2214?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >View Dependencies</a></h4>
<p><img src="https://addons.mozilla.org/img/default_icon.png" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title="default icon web cache" />View Dependencies adds a tab to the Page Info window, in which it lists all the files which were loaded to show the current page. <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/2275?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Torbutton</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/2275/1249863832" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Torbutton provides a button to securely and easily enable or disable the browser&#8217;s use of Tor. It is currently the only addon that will safely manage your Tor browsing to prevent IP address leakage, cookie leakage, and general privacy attacks. <br class="C" /></p>
<blockquote class="publisher-comment"><p>Quick way to switch firefox to use the TOR network (I recommend the free vidalia suite) which is useful for web developers that rely on an IP address in certain programming and setups.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/5447?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Tab Kit</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/5447/1249227762" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Tab grouping, vertical tab tree, multi-rows, and various tweaks for power users. <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/3559?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >QuickRestart</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/3559/1241624360" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Ever needed to restart Firefox after enabling or disabling an extension, switching to a new theme, or modifying configuration files (such as userChrome.css or user.js)? This simple extension adds a &#8220;Restart Firefox&#8221; item to the &#8220;File&#8221; menu. You can also use the Ctrl+Alt+R keyboard shortcut, or the included toolbar button. <br class="C" /></p>
<blockquote class="publisher-comment"><p>A button you can place anywhere that restarts the browser just like you do after updating add-ons.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/1759?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Organize Status Bar</a></h4>
<p><img src="https://addons.mozilla.org/img/default_icon.png" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title="default icon web cache" />This extension will enable you to organize your status bar icons.  You can now rearrange or remove any item (icon or text) in the Firefox status bar.  If your status bar is full and cluttered like mine was, give this a try. <br class="C" /></p>
<blockquote class="publisher-comment"><p>Lets you rearrange the items on the status bar.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/722?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >NoScript</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/722/1255474235" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />The best security you can get in a web browser! Allow active content to run only from sites you trust, and protect yourself against XSS and Clickjacking attacks. <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/2109?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >FEBE</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/2109/1255569901" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />FEBE (Firefox Environment Backup Extension) allows you to quickly and easily backup your Firefox extensions.  In fact, it goes beyond just backing up &#8212; It will actually rebuild your extensions individually into installable .xpi files.  Now you can easily synchronize your office and home browsers. <br class="C" /></p>
<blockquote class="publisher-comment"><p>Very helpful and well-designed add-on that lets you backup your entire firefox, or individual add-ons, or both!</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/10897?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Check Places</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/10897/1255544495" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Checks your bookmarks are valid and the pages still exist. Also checks for duplicates and for empty folders and can restore missing favicons. <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/1027?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >All-in-One Sidebar</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/1027/1248433103" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />All-in-One Sidebar (AiOS) is an award-winning sidebar control, inspired by Opera&#8217;s. It lets you quickly switch between sidebar panels, view dialog windows such as downloads, extensions, and more in the sidebar, or view source or websites in the sidebar. <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/2888?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >GMarks</a></h4>
<p><img src="https://addons.mozilla.org/img/default_icon.png" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title="default icon web cache" />GMarks helps you sync &#038; manage your bookmarks with Google Bookmarks&#8230; <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/11950?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Add-on Collector</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/11950/1252025520" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />There&#8217;s a new way to manage and find favorite add-ons. Comment, share, and sync collections, all from your browser. <br class="C" /></p>
<blockquote class="publisher-comment"><p>Lets you get updates and makes it very easy to browse a collection such as this one.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/2144?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Advanced Dork:</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/2144/1249684650" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Advanced Dork: gives quick access to Google&#8217;s Advanced Operators directly from the context menu&#8230; <br class="C" /></p>
<blockquote class="publisher-comment"><p>Very unobtrusively makes the advanced google search operators available.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/2032?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Yahoo! Toolbar</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/2032/1253720246" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Use Yahoo! and the web faster, safer, and easier with new mail notification, search suggestions, online bookmarks, free spyware scanning, and more&#8230; Save time with the new Yahoo! Toolbar 2.0, now in beta at toolbar.yahoo.com/beta. <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/3102?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Email This!</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/3102/1253158256" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Email This! will send your recipient the link, title, &#038; highlighted text of the page you are viewing using GMail, Google Apps GMail, Yahoo, and Stand-Alone Mail Clients like Outlook Express, Thunderbird, &#038; More! If you hate toolbar buttons don’t fret because I&#8217;ve included a right-click pop-up menu and access keys! <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/2062?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Tab To Window</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/2062/1244572621" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Open a tab in a new window&#8230; <br class="C" /></p>
<blockquote class="publisher-comment"><p>I have wanted this type of functionality for soo long.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/2323?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Cache View</a></h4>
<p><img src="https://addons.mozilla.org/img/default_icon.png" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title="default icon web cache" />Cache View is a Firefox extension that displays Google&#8217;s Cache, Coral&#8217;s Cache, and Wayback Machine&#8217;s Cache cache of an open tab or selected link via a right-click or the Tools menu. <br class="C" /></p>
<blockquote class="publisher-comment"><p>Useful to notice how often a page on your site is crawled and cached by these engines.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/6984?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Lazarus: Form Recovery</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/6984/1252590349" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Never lose anything you type into a web form again! Lazarus securely auto-saves all forms as you type, so after a crash, server timeout, or whatever, you can go back to the form, right click, &#8220;recover form&#8221;, and breathe a sigh of relief. <br class="C" /></p>
<blockquote class="publisher-comment"><p>Saves your form data securely as you enter it, and provides a way to recover that form data if your firefox crashes (more likely windows crashes) and that way you won&#8217;t lose anything you already entered.  This will slow down firefox alot though.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/6132?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Tab Preview</a></h4>
<p><img src="https://addons.mozilla.org/img/default_icon.png" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title="default icon web cache" />Preview tab contents on mouseover <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/6937?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Multirow Bookmarks Toolbar</a></h4>
<p><img src="https://addons.mozilla.org/img/default_icon.png" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title="default icon web cache" />Multi Row Bookmarks Toolbar.<br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/2517?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Googlepedia</a></h4>
<p><img src="https://addons.mozilla.org/img/default_icon.png" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title="default icon web cache" />Shows you a relevant Wikipedia article along with your search results. Clicking links in the article will trigger new Google searches, making it a very useful research tool&#8230; <br class="C" /></p>
<blockquote class="publisher-comment"><p>Adds wikipedia results right next to google results, very helpful to keep an eye on what is authoritative, and often get the best information fast.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/1237?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >QuickJava</a></h4>
<p><img src="https://addons.mozilla.org/img/default_icon.png" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title="default icon web cache" />Allows quick enable and disable of Java and Javascript from&#8230; <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/3082?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Undo Closed Tabs Button</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/3082/1244495823" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Tired of going to History -&gt; Recently Closed Tabs just to undo a closed tab? Then this extension is for you!  This extension allows you to undo closed tabs via a toolbar and/or tab bar button or the right-click context menu. <br class="C" /></p>
<blockquote class="publisher-comment"><p>One of my personal favorites, adds back the most recently closed tab, very helpful.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/10618?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Faviconiac Search Engines</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/10618/1247849922" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Adds PNG favicons to some search engines and web directories, such as Google, Yahoo, Bing, Ask, Altavista, Wikipedia, AOL, Dmoz, Alexa, del.icio.us and others. <br class="C" /></p>
<blockquote class="publisher-comment"><p>This is helpful to get a better feel for search engine results by adding their sites favicon to the search results page, is somewhat HTTP Request intensive however.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/3928?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Bookmark This Page Plus</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/3928/1247125860" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Adds a menu item in each sub folder of the bookmarks menu to bookmark the current page. Just as seen in the Opera browser. <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/1595?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Remove Cookie(s) for Site</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/1595/1214859152" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />A very simple extension to remove all the cookies of currently opened site. It adds an option to the Right Click menu of the page, and a toolbar button to perform this operation. It displays the status of operation in the status bar. <br class="C" /></p>
<blockquote class="publisher-comment"><p>This is invaluable, it removes all the cookies from whichever domain you are currently viewing.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/967?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Modify Headers</a></h4>
<p><img src="https://addons.mozilla.org/img/default_icon.png" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title="default icon web cache" />Add, modify and filter http request headers.  You can modify the user agent string, add headers to spoof a mobile request (e.g. x-up-calling-line-id) and much more.  Take a look at the help tab of the Modify Headers window&#8230; <br class="C" /></p>
<blockquote class="publisher-comment"><p>Pretty awesome, lets you modify the HTTP Headers your browser is sending, useful to check accessibility, server settings, language settings, etc.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/2625?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >OPML Support</a></h4>
<p><img src="https://addons.mozilla.org/img/default_icon.png" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title="default icon web cache" />OPML Support adds OPML import/export functionality to the Firefox Bookmarks manager. <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/6647?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >HttpFox</a></h4>
<p><img src="https://addons.mozilla.org/img/default_icon.png" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title="default icon web cache" />An HTTP analyzer addon for Firefox <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/8879?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >FoxTab</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/8879/1249840764" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />3D in your browser!  FoxTab brings innovative 3D functionality to your Firefox. <br class="C" /></p>
<blockquote class="publisher-comment"><p>Super awesome cool.  If your machine is fast this is a really helpful add-on.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/655?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >View Source Chart</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/655/1246405984" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />View Source In Color-Coded Chart Get V2.8 w/ a brand new feature from jennifermadden.com <br class="C" /></p>
<blockquote class="publisher-comment"><p>One of my long-time, all-time favorites that lets you view the source code of a website, but in a color-coded and formatted view.  Very nice and helpful for (X)HTML developers.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/4072?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Smart Bookmarks Bar</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/4072/1234555016" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Not enough place on your bookmarks bar ?&#8230; Smart Bookmarks Bar extension comes right here by hiding bookmarks names and only showing icons. Bookmark names will be displayed on mouse over. <br class="C" /></p>
<blockquote class="publisher-comment"><p>For those who frequently use the bookmarks in the firefox bookmarks toolbar, this is a great way to show more in a cleaner way.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/1433?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Extended Statusbar</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/1433/1246438548" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />A Statusbar with speed, percentage, time and loaded size (similar to Opera&#8217;s one) <br class="C" /></p>
<blockquote class="publisher-comment"><p>Provides much more information unobtrusively on your statusbar, very cool!</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/10300?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Email Yourself!</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/10300/1253228434" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Email Yourself! allows you to email yourself the link, title, and a selected summary of the webpage you are viewing using GMail. <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/125?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >SwitchProxy Tool</a></h4>
<p><img src="https://addons.mozilla.org/img/default_icon.png" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title="default icon web cache" />SwitchProxy lets you manage and switch between multiple proxy configurations&#8230; <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/2499?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >LiveClick</a></h4>
<p><img src="https://addons.mozilla.org/img/default_icon.png" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title="default icon web cache" />Adds feed reading, notifications, favicons, and other enhancements to Live Bookmarks. <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/7314?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Places&#8217; Tooltips</a></h4>
<p><img src="https://addons.mozilla.org/img/default_icon.png" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title="default icon web cache" />This addon enhances all the tooltips in Firefox. <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/11173?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Multi Smart Search</a></h4>
<p><img src="https://addons.mozilla.org/img/default_icon.png" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title="default icon web cache" />&#8220;Multi smart search&#8221; displays a new context menu including all the installed search engine. <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/9275?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >SortPlaces</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/9275/1252087512" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Sorts your bookmarks in a variety of ways. <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/433?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Flashblock</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/433/1247913103" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Never be annoyed by a Flash animation again! Blocks Flash so it won&#8217;t get in your way, but if you want to see it, just click on&#8230; <br class="C" /></p>
<blockquote class="publisher-comment"><p>Lets you block flash for all/specific websites/domains, which is pretty nice capability to test both your sites for non-flash viewers, and speeds up firefox.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/6249?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Google Toolbar</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/6249/1237314369" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Take the power of Google with you anywhere on the Web <br class="C" /></p>
<blockquote class="publisher-comment"><p>A great add-on that lets you use hundreds of google tricks and tools.  Very helpful but also makes a lot of background HTTP requests so privacy-conscious or speed-freaks will want it disabled.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/6622?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >DOM Inspector</a></h4>
<p><img src="https://addons.mozilla.org/img/default_icon.png" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title="default icon web cache" />DOM Inspector is a tool that can be used to inspect and edit the live DOM of any web document or XUL application. The DOM hierarchy can be navigated using a two-paned window that allows for a variety of different views on the document and all nodes within. Note:  This add-on depends on binary changes to Firefox, and will not work with Firefox 2. <br class="C" /></p>
<blockquote class="publisher-comment"><p>Way to inspect the DOM of a page, useful for web developers.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/6459?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Stay-Open Menu</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/6459/1250004873" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Enables multiple selections from Bookmarks Menu,  History Menu, or Smart Location Bar (awesomebar)  dropdown list, without reopening menu or using sidebar. <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/710?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Menu Editor</a></h4>
<p><img src="https://addons.mozilla.org/img/default_icon.png" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title="default icon web cache" />Customize application menus: Rearrange or remove menuitems from the main context menu (right-click menu) and main menubar (File Edit View etc.) <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/4838?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Multiple Tab Handler</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/4838/1251873082" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Provides feature to close multiple tabs. <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/1815?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Console²</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/1815/1246698544" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Console² (pronounced Console Squared or Console Two) replaces the JavaScript Console with what could be the next generation Error Console. From v0.5 includes the Console Filter extension previously available separately from the Console² website. <br class="C" /></p>
<blockquote class="publisher-comment"><p>An advanced java script console.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/6271?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Bookmark Previews</a></h4>
<p><img src="https://addons.mozilla.org/img/default_icon.png" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title="default icon web cache" />Bookmark Previews adds an album view and thumbnail view to the bookmarks manager. <br class="C" /></p>
<blockquote class="publisher-comment"><p>Now this one is what I call genius.  Lets you view previews of your bookmarks!  Great if like me you have over a thousand bookmarks.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/8542?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >LastPass Password Manager</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/8542/1252161868" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />LastPass is a free online password manager and Form Filler that makes your web browsing easier and more secure.   LastPass supports IE and Firefox as Plugins (Opera, Safari, Chrome, iPhone, Opera Mini via Bookmarklets), allows you to import from every major password storage vendor and export too, captures passwords that other managers won&#8217;t including many AJAX forms, and allows you to make strong passwords easily.  Your sensitive data is encrypted _locally_ before upload so even LastPass cannot get access to it.  One Time Passwords &#038; Screen Keyboard help protect your master password. <br class="C" /></p>
<blockquote class="publisher-comment"><p>What can I say, this add-on is in my top 10 for sure, and I recommend it to all my friends and even my family.  Lets me create very secure passwords for sites that I don&#8217;t have to remember because lastpass remembers them for me, and stores them encrypted on both a usb medium I keep, and on their servers.  So when I use someone elses computer or reinstall firefox, I have all my usernames and passwords, and its just sooooooooooooooooo useful.  Get this add-on, it truly is a secure way to only have to remember 1 password from now on, thus LastPass.  The last password you need.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/1956?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Tabs Open Relative</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/1956/1211284492" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Tabs Open Relative makes all new tabs open to the right of the current tab, rather than at the far right of the tab bar (optionally this only applies to links). <br class="C" /></p>
<blockquote class="publisher-comment"><p>This stops that annoying default of opening tabs wayy on the right.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/10909?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Coral IE Tab</a></h4>
<p> <img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/10909/1255054707" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />An enhanced version of IE Tab which enables you to use the embedded IE engine within tabs of Mozilla Firefox. It supports Adblock Plus in IE, and can sync cookies between IE and Firefox. <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/966?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Tamper Data</a></h4>
<p><img src="https://addons.mozilla.org/img/default_icon.png" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title="default icon web cache" />Use tamperdata to view and modify HTTP/HTTPS headers and post parameters&#8230; <br class="C" /></p>
<blockquote class="publisher-comment"><p>Useful for checking form validation and security, lets you tamper data! lol</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/5369?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >YSlow</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/5369/1253220367" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />YSlow analyzes web pages and why they&#8217;re slow based on Yahoo!&#8217;s rules for high performance web sites. YSlow uses Yahoo!&#8217;s Smush.it service, which is subject to Smush.it Terms of Use: http://info.yahoo.com/legal/us/yahoo/smush_it/smush_it-4378.html <br class="C" /></p>
<blockquote class="publisher-comment"><p>One of the top 3 most important and helpful add-ons for firefox.  Web Developers who don&#8217;t use this one are simply irresponsible.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/539?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >MeasureIt</a></h4>
<p><img src="https://addons.mozilla.org/img/default_icon.png" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title="default icon web cache" />Draw out a ruler to get the pixel width and height of any elements on a&#8230; <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/271?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >ColorZilla</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/271/1234546689" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Advanced Eyedropper, ColorPicker, Page Zoomer and other colorful goodies&#8230; <br class="C" /></p>
<blockquote class="publisher-comment"><p>A must-have add-on for anyone using CSS or developing websites, very amazing, highly capable add-on.  The one issue is that is is somewhat of a resource-hog.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/748?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Greasemonkey</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/748/1253968926" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Allows you to customize the way a webpage displays using small bits of JavaScript. &#8230; <br class="C" /></p>
<blockquote class="publisher-comment"><p>Lets you use user-contributed javascripts (or your own of course) that modifies the behavior and/or appearance of many different websites.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/684?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >FireFTP</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/684/1254121244" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />FireFTP is a free, secure, cross-platform FTP client for Mozilla Firefox which provides easy and intuitive access to FTP servers. <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/7943?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Pixel Perfect</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/7943/1254757574" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Pixel Perfect is a Firefox/Firebug extension that allows web developers and designers to easily overlay a web composition over top of the developed HTML. * Requires Firebug <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/60?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Web Developer</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/60/1252695377" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />The Web Developer extension adds a menu and a toolbar with various web developer tools. <br class="C" /></p>
<blockquote class="publisher-comment"><p>This add-on is 1 of the top 2 most important add-ons for web developers.  The other is firebug.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/1843?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Firebug</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/1843/1254249333" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Firebug integrates with Firefox to put a wealth of development tools at your fingertips while you browse. You can edit, debug, and monitor CSS, HTML, and JavaScript live in any web page&#8230; Firebug 1.4 requires Firefox 3.0 or higher. <br class="C" /></p>
<blockquote class="publisher-comment"><p>By far, without a doubt, the single most important and valuable add on for ANY web developer.  This is the one that is definitely required.  The features are too numerous to name here.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/3829?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Live HTTP Headers</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/3829/1245295166" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />View HTTP headers of a page and while&#8230; <br class="C" /></p>
<blockquote class="publisher-comment"><p>Very helpful for those that don&#8217;t have and use wireshark.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/2464?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >FoxyProxy</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/2464/1254948830" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />FoxyProxy is an advanced proxy management tool that completely replaces Firefox&#8217;s limited proxying capabilities. It offers more features than SwitchProxy, ProxyButton, QuickProxy, xyzproxy, ProxyTex, TorButton, etc. <br class="C" /></p>
<blockquote class="publisher-comment"><p>The most complete proxifying tool for firefox, multiple configurations possible.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/321?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >SearchStatus</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/321/1254725500" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Display the Google PageRank, Alexa rank, Compete ranking and SEOmoz Linkscape mozRank anywhere in your browser, along with fast keyword density analyser, keyword/nofollow highlighting, backward/related links, Alexa info and more. <br class="C" /></p>
<blockquote class="publisher-comment"><p>Adds a very unobtrusive way to check the pagerank, and several other SEO statistics but only when you click a button (if configured that way) very helpful occasionally.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/201?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >DownThemAll!</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/201/1253178038" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />The first and only download manager/accelerator built inside Firefox! <br class="C" /></p>
<blockquote class="publisher-comment"><p>Very nice, easy, fast, and unobtrusive add-on that lets you download all files of a certain type to a certain save location, lets you use builtin filters or configure your own using basic REGEX.  Very helpful.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/1801?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Clear Cache Button</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/1801/1248704772" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Adds a clear cache toolbar button. After installing the extension, find the clear cache button in the toolbar customization&#8230; <br class="C" /></p>
<blockquote class="publisher-comment"><p>A button you can add to your toolbar that clears your firefox cache (not cookies or history) which is invaluable for web developers.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/12006?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Wolfram Alpha Google</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/12006/1254285310" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Display Wolfram Alpha results in Google searches. No need to switch search engines when you can use both at once! <br class="C" /></p>
<blockquote class="publisher-comment"><p>The new search is a glimpse at the future of computing.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/3895?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Personal Menu</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/3895/1253278678" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />&#8220;Menus Toolbar&#8221; item is now available in Toolbar Context Menu and you may hide it forever! <br class="C" /></p>
<blockquote class="publisher-comment"><p>Lets you go beyond firefox builtin menu editing and create a custom toolbar.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/7613?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Jiffy</a></h4>
<p><img src="https://addons.mozilla.org/img/default_icon.png" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title="default icon web cache" />Adds a new panel to Firebug for displaying timing measurements for JavaScript applications. <br class="C" /></p>
<blockquote class="publisher-comment"><p>Adds the ability to time or profile your javascript, I usually leave disabled.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/9603?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >FireRainbow</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/9603/1248403194" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Javascript syntax highlighting for Firebug 1.3+ <br class="C" /></p>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/7684?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >Fire.fm</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/7684/1254412991" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />Fire.fm gives you access to the extensive music library on Last.fm. Last.fm gives free radio to the US, UK, and Germany, plus subscriber-based service to the rest of the world. Listen to your favorite music and discover new artists in the process. <br class="C" /></p>
<blockquote class="publisher-comment"><p>What would work be without free streaming music that is customizable and recommends music based on your history.  Conveniently can be added to your status bar, or your toolbar.</p>
</blockquote>
</div>
<hr class="C" />
<div class="item-info">
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/138?collection_uuid=2f6fd413%26%2345%3B1146%26%2345%3Bad49%26%2345%3B1cca%26%2345%3B84102bff60fb" rel="nofollow" >StumbleUpon</a></h4>
<p><img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/138/1248392473" alt="Firefox Add ons for Web Developers" height="32" width="32" class="IFL" title=" web cache" />StumbleUpon discovers web sites based on your interests, learns what you like and brings you more. <br class="C" /></p>
<blockquote class="publisher-comment"><p>StumbleUpon is great.  Very cool way to see relevant and interesting web development articles and sites.</p>
</blockquote>
</div>
<hr class="C" />
<p><a href="http://www.askapache.com/firefox/best-firefox-addons-webdev.html"></a><a href="http://www.askapache.com/firefox/best-firefox-addons-webdev.html">Firefox Add-ons for Web Developers</a> originally appeared on <cite>AskApache.com</cite> </p>]]></content:encoded>
			<wfw:commentRss>http://www.askapache.com/firefox/best-firefox-addons-webdev.html/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Optimizing Servers and Processes for Speed with ionice, nice, ulimit</title>
		<link>http://www.askapache.com/linux-unix/optimize-nice-ionice.html</link>
		<comments>http://www.askapache.com/linux-unix/optimize-nice-ionice.html#comments</comments>
		<pubDate>Sat, 10 Oct 2009 05:41:28 +0000</pubDate>
		<dc:creator>AskApache</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Cache]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[Linux Unix BSD]]></category>
		<category><![CDATA[Review]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Server Administration]]></category>
		<category><![CDATA[Shell Scripting]]></category>
		<category><![CDATA[Web Hosting]]></category>
		<category><![CDATA[Webmaster]]></category>
		<category><![CDATA[503]]></category>
		<category><![CDATA[Advanced]]></category>
		<category><![CDATA[askapache]]></category>
		<category><![CDATA[Backups]]></category>
		<category><![CDATA[Bandwidth]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[Blocking]]></category>
		<category><![CDATA[Boot]]></category>
		<category><![CDATA[Bottleneck]]></category>
		<category><![CDATA[caching]]></category>
		<category><![CDATA[compression]]></category>
		<category><![CDATA[CPU]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[curl]]></category>
		<category><![CDATA[Disk IO]]></category>
		<category><![CDATA[DNS]]></category>
		<category><![CDATA[Examples]]></category>
		<category><![CDATA[feed]]></category>
		<category><![CDATA[fifo]]></category>
		<category><![CDATA[GET]]></category>
		<category><![CDATA[httpd]]></category>
		<category><![CDATA[ionice]]></category>
		<category><![CDATA[iostat]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[Nice]]></category>
		<category><![CDATA[Optimization]]></category>
		<category><![CDATA[pagefile]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Port]]></category>
		<category><![CDATA[ram]]></category>
		<category><![CDATA[Renice]]></category>
		<category><![CDATA[Round Robin]]></category>
		<category><![CDATA[rsync]]></category>
		<category><![CDATA[Scripts]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[servers]]></category>
		<category><![CDATA[Shell]]></category>
		<category><![CDATA[shell script]]></category>
		<category><![CDATA[Socket]]></category>
		<category><![CDATA[SPEED]]></category>
		<category><![CDATA[SSH]]></category>
		<category><![CDATA[SSI]]></category>
		<category><![CDATA[stat]]></category>
		<category><![CDATA[taskset]]></category>
		<category><![CDATA[trick]]></category>
		<category><![CDATA[Ulimit]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[wp-config.php]]></category>

		<guid isPermaLink="false">http://www.askapache.com/?p=3167</guid>
		<description><![CDATA[<p><a href="http://www.askapache.com/linux-unix/optimize-nice-ionice.html" class="IFL" id="id18"></a>To prepare for several upcoming articles on AskApache that are focused on optimizing Servers and Sites from a server admin level, here is an article to introduce the main tools that we will be using.  These tools are used to optimize CPU time for each process using <strong>nice</strong> and <strong>renice</strong>, and other tools like <strong>ionice</strong> are used to optimize the Disk IO, or Disk speed / Disk traffic for each process.  Then you can make sure your mysqld and httpd processes are always fast and prioritized.<br class="C" /></p> ]]></description>
			<content:encoded><![CDATA[<p>Ok, sup.  I really felt I had to get this out of the way, because I have a whole stack of drafts waiting to be published, but I realized that not many people will benefit from all the advanced optimizations and tricks I&#8217;m writing unless they get a basic understanding of some of the tools I&#8217;m using.  I decided to write a series of articles explaining how I optimize servers for speed because lately I&#8217;ve been getting a lot more people wanting to hire me to do that.  I take on projects when I can but there is clearly a need out here on the net for some self-help.   The momentum is swinging more and more towards VPS type of web hosting, and I would say that 99% of those customers are getting supremely ripped off, which goes against the foundation of the web.</p>
<p>Keep in mind that this blog and my research is only a hobby of mine, my job is primarily marketing and sales, so I&#8217;m not some licensed expert or anything, or even an unlicensed expert! haha.  But it does bother me that those who are tech-savvy enough to run web-hosting companies are happily ripping people off.  So this article details the main tools that are used to speed up and optimize your machine by delegating levels of priority to specific processes.  Future articles will use these tools alot, so this is meant as an intro.</p>
<p><a id="cpu-disk-io" name="cpu-disk-io"></a></p>
<h2>CPU and Disk I/O</h2>
<p>As most of you are aware, there are 2 variables that determine any computer or programs speed.  CPU and Disk I/O.  CPU determines how fast you can process data, crunch numbers, etc. while disk I/O determines how fast your disks can read and write data to the hard-drive.  Wouldn&#8217;t it be great if you could easily configure your server to give your httpd, php, and other processes both greater CPU processing and disk IO than your non-important processes like backup scripts, ftp daemons, etc.?  We are talking about Linux in this article, so of course YES not only can you do that, you should!</p>
<p><a name="optimize-ram" id="optimize-ram"></a></p>
<h3>RAM</h3>
<p>RAM is like a hard-drive in that data is stored on it, and read/written to it.  The difference is that RAM is somewhere around 30x faster than disk I/O, but the cost of that incredible speed is that the data stored on it is only temporary in the sense that it won&#8217;t be stored permanently, it is completely erased when your machine is rebooted.  RAM is also expensive, and there is a limit to how much a server or machine can have due to hardware limits.</p>
<p><a name="optimize-swap" id="optimize-swap"></a></p>
<h3>SWAP</h3>
<p>SWAP takes off when you run out of RAM but you still want certain data to be read/write quickly.  Basically when you start running out of RAM your machine starts supplementing RAM with SWAP storage.  SWAP is usually a partition on a second hard-drive disk.  There is an upper limit on how much I/O can occur on a disk at one time, and the more I/O takes place, the slower all I/O becomes, so SWAP works well on a separate hard-drive as it will have much faster I/O.  On Windows they opted to copy the SWAP mechanism but instead use a file named pagefile.sys, and that is just one reason people in the know do not care for Windows.</p>
<p><a name="optimize-cpu" id="optimize-cpu"></a></p>
<h3>CPU</h3>
<p>So lets do this, think of your CPU (your processor) as having an amount of 100% processing available when not being used, 0% when its maxed out.  CPU&#8217;s handle multiple processing tasks simultaneously, so what we will discuss in this article is how to specify HOW MUCH of that processing amount each of your programs (heretofore &#8220;processes&#8221;) are able to use.  Yes, very very cool.</p>
<p>That is correct, you can easily configure your server to provide more of the available processing time to certain programs over others, like you can configure apache and php to utilize 50% of your CPU processing time by themselves, so that all other processes (proftpd, sshd, rsync, etc.) combined can only utilize 50%.  The terminology is we can give certain specific processes (like php.cgi, httpd, fast-cgi.cgi) a specific <strong>priority</strong>, where -19 is the most priority, and +19 is the least amount of priority, or CPU processing time.  I know it seems backwards.. </p>
<p><a id="tools" name="tools"></a></p>
<h2>The Tools</h2>
<p>If you run Windows, you are in the right place&#8230; because the following advice will save your life:  GET LINUX! Ok, now that that is out of the way, the following are the tools dicussed on this page.  All of them are free, open-source, and wonderful.  The basic idea of these tools is to control how much CPU is devoted to each process, and also how much Disk IO/Disk traffic is given to each process.</p>
<dl>
<dt><a href="#nice-tool" rel="nofollow" >nice</a></dt>
<dd>run a program with modified scheduling priority</dd>
<dt><a href="#renice-tool" rel="nofollow" >renice</a></dt>
<dd>alter priority of running processes</dd>
<dt><a href="#ionice-tool" rel="nofollow" >ionice</a></dt>
<dd>set or retrieve the I/O priority for a given pid or execute a new task with a given I/O priority.</dd>
<dt><a href="#iostat-tool" rel="nofollow" >iostat</a></dt>
<dd>Report Central Processing Unit (CPU) statistics and input/output statistics for devices and partitions.</dd>
<dt><a href="#ulimit-tool" rel="nofollow" >ulimit</a></dt>
<dd>Ulimit provides control over the resources available to processes started by the shell, on systems that allow such control.</dd>
<dt><a href="#chrt-tool" rel="nofollow" >chrt</a></dt>
<dd>set or retrieve real-time scheduling parameters for a given pid or execute a new task under given scheduling parameters.</dd>
<dt><a href="#taskset-tool" rel="nofollow" >taskset</a></dt>
<dd>set or retrieve task CPU affinity for a given pid or execute a new task under a given affinity mask.</dd>
<dt></dt>
<dd></dd>
</dl>
<p><a id="part1-processes" name="part1-processes"></a></p>
<h2>Part 1: Process Processes Faster</h2>
<p>Ok so lets tackle figuring out how to give your response-intensive processes (like apache, php, ruby, perl, java) meaning a request to your server/machine requires a <em>response</em>.  For instance, when you requested this page that you are reading at this very second, several things on my server had to happen for you to be able to read this.</p>
<p>First your computer sends out a request to see what server the www.askapache.com domain name is.  DNS servers respond with my server IP, so for servers dedicated as nameservers, optimizing the DNS processes like bind would speed that up.  Now that your computer knows how to reach my server it sends an HTTP GET request for this url.  This request is received by the httpd process that is apache, and apache determines this url should be handled by my custom compiled php5.3.0 binary, because this page is WordPress generated.  So the php binary loads up the WordPress /index.php file, which chain-loads several other php files, including <code>wp-config.php</code> containing my MySql database settings.  Now php connects to my MySql Server to fetch this articles content, comments, title, tags, etc. and then generates the HTML and hands that back to Apache.</p>
<p>Finally, Apache generates a HTTP RESPONSE and sends the RESPONSE and CONTENT back to your Browser, which then in turn renders the page for your eyes with the necessary javascript, images, css, and other files included in the HTML response.</p>
<h3>Too much Processing</h3>
<p>Now you see why I&#8217;ve opted to write my own caching plugin that takes the php and mysql processes OUT of that equation.  Both the php binary and the mysql instance consume CPU processing, and disk IO, to load all their library files, make various network requests and sockets, check permissions, and on and on.  And that&#8217;s completely ok, the thing is, unless you configure these processes (Apache, PHP, MySQL) they will use the same amount of CPU processing that other processes use, other processes that have very little to do with you reading this sentence.  Processes to run my mail server, my FTP server, my SSH server, my cronjobs, cleanup scripts, atd daemon, etc.. and they will get the same amount of CPU!</p>
<p>Another even simpler example is what got me to look into this myself.  I wrote a shell script that created hourly, daily, weekly, and monthly backups for all of my websites and sql databases, and set it up to run by cronjob at those set intervals.  Eventually I noticed my sites were slower, my php even slower, and sometimes I even saw 503 errors that my host throws up when my server is overloaded.  The research that I pursued to prevent that from happening has been hugely eye-opening.  What does a backup script do?  Mine just created tar archives of all the files in my web root, then gzipped the tar archive saving to a backup server using scp (a file transfer using ssh).  This resulted in the following huge problems that seem to have nothing to do with a faster server and speedier website, but they have everything to with it.</p>
<ol>
<li><strong>CPU Bottleneck #1</strong> &#8211; tar and gzip use compression algorithms at a low level to create a compressed version, and all that compressing uses a whole lot of crunching &#8211; CPU processing</li>
<li><strong>DISK IO Bottleneck</strong> &#8211; Tarring the whole web root directory was creating a ton of disk io, and remember the more disk io that is going on, the less is available for everything else.</li>
<li><strong>CPU Bottleneck #2</strong> &#8211; Using scp to send my backups was security-smart, but these huge archive files had to be encrypted and sent over the net.</li>
</ol>
<p><a id="breaking-bottlenecks" name="breaking-bottlenecks"></a></p>
<h2>Breaking Bottles</h2>
<p>I apologize for being a little long-winded there, but I think it&#8217;s important to make sure everyone understands those basic concepts, which are foreign to most people.  Once you understand what is causing the bottlenecks, then you can understand the solutions, which actually are incredibly simple and even a novice linux user can easily do.  Besides, the net gets a little bit faster every time someone implements this.</p>
<p><a id="nice-tool" name="nice-tool"></a></p>
<h3>nice</h3>
<p><img src="http://uploads.askapache.com/2009/10/nice-chart.png" alt="NICE Levels Chart" title="NICE Levels Chart" width="351" height="225" class="IFL" />Nice allows you to run a program with modified scheduling priority which specifies how much CPU is devoted to a particular process.  Run COMMAND with an adjusted niceness, which affects process scheduling.  With no COMMAND, print the current niceness.  </p>
<p>Nicenesses range from -20 (most favorable scheduling) to 19 (least favorable).   <code>-n, --adjustment=N</code> &#8211;  add integer N to the niceness (default 10).   <code>nice +19</code> tasks get a HZ-independent 1.5%.  Running a <code>nice +10</code> and a <code>nice +11</code> task means the first will get 55% of the CPU, the other 45%.<br class="C" /></p>
<p><a id="nice-usage" name="nice-usage"></a></p>
<h4>nice usage</h4>
<pre>nice [OPTION] [COMMAND [ARG]&#46;..]
&nbsp;
-n, &#45;-adjustment=ADJUST   increment priority by ADJUST first</pre>
<p><a id="nice-examples" name="nice-examples"></a></p>
<h4>Examples of nice</h4>
<p>Using nice to download a file</p>
<pre>nice -n 17 curl -q -v -A &#039;Mozilla/5.0&#039; -L -O http://wordpress.org/latest.zip</pre>
<p>Unzipping a file with nice</p>
<pre>nice -n 17 unzip latest.zip</pre>
<p>Nice way to build from source</p>
<pre>nice -n 2 ./configure
nice -n 2 make
nice -n 2 make install</pre>
<p>It is sometimes useful to run non-interactive programs with reduced priority.</p>
<pre>$ nice factor `echo &#039;2^9 - 1&#039;|bc`
511: 7 73</pre>
<p>Since nice prints the current priority, we can invoke it through itself to demonstrate how it works: The default behavior is to reduce priority by 10.</p>
<pre> $ nice nice
10
$ nice -n 10 nice
10</pre>
<p> The ADJUSTMENT is relative to the current priority.  The first <code>nice</code> invocation runs the second one at priority 10, and it in turn runs the final one at a priority lowered by 3 more.</p>
<pre>$ nice nice -n 3 nice
13</pre>
<p>Specifying a priority larger than 19 is the same as specifying 19.</p>
<pre>$ nice -n 30 nice
19</pre>
<p>Only a privileged user may run a process with higher priority.</p>
<pre>$ nice -n -1 nice
nice: cannot set priority: Permission denied
$ sudo nice -n -1 nice
-1</pre>
<blockquote cite="http://uploads.askapache.com/2009/08/sched-nice-design.txt">
<p>The new scheduler in v2.6.23 addresses all three types of complaints:</p>
<p>To address the first complaint (of nice levels being not &#8220;punchy&#8221; enough), the scheduler was decoupled from &#8216;time slice&#8217; and HZ concepts (and granularity was made a separate concept from nice levels) and thus it was possible to implement better and more consistent nice +19 support: with the new scheduler nice +19 tasks get a HZ-independent 1.5%, instead of the variable 3%-5%-9% range they got in the old scheduler.</p>
<p>To address the second complaint (of nice levels not being consistent), the new scheduler makes nice(1) have the same CPU utilization effect on tasks, regardless of their absolute nice levels. So on the new scheduler, running a nice +10 and a nice 11 task has the same CPU utilization &#8220;split&#8221; between them as running a nice -5 and a nice -4 task. (one will get 55% of the CPU, the other 45%.) That is why nice levels were changed to be &#8220;multiplicative&#8221; (or exponential) &#8211; that way it does not matter which nice level you start out from, the &#8216;relative result&#8217; will always be the same.</p>
<p>The third complaint (of negative nice levels not being &#8220;punchy&#8221; enough and forcing audio apps to run under the more dangerous SCHED_FIFO scheduling policy) is addressed by the new scheduler almost automatically: stronger negative nice levels are an automatic side-effect of the recalibrated dynamic range of nice levels.</p>
</blockquote>
<p><a id="renice-tool" name="renice-tool"></a></p>
<h3>renice</h3>
<p>Renice is similar to the nice command, but it lets you modify the nice of a currently running process.  This is nice for shell scripts where you can add this to the top of the script to nicify the whole script to 19.</p>
<p><a id="renice-usage" name="renice-usage"></a></p>
<h4>renice usage</h4>
<pre>renice priority [ [ -p ] pids ] [ [ -g ] pgrps ] [ [ -u ] users ]
&nbsp;
-g      Force who parameters to be interpreted as process group ID&#039;s.
-u      Force the who parameters to be interpreted as user names.
-p      Resets the who interpretation to be (the default) process ID&#039;s.</pre>
<p><a id="renice-examples" name="renice-examples"></a></p>
<h4>Examples of renice</h4>
<p>From the shell, changes the priority of the shell and all children to 19.  From a shell script, does the same but only for the script and its children.</p>
<pre>renice 19 -p $$</pre>
<p>This runs renice without any output</p>
<pre>renice 19 -p $$ &amp;&gt;/dev/null</pre>
<p>10 gets more CPU than 19</p>
<pre>renice 10 -p $$</pre>
<p>change the priority of process ID&#8217;s 987 and 32, and all processes owned by users daemon and root.</p>
<pre>renice +1 987 -u daemon root -p 32</pre>
<p><a id="part2-disk-io" name="part2-disk-io"></a></p>
<h2>Part 2: Optimizing Disk I/O</h2>
<p><a id="scheduling-policies" name="scheduling-policies"></a></p>
<h3>Linux Scheduling Policies</h3>
<p>The scheduler is the kernel component that decides which runnable process will be executed by the CPU next.  Each process has an associated scheduling policy and a static scheduling priority, sched_priority</p>
<p>Processes scheduled under one of the real-time policies (SCHED_FIFO, SCHED_RR) have a sched_priority value in the <strong>range 1 (low) to 99 (high)</strong>.  (As the numbers imply, real-time processes always have higher priority than normal processes.)   The following &#8220;real-time&#8221; policies are also supported, for special time-critical applications that need precise control over the way in which runnable processes are selected for execution:</p>
<p>Currently, Linux supports the following &#8220;normal&#8221; (i.e., non-real-time) scheduling policies:</p>
<dl>
<dt><strong>SCHED_OTHER</strong>: Default Linux time-sharing scheduling</dt>
<dd>The standard round-robin time-sharing policy</dd>
<dt><strong>SCHED_BATCH</strong>: Scheduling batch processes</dt>
<dd>This policy is useful for workloads that are non-interactive, but do not want to lower their nice value, and for workloads that want a deterministic scheduling policy without interactivity causing extra preemptions (between the workload&#8217;s tasks).</dd>
<dt><strong>SCHED_IDLE</strong>: Scheduling very low priority jobs</dt>
<dd>This policy is intended for running jobs at extremely low priority (lower even than a +19 nice value with the SCHED_OTHER or SCHED_BATCH policies)</dd>
<dt><strong>SCHED_FIFO</strong>: First In-First Out scheduling</dt>
<dd>A first-in, first-out policy</dd>
<dt><strong>SCHED_RR</strong>: Round Robin scheduling</dt>
<dd>A round-robin policy.</dd>
</dl>
<p><a id="scheduling-classes" name="scheduling-classes"></a></p>
<h3>Scheduling Classes</h3>
<dl>
<dt><code>IOPRIO_CLASS_RT</code></dt>
<dd>This is the realtime io class. The RT scheduling class is given first access to the disk, regardless of what else is going on in the system. Thus the RT class needs to be used with some care, as it can starve other processes. As with the best effort class, 8 priority levels are defined denoting how big a time slice a given process will receive on each scheduling window.  This scheduling class is given higher priority than any other in the system, processes from this class are given first access to the disk every time. Thus it needs to be used with some care, one io RT process can starve the entire system. Within the RT class, there are 8 levels of class data that determine exactly how much time this process needs the disk for on each service. In the future this might change to be more directly mappable to performance, by passing in a wanted data rate instead.</dd>
<dt><code>IOPRIO_CLASS_BE</code></dt>
<dd>This is the best-effort scheduling class, which is the default for any process that hasn&#8217;t set a specific io priority. This is the default scheduling class for any process that hasn&#8217;t asked for a specific io priority. Programs inherit the CPU nice setting for io priorities. This class takes a priority argument from 0-7, with lower number being higher priority. Programs running at the same best effort priority are served in a round-robin fashion.  The class data determines how much io bandwidth the process will get, it&#8217;s directly mappable to the cpu nice levels just more coarsely implemented. 0 is the highest BE prio level, 7 is the lowest. The mapping between cpu nice level and io nice level is determined as: io_nice = (cpu_nice + 20) / 5.</dd>
<dt><code>IOPRIO_CLASS_IDLE</code></dt>
<dd>This is the idle scheduling class, processes running at this level only get io time when no one else needs the disk. A program running with idle io priority will only get disk time when no other program has asked for disk io for a defined grace period. The impact of idle io processes on normal system activity should be zero. This scheduling class does not take a priority argument.    The idle class has no class data, since it doesn&#8217;t really apply here.</dd>
</dl>
<p><a id="ionice-tool" name="ionice-tool"></a></p>
<h3>ionice</h3>
<p>ionice &#8211; get/set program io scheduling class and priority.  This program sets the io scheduling class and priority for a program.  Since v3 (aka CFQ Time Sliced) CFQ implements I/O nice levels similar to those of CPU scheduling. These nice levels are grouped in three scheduling classes each one containing one or more priority levels:</p>
<p><a id="ionice-usage" name="ionice-usage"></a></p>
<h4>ionice usage</h4>
<p>If no arguments or just -p is given, ionice will query the current io scheduling class and priority for that process.</p>
<pre>ionice [-c] [-n] [-p] [COMMAND [ARG&#46;..]]</pre>
<ul>
<li><strong>-c</strong> &#8211; The scheduling class. 1 for real time, 2 for best-effort, 3 for idle.</li>
<li><strong>-n</strong> &#8211; The scheduling class data. This defines the class data, if the class accepts an argument. For real time and best-effort, 0-7 is valid data.</li>
<li><strong>-p</strong> &#8211; Pass in a process pid to change an already running process. If this argument is not given, ionice will run the listed program with the given parameters.</li>
</ul>
<p><a id="ionice-examples" name="ionice-examples"></a></p>
<h4>ionice Examples</h4>
<p>Sets process with PID 89 as an idle io process.</p>
<pre>ionice -c3 -p89</pre>
<p>Runs &#8216;bash&#8217; as a best-effort program with highest priority.</p>
<pre>ionice -c2 -n0 bash</pre>
<p>Returns the class and priority of the process with PID 89</p>
<pre>ionice -p89</pre>
<blockquote cite="http://gaarai.com/2009/03/06/multitasking-from-the-linux-command-line-plus-process-prioritization/">
<p>
<p>With the ionice command, you can set the IO priority for a process to one of three classes: Idle (3), Best Effort (2), and Real Time (1). The Idle class means that the process will only be able to read and write to the disk when all other processes are not using the disk. The Best Effort class is the default and has eight different priority levels from 0 (top priority) to 7 (lowest priority). The Real Time class results in the process having first access to the disk irregardless of other process and should never be used unless you know what you are doing.</p>
<p>If we wish to run the updatedb process in the background with an Idle IO class priority, we can run the following:</p>
<pre>$ sudo date
$ sudo updatedb &amp;
[1] 16324
$ sudo ionice -c3 -p16324</pre>
<p>If we’d rather just lower the Best Effort class priority (defaults to 4) for the command so the process isn’t limited to idle IO periods, we can run the following:</p>
<pre>$ sudo date
$ sudo updatedb &amp;
[1] 16324
$ sudo ionice -c2 -n7 -p16324</pre>
<p>Again, the Real Time class should not be used as it can prevent you from being able to interact with your system.</p>
<p>You may wonder where you can get the process ID if you don’t know it, can’t remember it, or didn’t start the process (an automatted script may have launched it). You can find process IDs with the ps command.</p>
<p>For example, if I had an updatedb program running in the background, and I wanted to find its process ID, I can run the following:</p>
<pre>$ ps -C updatedb
PID TTY TIME CMD
4234 ? 00:00:42 updatedb</pre>
<p>This tells me that the process’ process ID (PID) is 4234.</p>
</p>
</blockquote>
<p><a id="iostat-tool" name="iostat-tool"></a></p>
<h3>iostat</h3>
<p><a id="iostat-usage" name="iostat-usage"></a></p>
<h4>iostat Usage</h4>
<pre>iostat [ -c ] [ -d ] [ -N ] [ -n ] [ -h ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ] [ &lt;device&gt; [&#46;..] | ALL ] [ -p [ &lt;device&gt; [,&#46;..] | ALL ] ] [ &lt;interval&gt; [ &lt;count&gt; ] ]

-c     The -c option is exclusive of the -d option and displays only the CPU usage report.
-d     The -d option is exclusive of the -c option and displays only the device utilization report.
-k     Display statistics in kilobytes per second instead of blocks per second.  Data displayed are valid only with kernels 2.4 and newer.
-m     Display statistics in megabytes per second instead of blocks or kilobytes per second.  Data displayed are valid only with kernels 2.4 and newer.
-n     Displays the NFS-directory statistic.  Data displayed are valid only with kernels 2.6.17 and newer.  This option is exclusive ot the -x option.
-h     Display the NFS report more human readable.
-p [ { device | ALL } ]   The  -p  option  is  exclusive  of  the -x option and displays statistics for block devices and all their partitions that are used by the system.
-t     Print the time for each report displayed.
-x     Display extended statistics.  </pre>
<p><a id="iostat-examples" name="iostat-examples"></a></p>
<h4>iostat Examples</h4>
<pre>iostat -p ALL 2 1000
avg-cpu:  %user   %nice    %sys %iowait   %idle
            8.34    0.08    1.26    2.27   88.05</pre>
<p>Display a single history since boot report for all CPU and Devices.</p>
<pre>$ iostat</pre>
<p>Display a continuous device report at two second intervals.</p>
<pre>$ iostat -d 2</pre>
<p>Display six reports at two second intervals for all devices.</p>
<pre>$ iostat -d 2 6</pre>
<p>Display six reports of extended statistics at two second intervals for devices hda and hdb.</p>
<pre>$ iostat -x hda hdb 2 6</pre>
<p>Display six reports at two second intervals for device sda and all its partitions (sda1, etc.)</p>
<pre>$ iostat -p sda 2 6</pre>
<p><a id="schedule-utils" name="schedule-utils"></a></p>
<h2>Schedule Utils</h2>
<p>These are the Linux scheduler utilities &#8211; schedutils for short.  These programs take advantage of the scheduler family of syscalls that Linux implements across various kernels.  These system calls implement interfaces for scheduler-related parameters such as CPU affinity and real-time attributes.  The standard UNIX utilities do not provide support for these interfaces &#8212; thus this package.</p>
<p>The programs that are included in this package are chrt and taskset.  Together with nice and renice (not included), they allow full control of process scheduling parameters.  Suggestions for related utilities are welcome, although it is believed (barring new interfaces) that all scheduling interfaces are covered.</p>
<p>I&#8217;ve found that quite a few servers do not have this package installed, indicating to you that they might not know what they are doing.  Here is how you can install this incredible package, for non-root users.  Root users know how to do this, or they shouldn&#8217;t be root.  Download and install in 1 line provided you have curl.  Or just use the following commands.</p>
<pre>mkdir -pv $HOME/{dist,source,bin,share/man/man1} &amp;&amp; cd ~/dist &amp;&amp; curl -O http://ftp.de.debian.org/debian/pool/main/s/schedutils/schedutils_1.5.0.orig.tar.gz &amp;&amp; cd ~/source &amp;&amp; tar -xvzf ~/dist/sch*z &amp;&amp; cd sch* &amp;&amp; sed -i -e &#039;s,= /usr/local,=${HOME},g&#039; Makefile &amp;&amp; make &amp;&amp; make install &amp;&amp; make installdoc</pre>
<pre>mkdir -pv $HOME/{dist,source,bin,share/man/man1}
cd ~/dist &amp;&amp; curl -O http://ftp.de.debian.org/debian/pool/main/s/schedutils/schedutils_1.5.0.orig.tar.gz
cd ~/source &amp;&amp; tar -xvzf ~/dist/schedutils_1.5.0.orig.tar.gz
cd ~/source/schedutils-1.5.0 &amp;&amp; sed -i -e &#039;s,= /usr/local,=${HOME},g&#039; Makefile
make || make -d &amp;&amp; make install || make install -d &amp;&amp; make installdoc || make installdoc -d</pre>
<p><a id="taskset-tool" name="taskset-tool"></a></p>
<h3>taskset</h3>
<p>Taskset  is  used to set or retrieve the CPU affinity of a running process given its PID or to launch a new COMMAND with a given CPU affinity.  CPU affinity is a scheduler property that &#8220;bonds&#8221; a process to a given set of CPUs on the system.  The Linux scheduler will honor the given CPU affinity and the process will not run on any other CPUs.  Note that the Linux scheduler also supports natural CPU affinity: the scheduler attempts to keep processes on the same CPU as long as practical for performance reasons.  Therefore, forcing a specific CPU affinity is useful only in certain applications.</p>
<p>The  CPU  affinity is represented as a bitmask, with the lowest order bit corresponding to the first logical CPU and the highest order bit corresponding to the last logical CPU.  Not all CPUs may exist on a given system but a mask may specify more CPUs than are present.  A retrieved mask will reflect only the bits that correspond to CPUs physically on the system.  If an invalid mask is given (i.e., one that corresponds to no valid CPUs on the current system) an error is returned.  A user must possess CAP_SYS_NICE to change the CPU affinity of a process.  Any user can retrieve the affinity mask.</p>
<p><a id="taskset-usage" name="taskset-usage"></a></p>
<h4>taskset Usage</h4>
<pre>taskset [options] [mask | cpu-list] [pid | cmd [args&#46;..]]
&nbsp;
-p, &#45;-pid            operate on existing given pid
-c, &#45;-cpu-list     display and specify cpus in list format</pre>
<p><a id="taskset-examples" name="taskset-examples"></a></p>
<h4>taskset-examples</h4>
<p>The default behavior is to run a new command:</p>
<pre>$ taskset 03 sshd -b 1024</pre>
<p>You can retrieve the mask of an existing task or set it:</p>
<pre>$ taskset -p 700
$ taskset -p 03 700</pre>
<p>List format uses a comma-separated list instead of a mask:</p>
<pre>$ taskset -pc 0,3,7-11 700</pre>
<p><a id="chrt-tool" name="chrt-tool"></a></p>
<h3>chrt</h3>
<p><code>chrt</code> sets or retrieves the real-time scheduling attributes of an existing PID or runs COMMAND with the given attributes.  Both policy (one of <code>SCHED_FIFO</code>, <code>SCHED_RR</code>, or <code>SCHED_OTHER</code>) and priority can be set and retrieved.  A user must possess CAP_SYS_NICE to change the scheduling attributes of a process.  Any user can retrieve the scheduling information.</p>
<p><a id="chrt-usage" name="chrt-usage"></a></p>
<h4>chrt Usage</h4>
<pre>chrt [options] [prio] [pid | cmd [args&#46;..]]
&nbsp;
-p, &#45;-pid operate on an existing PID and do not launch a new task
-f, &#45;-fifo set scheduling policy to SCHED_FIFO
-m, &#45;-max show minimum and maximum valid priorities, then exit
-o, &#45;-other set policy scheduling policy to SCHED_OTHER
-r, &#45;-rr set scheduling policy to SCHED_RR (the default)</pre>
<p><a id="chrt-examples" name="chrt-examples"></a></p>
<h4>chrt Examples</h4>
<p>The default behavior is to run a new command:   <code>chrt [prio] -- [command] [arguments]</code></p>
<p>You can also retrieve the real-time attributes of an existing task:</p>
<pre>chrt -p [pid]</pre>
<p>Or set them:</p>
<pre>chrt -p [prio] [pid]</pre>
<p><a id="ulimit-tool" name="ulimit-tool"></a></p>
<h2>ulimit &#8211; get and set user limits</h2>
<p>Ulimit provides control over the resources available to processes started by the shell, on systems that allow such control. One can set the resource limits of the shell using the built-in ulimit command.  The shell&#8217;s resource limits are inherited by the processes that it creates to execute commands.</p>
<p><a id="ulimit-usage" name="ulimit-usage"></a></p>
<h4>ulimit Usage</h4>
<pre>ulimit [-SHacdfilmnpqstuvx] [limit]</pre>
<dl>
<dt>-S</dt>
<dd>use the `soft&#8217; resource limit</dd>
<dt>-H</dt>
<dd>use the `hard&#8217; resource limit</dd>
<dt>-a</dt>
<dd>all current limits are reported</dd>
<dt>-c</dt>
<dd>the maximum size of core files created</dd>
<dt>-d</dt>
<dd>the maximum size of a process&#8217;s data segment</dd>
<dt>-f</dt>
<dd>the maximum size of files created by the shell</dd>
<dt>-l</dt>
<dd>the maximum size a process may lock into memory</dd>
<dt>-m</dt>
<dd>the maximum resident set size</dd>
<dt>-n</dt>
<dd>the maximum number of open file descriptors</dd>
<dt>-p</dt>
<dd>the pipe buffer size</dd>
<dt>-s</dt>
<dd>the maximum stack size</dd>
<dt>-t</dt>
<dd>the maximum amount of cpu time in seconds</dd>
<dt>-u</dt>
<dd>the maximum number of user processes</dd>
<dt>-v</dt>
<dd>the size of virtual memory</dd>
</dl>
<p>If LIMIT is given, it is the new value of the specified resource; the special LIMIT values `soft&#8217;, `hard&#8217;, and `unlimited&#8217; stand for the current soft limit, the current hard limit, and no limit, respectively.  Otherwise, the current value of the specified resource is printed.  If no option is given, then -f is assumed.  Values are in 1024-byte increments, except for -t, which is in seconds, -p, which is in increments of 512 bytes, and -u, which is an unscaled number of processes.</p>
<dl>
<dt>RLIMIT_AS</dt>
<dd>The maximum size of the process&#8217;s virtual memory (address space) in bytes.  This limit affects calls to brk(2), mmap(2) and mremap(2), which fail with the error ENOMEM upon exceeding this limit.  Also automatic stack expansion will fail (and generate a SIGSEGV that kills the process if no alternate stack has been made available via sigaltstack(2)).  Since the value is a long, on machines with a 32-bit long either this limit is at most 2 GiB, or this resource is unlimited.</dd>
<dt>RLIMIT_CORE</dt>
<dd>Maximum size of core file.  When 0 no core dump files are created. When non-zero, larger dumps are truncated to this size.</dd>
<dt>RLIMIT_CPU CPU</dt>
<dd>time limit in seconds.  When the process reaches the soft limit, it is sent a SIGXCPU signal.  The default action for this signal is to terminate the process.  However, the signal can be caught, and the handler can return control to the main program.  If the process continues to consume CPU time, it will be sent SIGXCPU once per second until the hard limit is reached, at which time it is sent SIGKILL. (This latter point describes Linux 2.2 through 2.6 behavior. Implementations vary in how they treat processes which continue to consume CPU time after reaching the soft limit.  Portable applications that need to catch this signal should perform an orderly termination upon first receipt of SIGXCPU.)</dd>
<dt>RLIMIT_DATA</dt>
<dd>The maximum size of the process&#8217;s data segment (initialized data, uninitialized data, and heap).  This limit affects calls to brk(2) and sbrk(2), which fail with the error ENOMEM upon encountering the soft limit of this resource.</dd>
<dt>RLIMIT_FSIZE</dt>
<dd>The maximum size of files that the process may create.  Attempts to extend a file beyond this limit result in delivery of a SIGXFSZ signal. By default, this signal terminates a process, but a process can catch this signal instead, in which case the relevant system call (e.g., write(2), truncate(2)) fails with the error EFBIG.</dd>
<dt>RLIMIT_LOCKS</dt>
<dd>(Early Linux 2.4 only) A limit on the combined number of flock(2) locks and fcntl(2) leases that this process may establish.</dd>
<dt>RLIMIT_MEMLOCK</dt>
<dd>The maximum number of bytes of memory that may be locked into RAM.  In effect this limit is rounded down to the nearest multiple of the system page size.  This limit affects mlock(2) and mlockall(2) and the mmap(2) MAP_LOCKED operation.  Since Linux 2.6.9 it also affects the shmctl(2) SHM_LOCK operation, where it sets a maximum on the total bytes in shared memory segments (see shmget(2)) that may be locked by the real user ID of the calling process.  The shmctl(2) SHM_LOCK locks are accounted for separately from the per-process memory locks established by mlock(2), mlockall(2), and mmap(2) MAP_LOCKED; a process can lock bytes up to this limit in each of these two categories.  In Linux kernels before 2.6.9, this limit controlled the amount of memory that could be locked by a privileged process.  Since Linux 2.6.9, no limits are placed on the amount of memory that a privileged process may lock, and this limit instead governs the amount of memory that an unprivileged process may lock.</dd>
<dt>RLIMIT_MSGQUEUE</dt>
<dd>(Since Linux 2.6.8) Specifies the limit on the number of bytes that can be allocated for POSIX message queues for the real user ID of the calling process.  This limit is enforced for mq_open(3).  Each message queue that the user creates counts (until it is removed) against this limit according to the formula:  <code>bytes = attr.mq_maxmsg * sizeof(struct msg_msg *) +             attr.mq_maxmsg * attr.mq_msgsize</code> where attr is the mq_attr structure specified as the fourth argument to mq_open(3).  The first addend in the formula, which includes sizeof(struct msg_msg *) (4 bytes on Linux/i386), ensures that the user cannot create an unlimited number of zero-length messages (such messages nevertheless each consume some system memory for bookkeeping overhead).</dd>
<dt>RLIMIT_NICE</dt>
<dd>(since Linux 2.6.12, but see BUGS below) Specifies a ceiling to which the process&#8217;s nice value can be raised using setpriority(2) or nice(2).  The actual ceiling for the nice value is calculated as 20 &#8211; rlim_cur.  (This strangeness occurs because negative numbers cannot be specified as resource limit values, since they typically have special meanings.  For example, RLIM_INFINITY typically is the same as -1.)</dd>
<dt>RLIMIT_NOFILE</dt>
<dd>Specifies a value one greater than the maximum file descriptor number that can be opened by this process.  Attempts (open(2), pipe(2), dup(2), etc.)  to exceed this limit yield the error EMFILE. (Historically, this limit was named RLIMIT_OFILE on BSD.)</dd>
<dt>RLIMIT_NPROC</dt>
<dd>The maximum number of processes (or, more precisely on Linux, threads) that can be created for the real user ID of the calling process.  Upon encountering this limit, fork(2) fails with the error EAGAIN.</dd>
<dt>RLIMIT_RSS</dt>
<dd>Specifies the limit (in pages) of the process&#8217;s resident set (the number of virtual pages resident in RAM).  This limit only has effect in Linux 2.4.x, x < 30, and there only affects calls to madvise(2) specifying MADV_WILLNEED.</dd>
<dt>RLIMIT_RTPRIO</dt>
<dd>(Since Linux 2.6.12, but see BUGS) Specifies a ceiling on the real-time priority that may be set for this process using sched_setscheduler(2) and sched_setparam(2).</dd>
<dt>RLIMIT_RTTIME</dt>
<dd>(Since Linux 2.6.25) Specifies a limit on the amount of CPU time that a process scheduled under a real-time scheduling policy may consume without making a blocking system call.  For the purpose of this limit, each time a process makes a blocking system call, the count of its consumed CPU time is reset to zero.  The CPU time count is not reset if the process continues trying to use the CPU but is preempted, its time slice expires, or it calls sched_yield(2). Upon reaching the soft limit, the process is sent a SIGXCPU signal.  If the process catches or ignores this signal and continues consuming CPU time, then SIGXCPU will be generated once each second until the hard limit is reached, at which point the process is sent a SIGKILL signal.  The intended use of this limit is to stop a runaway real-time process from locking up the system.</dd>
<dt>RLIMIT_SIGPENDING</dt>
<dd>(Since Linux 2.6.8) Specifies the limit on the number of signals that may be queued for the real user ID of the calling process.  Both standard and real-time signals are counted for the purpose of checking this limit.  However, the limit is only enforced for sigqueue(2); it is always possible to use kill(2) to queue one instance of any of the signals that are not already queued to the process.</dd>
<dt>RLIMIT_STACK</dt>
<dd>The maximum size of the process stack, in bytes.  Upon reaching this limit, a SIGSEGV signal is generated.  To handle this signal, a process must employ an alternate signal stack (sigaltstack(2)).</dd>
</dl>
<p><a id="ulimit-examples" name="ulimit-examples"></a></p>
<h4>ulimit Examples</h4>
<p>Turn off core dumps</p>
<pre>ulimit -S -c 0</pre>
<h2>More Reading</h2>
<ul>
<li>Please see the <a href="http://pagesperso-orange.fr/sebastien.godard/" rel="nofollow" >SYSSTAT Utilities Home for more performance monitoring tools</a> like sar, sadf, mpstat, iostat, pidstat and sa tools.</li>
<li><a href="http://gaarai.com/2009/03/06/multitasking-from-the-linux-command-line-plus-process-prioritization/" rel="nofollow" >Multitasking from the Linux Command Line + Process Prioritization</a></li>
</ul>
<h2>Man Pages</h2>
<ol>
<li><a href="http://www.kernel.org/doc/man-pages/online/pages/man2/sched_setscheduler.2.html" rel="nofollow" >sched_setscheduler</a></li>
<li><a href="http://www.kernel.org/doc/man-pages/online/pages/man7/cpuset.7.html" rel="nofollow" >cpuset</a></li>
<li><a href="http://www.kernel.org/doc/man-pages/online/pages/man7/signal.7.html" rel="nofollow" >signal</a></li>
<li><a href="http://www.kernel.org/doc/man-pages/online/pages/man2/getrlimit.2.html" rel="nofollow" >getrlimit</a></li>
<li><a href="http://www.kernel.org/doc/man-pages/online/pages/man3/ulimit.3.html" rel="nofollow" >ulimit</a></li>
<li><a href="http://www.kernel.org/doc/man-pages/online/pages/man2/ioprio_get.2.html" rel="nofollow" >ioprio_get</a></li>
<li><a href="http://www.kernel.org/doc/man-pages/online/pages/man2/ioprio_set.2.html" rel="nofollow" >ioprio_set</a></li>
</ol>
<h2>Kernel Documentation</h2>
<ul>
<li><a href='http://uploads.askapache.com/2009/08/sched-stats.txt'>information on schedstats (Linux Scheduler Statistics)</a></li>
<li><a href='http://uploads.askapache.com/2009/08/sched-rt-group.txt'>real-time group scheduling</a></li>
<li><a href='http://uploads.askapache.com/2009/08/sched-nice-design.txt'>How and why the scheduler&#8217;s nice levels are implemented</a></li>
<li><a href='http://uploads.askapache.com/2009/08/sched-domains.txt'>information on scheduling domains</a></li>
<li><a href='http://uploads.askapache.com/2009/08/sched-design-CFS.txt'>goals, design and implementation of the Complete Fair Scheduler</a></li>
</ul>
<h2>Future Discussions:</h2>
<p><a href="http://www.cuddletech.com/blog/pivot/entry.php?id=820" rel="nofollow" >IO Benchmarking: How, Why and With What</a></p>
<p><a href="http://www.askapache.com/linux-unix/optimize-nice-ionice.html"></a><a href="http://www.askapache.com/linux-unix/optimize-nice-ionice.html">Optimizing Servers and Processes for Speed with ionice, nice, ulimit</a> originally appeared on <cite>AskApache.com</cite> </p>]]></content:encoded>
			<wfw:commentRss>http://www.askapache.com/linux-unix/optimize-nice-ionice.html/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Windows Optimization &#8211; Intense Part II</title>
		<link>http://www.askapache.com/windows/defrag-optimize-speed-xp.html</link>
		<comments>http://www.askapache.com/windows/defrag-optimize-speed-xp.html#comments</comments>
		<pubDate>Mon, 05 Oct 2009 13:42:28 +0000</pubDate>
		<dc:creator>AskApache</dc:creator>
				<category><![CDATA[Cache]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Linux Unix BSD]]></category>
		<category><![CDATA[Review]]></category>
		<category><![CDATA[Webmaster]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[301 Redirect]]></category>
		<category><![CDATA[admin]]></category>
		<category><![CDATA[Advanced]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[askapache]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[Backups]]></category>
		<category><![CDATA[Boot]]></category>
		<category><![CDATA[CommandLine]]></category>
		<category><![CDATA[compression]]></category>
		<category><![CDATA[console]]></category>
		<category><![CDATA[Defrag]]></category>
		<category><![CDATA[Defragmentation]]></category>
		<category><![CDATA[Deframenting]]></category>
		<category><![CDATA[Disk IO]]></category>
		<category><![CDATA[File System]]></category>
		<category><![CDATA[Forms]]></category>
		<category><![CDATA[GET]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Hard Drive]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Login]]></category>
		<category><![CDATA[MyDefrag]]></category>
		<category><![CDATA[nsa]]></category>
		<category><![CDATA[Optimization]]></category>
		<category><![CDATA[PageDefrag]]></category>
		<category><![CDATA[pagefile]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Port]]></category>
		<category><![CDATA[ram]]></category>
		<category><![CDATA[Registry Optimization]]></category>
		<category><![CDATA[Scanners]]></category>
		<category><![CDATA[Scripts]]></category>
		<category><![CDATA[Shell]]></category>
		<category><![CDATA[SPEED]]></category>
		<category><![CDATA[SpinRite]]></category>
		<category><![CDATA[SSI]]></category>
		<category><![CDATA[stat]]></category>
		<category><![CDATA[trick]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[UltraDefrag]]></category>
		<category><![CDATA[Windows XP]]></category>
		<category><![CDATA[Windows XP Optimization]]></category>

		<guid isPermaLink="false">http://www.askapache.com/?p=3039</guid>
		<description><![CDATA[<p><a href="http://www.askapache.com/windows/defrag-optimize-speed-xp.html" class="IFL" id="id3"></a>If you ever wanted to know the best way to defragment and speed up your Windows-Based PC, I mean you <em>really</em> wanted to know, here is the 2nd part to my article on Windows Speed Optimizing that details the process I have found works really well.  Definately not a quick process, and certainly not the best ever, just my best ever and one that you only have to do once to get the benefits.  
This article has a lot of incredibly useful (and FREE) tools I recommend, which you can grab and use without reading the article..<br class="C" /></p>]]></description>
			<content:encoded><![CDATA[<p>This is part 2 of my Windows XP Optimization article:  <a href="http://www.askapache.com/windows/blazing-fast-xp-speed.html">Make Windows XP Blazingly Fast</a>.</p>
<p>The first article was meant as a <a href="http://www.askapache.com/windows/blazing-fast-xp-speed.html">detailed and thorough introduction to speeding up Windows-based PC&#8217;s</a> in a way that makes it easy to follow, without getting too specific.  So make sure you read that first, and pay the most attention to freeing up RAM, CPU, and Disk IO speed by reducing the number of services and processes that are running, we will deal with defragmentation, hard-drive speed, Disk IO, Prefetching, and Pagefile/Registry Defragmentation now.</p>
<p>This article has some really really really great stuff for ya.  It shows which tools (all but one completely free) are the best and you will use them for a long time, they are all very good.  That is just a side benefit, as this article is really more of a step-by-step guide to optimizing your system that won&#8217;t have to be repeated for at least a year.  The result of course is a much more responsive PC.</p>
<h2>Whats New</h2>
<p>After writing that article I continued my research and testing into the subject on my personal computers.  I wanted to test out several additional programs and methods before I wrote about them for you guys, and I found a few really sweet additions that had a very big performance gain for all my computers, from my oldest and slowest PC&#8217;s to my new 4K power laptop.  This article is primarily focused on optimizing your hard drive data and improving your Disk IO speed, and you will definately see an improvement in speed.  It doesn&#8217;t get REALLY good until the defragmenting section..</p>
<ol>
<li><a href="#optimize-hard-drive" rel="nofollow" >Clean Up Hard Drive</a> &#8211; Removing unneccessary files</li>
<li><a href="#registry-cleaning" rel="nofollow" >Clean Registry</a> &#8211; Fixing slow registry problems automatically</li>
<li><a href="#defragmenting" rel="nofollow" >Ultimate Defragmenting</a> &#8211; The best defrag method I use</li>
<li><a href="#optimize-disk" rel="nofollow" >Optimize Physical Hard Disk</a> &#8211; Final step that cleans and heals your physical disk</li>
</ol>
<hr class="C" />
<p><a id="optimize-hard-drive" name="optimize-hard-drive"></a></p>
<h2>Clean Up Hard Drive</h2>
<p>The first step is to clean up all the extra, temporary, and unneccessary files cluttering your hard-drive.  The reason is because we will be defragmenting your hard-drive like its never been defragged before, then we are going to go over every single bit and byte of your hard-drive to optimize the physical sectors and storage of your data..   Also we will be running a check of your registry and cleaning out bad links and other slow errors, so get it as clutter-free as possible.  DON&#8217;T use Windows built-in folder compression, it makes defragmentation worse&#8230; DO use 7-zip or winrar to create a solid archive file of any misc directories with a bunch of files&#8230; You only need one program to clean your system.</p>
<h3>CCleaner</h3>
<p><a href="http://uploads.askapache.com/2009/10/screen_301.png" rel="nofollow" class="ccleaner ccl1 IFL"  title="CCleaner main program window open on the Windows tab"></a>CCleaner is a Small, Fast and Free software that removes unused and temporary files from your system and allows Windows to run faster, more efficiently and gives you more hard disk space.  I&#8217;ve now been using it for several months and love it.  As well as cleaning up old files and settings left by standard Windows components, CCleaner also cleans temporary files and recent file lists for many applications. Including: Firefox, Opera, Safari, Media Player, eMule, Kazaa, Google Toolbar, Netscape, Microsoft Office, Nero, Adobe Acrobat Reader, WinRAR, WinAce, WinZip and more&#8230; Google Chrome, Opera, Safari, etc..<br class="C" /></p>
<ul>
<li>Recycle Bin, Clipboard</li>
<li>Windows Temporary files, Windows Log files, Chkdsk file fragments</li>
<li>Recent Documents (on the Start Menu), Run history (on the Start Menu)</li>
<li>Windows XP Search Assistant history, old Prefetch data, Windows memory dumps after crashes</li>
</ul>
<p><a href="http://www.ccleaner.com/download" rel="nofollow" >Download CCleaner</a><br class="C" /></p>
<hr class="C" />
<p><a id="registry-cleaning" name="registry-cleaning"></a></p>
<h2>Registry Cleaning</h2>
<p>The registry is Windows biggest mistake, (although I&#8217;m sure they like it), and basically holds all the information for your programs and Windows.  Things like the size of your windows, recent file lists, icon files for different icons, etc..  I&#8217;ve never seen a computer that didn&#8217;t have some registry issues, so this needs to be cleaned and may have a huge impact on your speed.  Real quickly, here are some programs to backup and restore your registry, optimize and defrag your registry, and finally search and clean any errors in your registry.</p>
<h3>CCleaner</h3>
<p><a href="http://uploads.askapache.com/2009/10/screen_303.png" rel="nofollow" class="ccleaner ccl3 IFL"  title="CCleaner Issue Scanning section with the results of a scan"></a>Yup!  CCleaner also takes care of most of the performance issues of your registry.  It&#8217;s very safe and fast.  CCleaner uses an advanced Registry Cleaner to check for problems and inconsistencies. It checks the following:<br class="C" /></p>
<ul>
<li>ClassIDs, ProgIDs, Application Paths, Icons</li>
<li>Uninstallers, Shared DLLs, Fonts, Help File references</li>
<li>File Extensions, ActiveX Controls, Invalid Shortcuts and more&#8230;</li>
</ul>
<p><a href="http://www.ccleaner.com/download" rel="nofollow" >Download CCleaner</a><br class="C" /></p>
<h3>ERUNT &#8211; The Emergency Recovery Utility NT</h3>
<p><img class="IFL" src="http://uploads.askapache.com/2009/10/erunt.gif" alt="ERUNT – Registry Backup and Restore Emergency Recovery Utility for Windows" title="ERUNT – Registry Backup and Restore Emergency Recovery Utility for Windows" width="32" height="32" /><a href="http://www.larshederer.homepage.t-online.de/erunt/index.htm" rel="nofollow" >ERUNT</a> is a Registry Backup and Restore utility for Windows NT/2000/2003/XP.  I use this to backup my registry automatically or on command.. Ive used it for years and it&#8217;s always good to backup before you do anything.<br class="C" /></p>
<pre># Here&#039;s the command I use (only for advanced users familiar with autoback)
&quot;%ProgramFiles%\ERUNT\AUTOBACK.EXE&quot; %SystemRoot%\ERDNT\#Date# sysreg curuser otherusers /noconfirmdelete /noprogresswindow /days:45 /alwayscreate</pre>
<p><a href="http://www.larshederer.homepage.t-online.de/erunt/" rel="nofollow" >Download ERUNT</a> &middot; (<a href="http://www.larshederer.homepage.t-online.de/erunt/erunt.txt" rel="nofollow" >Details</a>)<br class="C" /></p>
<h3>NTGREGOPT &#8211; NT Registry Optimizer</h3>
<p><img class="IFL" src="http://uploads.askapache.com/2009/10/ntregopt.gif" alt="NTGREGOPT – NT Registry Optimizer for Windows" title="NTGREGOPT – NT Registry Optimizer for Windows" width="32" height="32" /><a href="http://www.larshederer.homepage.t-online.de/erunt/index.htm" rel="nofollow" >NTGREGOPT</a> is a Registry Optimization tool for Windows NT/2000/2003/XP/Vista that minimizes the size of your registry files by simply compacting the registry hives to the minimum size possible.</p>
<p>Registry files in an NT-based system can become fragmented over time, occupying more space on your hard disk than necessary and decreasing overall performance. You should use the NTREGOPT utility regularly, but especially after installing or uninstalling a program, to minimize the size of the registry files and optimize registry access.  The program works by recreating each registry hive &#8220;from scratch&#8221;, thus removing any slack space that may be left from previously modified or deleted keys.  It does NOT change the contents of the registry in any way, nor does it physically defrag the registry files on the drive.  I recommend using this once every couple weeks.  I scheduled it to run automatically.<br class="C" /></p>
<p><a href="http://www.larshederer.homepage.t-online.de/erunt/" rel="nofollow" >Download NTGREGOPT</a> &middot; (<a href="http://www.larshederer.homepage.t-online.de/erunt/ntregopt.txt" rel="nofollow" >Details</a>)<br class="C" /></p>
<hr class="C" />
<p><a id="defragmenting" name="defragmenting"></a></p>
<h2>Ultimate Defragmenting</h2>
<p>I say &#8220;Ultimate Defragmenting&#8221; because this is the result of a lot of testing of all the various defragmenting software out there, reading a lot of documentation, and running benchmarking to find the fastest results.  This is a mix of several individual defragmenting steps combined for a once-a-year ultimate defragmenting session.  This is what I use today, and although it&#8217;s altogether a long process, each step you&#8217;ll add a new tool or skill that you can use by itself from here on out.</p>
<p class="inote">ATTENTION:  While running MyDefrag/JkDefrag, SpinRite, and UltraDefrag your computer can get very hot and that is very not cool.  I set my laptop on a coke can and pointed a small desk fan at it which kept it very very cool, so do what you can to minimize heat during these programs.</p>
<h3>PageDefrag</h3>
<p><img src="http://uploads.askapache.com/2009/10/PageDefrag-115x94.gif" alt="PageDefrag SysInternals By Mark Russinovich" title="PageDefrag SysInternals By Mark Russinovich" width="115" height="94" class="IFL" /><a href="http://technet.microsoft.com/en-us/sysinternals/bb897426.aspx" rel="nofollow" >PageDefrag</a> uses advanced techniques to provide you what commercial defragmenters cannot: the ability for you to see how fragmented your paging files and Registry hives are, and to defragment them. In addition, it defragments event log files and Windows 2000/XP hibernation files (where system memory is saved when you hibernate a laptop).  One of the limitations of the Windows NT/2000 defragmentation interface is that it is not possible to defragment files that are open for exclusive access. Thus, standard defragmentation programs can neither show you how fragmented your paging files or Registry hives are, nor defragment them. Paging and Registry file fragmentation can be one of the leading causes of performance degradation related to file fragmentation in a system.<br class="C" /></p>
<p>I personally keep this enabled for every boot, as it only takes a few seconds after the first time it&#8217;s run.</p>
<p><a href="http://technet.microsoft.com/en-us/sysinternals/bb897426.aspx" rel="nofollow" >Download PageDefrag</a><br class="C" /></p>
<h3>MyDefrag</h3>
<p><img class="IFL" src="http://uploads.askapache.com/2009/10/jkdefrag.gif" alt="Windows Optimization   Intense Part II" title="jkdefrag" width="128" height="101" class="alignnone size-full wp-image-3420" />JkDefrag is a disk defragmenter and optimizer for Windows 2000/2003/XP/Vista/2008/X64. Completely automatic and very easy to use, fast, low overhead, with several optimization strategies, and can handle floppies, USB disks, memory sticks, and anything else that looks like a disk to Windows. Included are a Windows version, a commandline version (for scheduling by the task scheduler or for use from administrator scripts), a screensaver version, a DLL library (for use from programming languages), versions for Windows X64, and the complete sources. (<a href="http://www.mydefrag.com/Manual-FrequentlyAskedQuestions.html" rel="nofollow" >Frequently Asked Questions</a>)<br class="C" /></p>
<p>After trying out dozens of degragmenting programs, this is my favorite.  I utilize the cool screensaver function and just run sometimes when I&#8217;m calling it a day.</p>
<h4><a href="http://www.mydefrag.com/Manual-TipsAndTricks.html" rel="nofollow" >Tips and tricks</a></h4>
<ul>
<li>Many users start looking for defragmentation/optimization programs when their computer becomes slow. The main reason for a slow computer is a full harddisk. A full harddisk is slow because the distance between files is greater than on a fresh practically empty harddisk. Deleting half the data on a full disk will just about double the speed. The more free diskspace, the faster your computer will be.</li>
<li>Buy a second harddisk (for example an USB harddisk) and move little used stuff from your primary harddisk to that secondary harddisk. The second disk can also be used for backing up the primary disk.</li>
<li>When buying a new computer, buy the biggest harddisk you can afford. Investing in a bigger harddisk gives more speed-per-dollar than investing in a faster CPU or investing in more memory.</li>
<li>Cleanup old junk from your harddisk before running MyDefrag. You can clean Windows files with for example &#8220;Start -&gt; Programs -&gt; Accessories -&gt; System Tools -&gt; Disk Cleanup&#8221;, or with something like the freeware <a href="http://www.ccleaner.com/" rel="nofollow" ><b>CCleaner</b></a> program.</li>
<li>Reboot before running MyDefrag. This will release files that are in use, so they can be defragmented and optimized.</li>
<li>Boot into Windows safe mode by pressing F8 when booting, and then run MyDefrag. It will be slower because the Windows disk cache is off in safe mode, but MyDefrag will be able to process (a few) more files.</li>
<li>Stop your real time virus scanner before running MyDefrag. Virus scanners check all disk activity, making defragmentation and optimization very slow.</li>
<li>Move the swap file to another volume, reboot, defragment, and move the swap file back. If you don&#8217;t have a second volume then temporarily make the swap file small, for example 100Mb.</li>
<li>Package unused files with a packager such as <a href="http://www.7-zip.org/" rel="nofollow" >7-zip</a>. The packagefile not only takes less harddisk space, but will also defragment and optimize much faster than the individual files. <b>Note</b>: This does not apply to Windows NTFS compression, which will actually make defragmentation and optimization slower.</li>
<li>The first partition on a harddisk is significantly faster than other partitions. Try to use other partitions only for data that is used less often, such as music, movies, archives, backups, logfiles.</li>
<li>If you have 2 physical harddisks of the same speed, then place the pagefile on the first partition of the second harddisk.</li>
</ul>
<p>The way I recommend is to run MyDefrag at the highest level of defragmentation once, which took my fastest PC almost 30 hours.  Once that is done you can just run it normally in 20 minutes or so.. This software also has the best defrag information I&#8217;ve found to date, so check out the documentation on the site.</p>
<p><a href="http://www.mydefrag.com/Manual-DownloadAndInstall.html" rel="nofollow" >Download MyDefrag</a><br class="C" /></p>
<h3>UltraDefrag</h3>
<p><img class="IFL" src="http://uploads.askapache.com/2009/10/ultra_defrag.gif" alt="UltraDefrag - powerful Defragmentation tool for Windows" title="UltraDefrag - powerful Defragmentation tool for Windows" width="196" height="158" class="alignnone size-full wp-image-3424" />UltraDefrag is a powerful Open Source Defragmentation tool for Windows Platform. It is very fast, because the defragmenting is done via the kernel-mode driver. There are three interface available : Graphical, Console and Native.  I personally like the MyDefrag more because I think it does a better job, but I also use the UltraDefrag tool because it has one very important feature like the PageDefrag tool.  It has a native version.  That means it can run before Windows loads up by utilizing the bootexecute, the same place that windows chkdsk runs at boot.   It also can takeover for Windows builtin prefetcher, to speed up the loading of frequently used programs, which I&#8217;ll explain a bit later. <br class="C" /></p>
<p>I set ultradefrag up after the MyDefrag 30hour defrag completes, to run at boot and control the prefetching, then I erase any prefetch files currently saved and reboot which lets it defrag the system.</p>
<pre>erase /Q &quot;%SYSTEMROOT%\Prefetch\*.*&quot;</pre>
<p>Once both MyDefrag and UltraDefrag have run THEN I finally login to windows and don&#8217;t open any programs to let the windows OS files get optimized by not doing anything at all for 5 minutes..  Then I reboot and log back in and this time I don&#8217;t do anything for 30 minutes and reboot.  Finally I log back in and this time I instantly load up 10 of my most frequently used programs, (DreamWeaver, Photoshop, Firefox, Chrome, Notepad2, Thunderbird, Internet Explorer, and a few others) and once they are all loaded I don&#8217;t do anything for an hour.  Then I reboot and repeat that same process.</p>
<p>This may seem odd or made up but I do my research and this allows your prefetched files to be optimized, including your boot prefetch files.   Once that is done I reboot and run all the defrags again.  Then I reboot and am ready for the last step.</p>
<p><a href="http://ultradefrag.sourceforge.net/" rel="nofollow" >Download UltraDefrag</a><br class="C" /></p>
<hr class="C" />
<p><a id="optimize-disk" name="optimize-disk"></a></p>
<h2>Optimize Physical Hard Disk</h2>
<p>Now at this point the system is defragged and optimized as much as I can get it, but the last step is to run a program to go over every single bit on our hard-drive-disk to keep the drive clean and healthy and its too technical for me to understand, I just know its amazingly cool and I noticed a big change right away.</p>
<h3>HD Tune</h3>
<p><img class="IFL" src="http://uploads.askapache.com/2009/10/HDTune_Benchmark-116x94.gif" alt="Windows Optimization   Intense Part II" title="HDTune_Benchmark" width="116" height="94" class="alignnone size-thumbnail wp-image-3425" />HD Tune is a fantastic little utility that you can use to benchmark the DISK IO speed of your various drives, internal and external, fixed and USB, firewire, etc..  Other than using it to determine your fastest drives for moving your program files and temps to, I am just including it in this article because it is an awesome program that you will love.<br class="C" /></p>
<p><a href="http://www.hdtune.com/download.html" rel="nofollow" >Download HD Tune</a></p>
<h3>SpinRite</h3>
<p>This is the last step in this guide, and was the one thing that surprised me the most in terms of how much of a speed improvement I noticed after using it.  SpinRite is the most capable, thorough, and reliable utility that has ever been created for the long term maintenance, recovery, and repair of mass storage systems.   SpinRite is not a drive defragmenter. SpinRite operates with the drive&#8217;s built-in intelligence to reassign and relocate defective sectors without creating file system fragments. Thus, running SpinRite does not create fragments, but neither does it eliminate any that may exist before it was run. Unlike any other disk utility, SpinRite interfaces directly to the hard disk system’s hardware, rather than working through the system’s operating system or BIOS.  <a href="http://www.grc.com/sr/faq.htm" rel="nofollow" >FAQ</a>.</p>
<p class="anote">The way that we use SpinRite in this article is method #4, Drive Maintenance mode, which reads and writes and verifies every single sector and area of your hard drives, and improves the health of your hard drive a lot.  Even on my new 4K dell power laptop, this had a noticeable improvement on speed.  After running this 20+ hours for my fastest PC, I rebooted, defragged with jkdefrag, and that is the end of this article.</p>
<blockquote cite="http://www.grc.com/files/technote.pdf">
<p>
<h4>In case you don&#8217;t already know . . . What is SpinRite?</h4>
<p>SpinRite is a stand-alone DOS application that specializes in the recovery of marginally or completely unreadable hard and floppy disk data, and in the lifetime maintenance of PC mass storage devices. It earned its stripes many years ago by introducing the concept of non-destructive low-level reformatting and sector interleave optimization. Since then its capabilities have continued to broaden until it has become the premiere tool for disk data recovery and magnetic mass storage drive maintenance. Written in assembly language, SpinRite still performs as well on a clunky old 4.77 megahertz PC/XT as on a screaming 333 megahertz Pentium II.</p>
</p>
</blockquote>
<p> While SpinRite 6.0 is running, you can toggle through seven displays:<br />
<img src="http://uploads.askapache.com/2009/10/spinrite-4.png" width="480" height="267" alt="Graphic Status Display" title="spinrite 4 web cache" /><br />
<img src="http://uploads.askapache.com/2009/10/spinrite-5.png" width="480" height="267" alt="Real-Time Activities" title="spinrite 5 web cache" /><br />
<img src="http://uploads.askapache.com/2009/10/spinrite-6.png" width="480" height="267" alt="Technical Log" title="spinrite 6 web cache" /><br />
<img src="http://uploads.askapache.com/2009/10/spinrite-7.png" width="480" height="267" alt="S.M.A.R.T. System Monitor" title="spinrite 7 web cache" /><br />
<img src="http://uploads.askapache.com/2009/10/spinrite-8.png" width="480" height="267" alt="DynaStat Data Recovery" title="spinrite 8 web cache" /></p>
<p><a href="http://www.grc.com/cs/prepurch.htm" rel="nofollow" >Purchase and Download SpinRite</a></p>
<hr class="C" />
<hr class="C" />
<hr class="C" />
<p>More Reading</p>
<ul>
<li><a href="http://www.pcnet-online.com/picks/spinrite.htm" rel="nofollow" >PCNet File Catch &#8211; SpinRite 6.0</a></li>
<li><a href="http://www.linuxjournal.com/article/7684" rel="nofollow" >SpinRite 6.0 for Linux Users</a></li>
<li><a href="http://www.sysopt.com/tutorials/article.php/12034_3549006_1" rel="nofollow" >Anticipate Drive Problems Early with SpinRite v6.0</a></li>
<li><a href="http://www.blackviper.com/WinXP/supertweaks.htm" rel="nofollow" >Black Viper &#8211; Windows XP Super Tweaks</a></li>
<li><a href="http://www.blackviper.com/WinXP/custom_sc_bat_Pro.php" rel="nofollow" >Black Viper &#8211; Optimize your Services</a></li>
<li><a href="http://www.horstmann.com/bigj/help/windows/advanced.html" rel="nofollow" >Advanced Windows Shell Tutorial</a></li>
<li><a href="http://commandwindows.com/batch.htm" rel="nofollow" >Batch Files (Scripts) in Windows </a></li>
<li><a href="http://proton.pathname.com/fhs/" rel="nofollow" >File System Heirarchy</a></li>
<li><a href="http://www.grc.com/sn/sn-186.htm" rel="nofollow" >Steve Gibson discussing Defragmenting</a></li>
</ul>
<p><a href="http://www.askapache.com/windows/defrag-optimize-speed-xp.html"></a><a href="http://www.askapache.com/windows/defrag-optimize-speed-xp.html">Windows Optimization &#8211; Intense Part II</a> originally appeared on <cite>AskApache.com</cite> </p>]]></content:encoded>
			<wfw:commentRss>http://www.askapache.com/windows/defrag-optimize-speed-xp.html/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>mod_rewrite Fix for Caching Updated Files</title>
		<link>http://www.askapache.com/htaccess/mod_rewrite-fix-for-caching-updated-files.html</link>
		<comments>http://www.askapache.com/htaccess/mod_rewrite-fix-for-caching-updated-files.html#comments</comments>
		<pubDate>Sun, 30 Aug 2009 13:20:59 +0000</pubDate>
		<dc:creator>AskApache</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Cache]]></category>
		<category><![CDATA[DreamHost]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[Htaccess]]></category>
		<category><![CDATA[Mod_Rewrite]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Server Administration]]></category>
		<category><![CDATA[Web Design]]></category>
		<category><![CDATA[Web Hosting]]></category>
		<category><![CDATA[Webmaster]]></category>
		<category><![CDATA[XHTML]]></category>
		<category><![CDATA[askapache]]></category>
		<category><![CDATA[Bandwidth]]></category>
		<category><![CDATA[Cache-Control]]></category>
		<category><![CDATA[caching]]></category>
		<category><![CDATA[Cookies]]></category>
		<category><![CDATA[GET]]></category>
		<category><![CDATA[HTTP Headers]]></category>
		<category><![CDATA[httpd]]></category>
		<category><![CDATA[httpd.conf]]></category>
		<category><![CDATA[If-Modified-Since]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Last-Modified]]></category>
		<category><![CDATA[Redirect]]></category>
		<category><![CDATA[Rewrite Tricks]]></category>
		<category><![CDATA[rewritecond]]></category>
		<category><![CDATA[rewriterule]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[Source Code]]></category>
		<category><![CDATA[SPEED]]></category>
		<category><![CDATA[stat]]></category>
		<category><![CDATA[trick]]></category>

		<guid isPermaLink="false">http://www.askapache.com/htaccess/mod_rewrite-code-to-fix-caching-updated-files.html</guid>
		<description><![CDATA[<p>Web Developers sometimes use <code>file.ext?v=004</code> as a version control system to force visitors to use updated files.  <strong>This is terrible.</strong>  Instead link to <code>apache-003.css</code> and set it to be cached forever. When you change the file you just change the links to <code>apache-004.css</code>. That eliminates millions of bandwidth and resource robbing If-Modified-Since requests. You only need Apache with mod_rewrite, and 1-10 minutes!</p>]]></description>
			<content:encoded><![CDATA[<p><strong>Web Developers sometimes use</strong> <code>file.ext?v=137</code> as a <strong>version control system</strong> so they can force visitors to use an updated file.  <strong>This is so terrible</strong>.  Instead link to <code>apache-003.css</code> and set it to be cached forever. When you change the file you just change the links to <code>apache-004.css</code>.</p>
<h2>Raw Speed Benefit</h2>
<p>This eliminates millions of bandwidth and resource robbing <code>304 If-Modified-Since</code> requests.</p>
<hr />
<h2>Renaming links vs. Renaming files</h2>
<p>On the server my files are named <strong>apache.css</strong> and <strong>apache.js</strong>, but in the xhtml I point to them using the names <code>apache-113.css</code> and <code>apache-113.js</code>, after I change the file I just add 1 to the number, and the new file is cached. They are internally redirected to apache.css and apache.js (invisible to the user) The concept is similar to a &#8220;shortcut&#8221; in windows or a symlink in BSD.  The trick is that I never actually rename the files on the server.  I just rename them in the html.  That means <code>apache-135.css</code> is served from the file apache.css but the browser/cache only see and know about <code>apache-135.css</code>.</p>
<h2>XHTML</h2>
<p><strong>NOTE</strong>: You can do your own investigating of this sites source code and <a href="http://www.askapache.com/online-tools/http-headers-tool/">HTTP headers</a> to see this whole system in action</p>
<pre>&lt;link href=&quot;http://static.askapache.com/z/c/apache-0031.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; /&gt;
&lt;script src=&quot;http://static.askapache.com/z/j/apache-0031.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;</pre>
<h2>mod_rewrite code for htaccess or httpd.conf</h2>
<p><strong>Updated:</strong> 10/20/2008</p>
<pre>RewriteEngine On
RewriteBase /
RewriteCond %{THE_REQUEST} ^(GET|HEAD)\ /z/([a-z]+)/(.+)-([0-9]+)\.(js|css).*\ HTTP/ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .+ /z/%2/%3.%5 [NC,L]</pre>
<h3>Alternate mod_rewrite code</h3>
<pre>RewriteEngine On
RewriteBase /
RewriteRule ^([cij]+)(/?[a-z]*)/([a-z]+)-([0-9]+)\.([a-z]+)$ /$1$2/$3.$5 [L]</pre>
<h2>Ideal Caching Scheme</h2>
<p>Ok so you want the xhtml to be the only file that isn&#8217;t cached without being validated, its simple to <a href="http://www.askapache.com/htaccess/speed-up-sites-with-htaccess-caching.html" title="Speed Up Sites with htaccess Caching">setup your own caching scheme</a>.</p>
<h3>Bad Cache information for a file with the <code>?v=foo</code> hack</h3>
<blockquote><p>This object will be fresh for 1 week. It can be validated with Last-Modified. This object requests that a Cookie be set; this makes it and other pages affected automatically stale; clients must check them upon every request. Because it contains a query (&#8216;?&#8217;) in the URL, many caches will not keep this object.</p>
</blockquote>
<p><a href="http://www.askapache.com/htaccess/mod_rewrite-fix-for-caching-updated-files.html"></a><a href="http://www.askapache.com/htaccess/mod_rewrite-fix-for-caching-updated-files.html">mod_rewrite Fix for Caching Updated Files</a> originally appeared on <cite>AskApache.com</cite> </p>]]></content:encoded>
			<wfw:commentRss>http://www.askapache.com/htaccess/mod_rewrite-fix-for-caching-updated-files.html/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>An AskApache Plugin Upgrade to Rule them All</title>
		<link>http://www.askapache.com/wordpress/an-askapache-plugin-upgrade-to-rule-them-all.html</link>
		<comments>http://www.askapache.com/wordpress/an-askapache-plugin-upgrade-to-rule-them-all.html#comments</comments>
		<pubDate>Wed, 29 Jul 2009 17:59:07 +0000</pubDate>
		<dc:creator>AskApache</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Apache Modules]]></category>
		<category><![CDATA[Cache]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Htaccess]]></category>
		<category><![CDATA[Linux Unix BSD]]></category>
		<category><![CDATA[Mod_Rewrite]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Web Hosting]]></category>
		<category><![CDATA[Web Tools]]></category>
		<category><![CDATA[Webmaster]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[WordPress Plugins]]></category>
		<category><![CDATA[401]]></category>
		<category><![CDATA[404 Not Found]]></category>
		<category><![CDATA[admin]]></category>
		<category><![CDATA[Advanced]]></category>
		<category><![CDATA[askapache]]></category>
		<category><![CDATA[AskApache Google 404]]></category>
		<category><![CDATA[AskApache Password Protection]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[authorization]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[Cache-Control]]></category>
		<category><![CDATA[chmod]]></category>
		<category><![CDATA[compression]]></category>
		<category><![CDATA[Cookies]]></category>
		<category><![CDATA[debugging]]></category>
		<category><![CDATA[Dig]]></category>
		<category><![CDATA[Email]]></category>
		<category><![CDATA[errordocument]]></category>
		<category><![CDATA[Etags]]></category>
		<category><![CDATA[Examples]]></category>
		<category><![CDATA[FilesMatch]]></category>
		<category><![CDATA[Fsockopen]]></category>
		<category><![CDATA[GET]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[htaccess files]]></category>
		<category><![CDATA[htaccess tricks]]></category>
		<category><![CDATA[HTTP Headers]]></category>
		<category><![CDATA[httpd]]></category>
		<category><![CDATA[HTTPS SSL]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Last-Modified]]></category>
		<category><![CDATA[Logs]]></category>
		<category><![CDATA[mod_include]]></category>
		<category><![CDATA[Mod_Setenvif]]></category>
		<category><![CDATA[Networking]]></category>
		<category><![CDATA[Nice]]></category>
		<category><![CDATA[password]]></category>
		<category><![CDATA[password protection]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Port]]></category>
		<category><![CDATA[post]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[ram]]></category>
		<category><![CDATA[Redirect]]></category>
		<category><![CDATA[Rewrite Tricks]]></category>
		<category><![CDATA[rewritecond]]></category>
		<category><![CDATA[rewriterule]]></category>
		<category><![CDATA[Robot]]></category>
		<category><![CDATA[robots]]></category>
		<category><![CDATA[Scripts]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[server config]]></category>
		<category><![CDATA[servers]]></category>
		<category><![CDATA[SetEnvIf]]></category>
		<category><![CDATA[Shell]]></category>
		<category><![CDATA[Socket]]></category>
		<category><![CDATA[Source Code]]></category>
		<category><![CDATA[SSH]]></category>
		<category><![CDATA[SSI]]></category>
		<category><![CDATA[stat]]></category>
		<category><![CDATA[trick]]></category>
		<category><![CDATA[Username]]></category>
		<category><![CDATA[Wireshark]]></category>
		<category><![CDATA[WordPress Security]]></category>

		<guid isPermaLink="false">http://www.askapache.com/?p=3062</guid>
		<description><![CDATA[<p><a class="IFL" href="http://uploads.askapache.com/2009/07/apache-server-status.png"><img src="http://uploads.askapache.com/2009/07/apache-server-status-350x164.png" alt="apache-server-status" title="apache-server-status" width="350" height="164" class="alignnone size-medium wp-image-3070" /></a>So my blog as been rather quiet for almost a year now, and very few updates if any have been released for my Password Protection PLugin, my Google 404 Plugin, and definately not for my AskApache CrazyCache plugin, which I will be releasing last...  So for all of you who've helped me out by sending me suggestions and notifying me of errors and sticking with it...  Just wanted to <strong>say sorry about that, and thanks for all the great ideas.. </strong> Well, I've been sticking with it as well believe it our not.  I manage to get free days once in a while, and then its <strong>time to jam</strong>.<br class="C" /></p>]]></description>
			<content:encoded><![CDATA[<p><a href="http://uploads.askapache.com/2009/07/apache-server-status.png" rel="nofollow" class="IFL" ><img src="http://uploads.askapache.com/2009/07/apache-server-status-350x164.png" alt="An AskApache Plugin Upgrade to Rule them All" title="apache-server-status" width="350" height="164" class="alignnone size-medium wp-image-3070" /></a>So my blog as been rather quiet for almost a year now, and very few updates if any have been released for my Password Protection PLugin, my Google 404 Plugin, and definately not for my AskApache CrazyCache plugin, which I will be releasing last&#8230;  So for all of you who&#8217;ve helped me out by sending me suggestions and notifying me of errors and sticking with it&#8230;  Just wanted to <strong>say sorry about that, and thanks for all the great ideas.. </strong> Well, I&#8217;ve been sticking with it as well believe it our not.  I manage to get free days once in a while, and then its <strong>time to jam</strong>.</p>
<p>I&#8217;ve used just about every CMS/Blog/Forum/Trac/Gallery/etc) and really didn&#8217;t like a lot of the way they coded&#8230;  I could use php but I didn&#8217;t KNOW php.. so I&#8217;ve had to learn php also, and it was tough to learn the advanced class usage and all the other language specific (but similar) constructs for php.  It was especially difficult (but fun and challenging) to program so as to be compatible with php4 and php5 (Such is WordPress).    But I kept at it, and soon you can decide for yourself what to make of it.</p>
<p>I can code in plenty of languages (bash, lua, windows .bat and vbs,  ocaml, big fan of all things shell) and can work my way through C and even sorta somewhat with assembly.  Assembly is the hardest, by far,  I&#8217;m into easy and powerful languages like Python, Javascript, perl, php, ruby, and CGI. I&#8217;ve used PHP for a long time to do various things,  but never to build software projects like this.  Once I noticed WordPress&#8217;s core .php files and the excellent programming I wanted to try and learn hot to do it.   The WordPress code is some of the best I&#8217;ve seen.  It appears the way they built it was planned, and not just dreamt up while typing that I can&#8217;t help but do.    Every time I read through the core code I learn a new trick or very nice way to do something.  Those guys are really good, and I think WordPress is going to dominate for a long long time.</p>
<h2>The Strategy</h2>
<p>The Password Protection (passpro) plugin has a lot of complex stuff going on, especially for a newbie to PHP and WordPress like me, so after refactoring the whole thing at least 5 times I decided to modify my approach, and wrote the AskApache Google 404 Plugin as a way to practice on a simpler piece of code, while at the same time providing a plugin of value.   Eventually I stopped thinking I could just code the whole thing in one sit-down with a stream-of-consciousness, and had to instead modularize the code and focus in on each part before moving to the next (I go without a plan because its fun, just not the most productive, but again, I&#8217;m not a programmer in the scientific sense.).</p>
<p>So I decided I had to really learn how WordPress Plugins work, filters, hooks, actions, and basically comfortability at reverse-engineering code, (Im a beginner for the last time), and so with the upcoming release of the AskApache Google 404 Plugin I have succeeded in making an incredibly stable plugin.  That way I only have to worry about what the aapasspro plugin is doing, instead of trying to fit it into a framework.  </p>
<h2>AskApache Google 404 Upgrade</h2>
<p>I think its rather unusual to develop a nice plugin like this 404 handler merely for the purpose of improving upon another plugin, but hey it worked.  As of <em>08/03/2009 14:06PM EST</em> I have about 1 hour left of finishing touches to release this upgrade.  But as you cantell by my badly edited posts, I don&#8217;t have a lot of time to myself.  An hour here and there is about it.  So it could be up to 2 weeks before I actually have the time to commit the release to the repo.  On a sidenote, have you checked out <a href="http://windows7news.com/" rel="nofollow"  title="Windows 7 News">Windows 7 News</a>?  I&#8217;ve been contracted to do some technical work for them and thought they had an excellent site.</p>
<p><a href="http://uploads.askapache.com/2009/07/askapache-google-upgrade-ss1.png" rel="nofollow" ><img src="http://uploads.askapache.com/2009/07/askapache-google-upgrade-ss1-344x350.png" alt="An AskApache Plugin Upgrade to Rule them All" title="askapache-google-upgrade-ss1" width="344" height="350" class="alignnone size-medium wp-image-3139" /></a></p>
<p><a href="http://uploads.askapache.com/2009/07/askapache-google-upgrade-ss2.png" rel="nofollow" ><img src="http://uploads.askapache.com/2009/07/askapache-google-upgrade-ss2-293x350.png" alt="An AskApache Plugin Upgrade to Rule them All" title="askapache-google-upgrade-ss2" width="293" height="350" class="alignnone size-medium wp-image-3138" /></a></p>
<p>But keep in mind, the 404 PLugin is just where I practice for the passpro plugin, which truly does have features that no other software like it has ever had.  I understand the technology behind this plugin, and know it would really have a great impact on improving the Web (esp. WordPress) for all of us, I&#8217;ve just had to learn how to make it.</p>
<h2>AskApache Password Protection</h2>
<p>Probably still a couple weeks away, this plugin is the ultimate culmination of apache hackers dreams, at least those on shared servers (who may be interested in learning how to bypass security of said servers)..  So this is something I have much too fun with doing what I like to do.. network/protocol-level security.  I&#8217;ve examined the source code for many software packages that I use or have used to audit a server&#8217;s security, and this simple php plugin in most instances can enumerate with accuraccy most of the server&#8217;s setup in about a minute.  The catch (and the file permission problems I had to find a workaround too) is that this software is launched on the server, not remotely against the server.</p>
<p>Some of the software I examined was whiskers, nessus, nmap, hping, mozilla source, wireshark, ncftp, netcat, etc..  The closest comparison to the socket-level class I&#8217;ve hacked together to those is wireshark.  Except that wireshark only interprets (captures) the data passing over the wire, while this class does that and in fact sends and receives the data like netcat or nmap.  Its really more similar to metasploit, and can easily be used to send hex, binary, ascii, or any type of payload to the remote or local host.</p>
<h2>The Upgrades Begin</h2>
<p>Well I started working on them a long time ago.  Both the Password Protection plugin and the Google 404 plugin needed serious work.   And I finally have it all figured out.  Essentially I would work on one and finish an upgrade, but I just wasn&#8217;t happy with it and I wold start all over again, refactoring the code.   So as I put the finishing touches on those 2 plugins keep an eye out.  They are major upgrades.   I was able to meet all the goals I had for them, and came up with a lot of more improvements during the process.One of the main things I needed was a socket-level class to perform all kinds of checks and tests on.  I need this also for my crazy cache plugin, which my blog is currently using ,  and I have a 2 more really nice pplugins I use that also needed  access to a network class.  I wrote about what I was doing with fsockopen, and I&#8217;ve been improving on that example ever since.  I use this class to do some really powerful and exciting stuff, but you&#8217;ll see it soon enough.  As an indication of &#8216;getting it right&#8217; for the Password Protection plugin, the plugin will now work on Windows, Apache, IIS, Lighthttpd, and will even work running on a blackberry web server.  So now everyone using wordpress can at least get some security()</p>
<p class="enote">Many of the the other improvements focus on using the fsockopen class and .htaccess tricks to basically enumerate and discover all the different capabilities of your particular server;  That way you can learn about all the features and security that are possible for your specific server, and the securty modules wi8ll be geared for that as well.  FINALLY this plugin is going to be stable, and I just cant wait to see how people react when they learn all great capability their Apache-based Server has that they didn&#8217;t have a clue about.   Its amazing in that sense, and hackers will love theh way it works.. but your server admins will love it even more because its entirely 100% focused on helping you to set your site up (if you have Apache) to keep spammers out, to keep virii-serving robots and their log-hogging exploit requests and CPU/Mem robiing 404 errors off of your servers for real.  This will have a noticeable affect to whoever is running the server.   As you can tell.. I am pumped!</br></p>
<hr class="C" />
Apache is easy to configure and use, but only when you have root access.  Most people on shared and private hosting aren&#8217;t even able to view the main config file, let alone execute the Apache binaries to see what features are available and what configuration is being used.<br class="C" /></p>
<p>Apache can only be influenced by the main server configs and by .htaccess files.  Not by php, not by perl, and the main configs are almost never accessible to the masses.  But .htaccess files are.  And many hosting providers allow and enable .htaccess files, a configuration file for your web server.  The advanced features and capabilities of Apache were out of reach for most of us, it just wasn&#8217;t possible to enumerate or access, and most hosting providers are infamous for their lack of .htaccess (customer) support.  This plugin goes around those problems to give the power back to the people.<br class="C" /></p>
<p>y creating custom .htaccess files containing unpublished .htaccess tricks and techniques and combining that with the use of socket-level networking from WordPress (PHP) using <a href="http://www.askapache.com/php/fsockopen-socket.html">fsockopen</a>, we can effectively enumerate and discover an incredible amount of features and settings you will be able to control and use with this plugin.</p>
<p>Here are a few examples of the capabilities of this plugin, some of which I believe no other software can do..  <em>(Open source free to copy!)</em>.</p>
<ol>
<li>Current Version of Apache (<strong>Down to the API Version</strong>)</li>
<li>List of <strong>ALL Modules currently enabled</strong> by Apache (Such as Mod_Rewrite)</li>
<li>List of <strong>ALL Directives enabled by EACH enabled Module.</strong></li>
<li>Enumerate .htaccess Overrides, Context Permissions</li>
<li>Test for any builtin Handlers (like the <a href="http://uploads.askapache.com/2009/07/apache-server-status.png" rel="nofollow" >status handler screenshot</a>)</li>
<li>Configure SSI (<a href="http://www.askapache.com/htaccess/advanced-htaccess-ssi.html#htaccess-ssi-security">http://www.askapache.com/htaccess/advanced-htaccess-ssi.html#htaccess-ssi-security</a>)</li>
</ol>
<blockquote cite="http://www.askapache.com/htaccess/password-protection-plugin-status.html"><div class="inote"><cite><a href="http://www.askapache.com/htaccess/password-protection-plugin-status.html"></a></cite>
<p><strong>March 1, 2009</strong><br /><strong>I would focus on the method that WordPress uses</strong>.  The code they have now (2.8 bleeding-edge) still isn&#8217;t where it needs to be, but this is some difficult stuff and <strong>they have a brilliant start, it&#8217;ll work.. just a question of when</strong>.</p>
<p><a href="http://uploads.askapache.com/2009/03/apache-security-model-tall1.png" rel="nofollow" class="IFL" ><img src="http://uploads.askapache.com/2009/03/apache-security-model-tall1-250x123.png" alt="Apache Security Model - In Color" title="apache-security-model-wide" width="250" height="123" /></a><strong>The main issue</strong> with the password protection plugin working for some people and not others is due to <a href="http://www.askapache.com/security/chmod-stat.html"title="detailed file permission article" >file permission configurations</a>.  The plugin attempts to write/modify files in your blog&#8217;s root directory.<br class="C" /></p>
</div>
</blockquote>
<hr class="C" />
<blockquote cite="http://www.askapache.com/htaccess/htaccess-plugin-blocks-spam-hackers-and-password-protects-blog.html"><div class="inote"><cite><a href="http://www.askapache.com/htaccess/htaccess-plugin-blocks-spam-hackers-and-password-protects-blog.html"></a></cite>
<p><strong>November 05, 2008</strong><br />To make a long story short, I downloaded each major release of the apache httpd source code starting at version 1.3.0 and finishing with version 2.2.11, I then compiled each version and built a HTTPD from source for all these apache versions.</p>
<div>
<div style="width:100px;overflow:hidden;float:left;">
<ul>
<li>1.3.0</li>
<li>1.3.1</li>
<li>1.3.11</li>
<li>1.3.12</li>
<li>1.3.14</li>
<li>1.3.17</li>
<li>1.3.19</li>
<li>1.3.2</li>
<li>1.3.20</li>
<li>1.3.22</li>
<li>1.3.23</li>
<li>1.3.24</li>
<li>1.3.27</li>
<li>1.3.28</li>
</ul>
</div>
<div style="width:100px;overflow:hidden;float:left;">
<ul>
<li>1.3.29</li>
<li>1.3.3</li>
<li>1.3.31</li>
<li>1.3.32</li>
<li>1.3.33</li>
<li>1.3.34</li>
<li>1.3.35</li>
<li>1.3.36</li>
<li>1.3.37</li>
<li>1.3.39</li>
<li>1.3.4</li>
<li>1.3.41</li>
<li>1.3.6</li>
<li>1.3.9</li>
</ul>
</div>
<div style="width:100px;overflow:hidden;float:left;">
<ul>
<li>2.0.35</li>
<li>2.0.36</li>
<li>2.0.39</li>
<li>2.0.40</li>
<li>2.0.42</li>
<li>2.0.43</li>
<li>2.0.44</li>
<li>2.0.45</li>
<li>2.0.46</li>
<li>2.0.47</li>
<li>2.0.48</li>
<li>2.0.49</li>
<li>2.0.50</li>
<li>2.0.51</li>
</ul>
</div>
<div style="width:150px;overflow:hidden;float:left;">
<ul>
<li>2.0.52</li>
<li>2.0.53</li>
<li>2.0.54</li>
<li>2.0.55</li>
<li>2.0.58</li>
<li>2.0.59</li>
<li>2.0.61</li>
<li>2.0.63</li>
<li>2.1.3-beta</li>
<li>2.1.6-alpha</li>
<li>2.1.7-beta</li>
<li>2.1.8-beta</li>
<li>2.1.9-beta</li>
</ul>
</div>
<div style="width:100px;overflow:hidden;float:left;">
<ul>
<li>2.2.0</li>
<li>2.2.10</li>
<li>2.2.2</li>
<li>2.2.3</li>
<li>2.2.4</li>
<li>2.2.6</li>
<li>2.2.8</li>
<li>2.2.9</li>
<li><strong>2.2.10</strong></li>
<li><strong>2.2.11</strong></li>
</ul>
</div>
<p><br class="C" /></div>
<p>Then I went through each version and determined the compatible modules for that version, and I&#8217;m pretty confident that I was also able to find each and every directive allowed by the compatible modules for that version (including core directives).  See <a href="http://www.askapache.com/htaccess/htaccess.html#htaccess-directives">.htaccess directive list</a>.  Basically I can now test a server using a variety of methods and determine almost 100% accurately what version of Apache (down to the API) is running, what modules (and versions) are enabled, and each and every directive that is allowed or disallowed for that version.  So this is so awesome because now we can enable all sorts of additional security features.</p>
</div>
</blockquote>
<hr class="C" />
<blockquote cite="http://www.askapache.com/htaccess/htaccess.html#htaccess-modules"><p><cite><a href="http://www.askapache.com/htaccess/htaccess.html#htaccess-modules">Htaccess enabled Modules</a></cite>
<p>Here are most of the modules that come with Apache.  Each one can have new commands that can be used in .htaccess file scopes.</p>
<p><a href="http://www.askapache.com/servers/mod_actions.c.html">mod_actions</a>, <a href="http://www.askapache.com/servers/mod_alias.c.html">mod_alias</a>, <a href="http://www.askapache.com/servers/mod_asis.c.html">mod_asis</a>, <a href="http://www.askapache.com/servers/mod_auth_basic.c.html">mod_auth_basic</a>, <a href="http://www.askapache.com/servers/mod_auth_digest.c.html">mod_auth_digest</a>, <a href="http://www.askapache.com/servers/mod_authn_anon.c.html">mod_authn_anon</a>, <a href="http://www.askapache.com/servers/mod_authn_dbd.c.html">mod_authn_dbd</a>, <a href="http://www.askapache.com/servers/mod_authn_dbm.c.html">mod_authn_dbm</a>, <a href="http://www.askapache.com/servers/mod_authn_default.c.html">mod_authn_default</a>, <a href="http://www.askapache.com/servers/mod_authn_file.c.html">mod_authn_file</a>, <a href="http://www.askapache.com/servers/mod_authz_dbm.c.html">mod_authz_dbm</a>, <a href="http://www.askapache.com/servers/mod_authz_default.c.html">mod_authz_default</a>, <a href="http://www.askapache.com/servers/mod_authz_groupfile.c.html">mod_authz_groupfile</a>, <a href="http://www.askapache.com/servers/mod_authz_host.c.html">mod_authz_host</a>, <a href="http://www.askapache.com/servers/mod_authz_owner.c.html">mod_authz_owner</a>, <a href="http://www.askapache.com/servers/mod_authz_user.c.html">mod_authz_user</a>, <a href="http://www.askapache.com/servers/mod_autoindex.c.html">mod_autoindex</a>, <a href="http://www.askapache.com/servers/mod_cache.c.html">mod_cache</a>, <a href="http://www.askapache.com/servers/mod_cern_meta.c.html">mod_cern_meta</a>, <a href="http://www.askapache.com/servers/mod_cgi.c.html">mod_cgi</a>, <a href="http://www.askapache.com/servers/mod_dav.c.html">mod_dav</a>, <a href="http://www.askapache.com/servers/mod_dav_fs.c.html">mod_dav_fs</a>, <a href="http://www.askapache.com/servers/mod_dbd.c.html">mod_dbd</a>, <a href="http://www.askapache.com/servers/mod_deflate.c.html">mod_deflate</a>, <a href="http://www.askapache.com/servers/mod_dir.c.html">mod_dir</a>, <a href="http://www.askapache.com/servers/mod_disk_cache.c.html">mod_disk_cache</a>, <a href="http://www.askapache.com/servers/mod_dumpio.c.html">mod_dumpio</a>, <a href="http://www.askapache.com/servers/mod_env.c.html">mod_env</a>, <a href="http://www.askapache.com/servers/mod_expires.c.html">mod_expires</a>, <a href="http://www.askapache.com/servers/mod_ext_filter.c.html">mod_ext_filter</a>, <a href="http://www.askapache.com/servers/mod_file_cache.c.html">mod_file_cache</a>, <a href="http://www.askapache.com/servers/mod_filter.c.html">mod_filter</a>, <a href="http://www.askapache.com/servers/mod_headers.c.html">mod_headers</a>, <a href="http://www.askapache.com/servers/mod_ident.c.html">mod_ident</a>, <a href="http://www.askapache.com/servers/mod_imagemap.c.html">mod_imagemap</a>, <a href="http://www.askapache.com/servers/mod_include.c.html">mod_include</a>, <a href="http://www.askapache.com/servers/mod_info.c.html">mod_info</a>, <a href="http://www.askapache.com/servers/mod_log_config.c.html">mod_log_config</a>, <a href="http://www.askapache.com/servers/mod_log_forensic.c.html">mod_log_forensic</a>, <a href="http://www.askapache.com/servers/mod_logio.c.html">mod_logio</a>, <a href="http://www.askapache.com/servers/mod_mem_cache.c.html">mod_mem_cache</a>, <a href="http://www.askapache.com/servers/mod_mime.c.html">mod_mime</a>, <a href="http://www.askapache.com/servers/mod_mime_magic.c.html">mod_mime_magic</a>, <a href="http://www.askapache.com/servers/mod_negotiation.c.html">mod_negotiation</a>, <a href="http://www.askapache.com/servers/mod_proxy.c.html">mod_proxy</a>, <a href="http://www.askapache.com/servers/mod_proxy_ajp.c.html">mod_proxy_ajp</a>, <a href="http://www.askapache.com/servers/mod_proxy_balancer.c.html">mod_proxy_balancer</a>, <a href="http://www.askapache.com/servers/mod_proxy_connect.c.html">mod_proxy_connect</a>, <a href="http://www.askapache.com/servers/mod_proxy_ftp.c.html">mod_proxy_ftp</a>, <a href="http://www.askapache.com/servers/mod_proxy_http.c.html">mod_proxy_http</a>, <a href="http://www.askapache.com/servers/mod_rewrite.c.html">mod_rewrite</a>, <a href="http://www.askapache.com/servers/mod_setenvif.c.html">mod_setenvif</a>, <a href="http://www.askapache.com/servers/mod_speling.c.html">mod_speling</a>, <a href="http://www.askapache.com/servers/mod_ssl.c.html">mod_ssl</a>, <a href="http://www.askapache.com/servers/mod_status.c.html">mod_status</a>, <a href="http://www.askapache.com/servers/mod_substitute.c.html">mod_substitute</a>, <a href="http://www.askapache.com/servers/mod_unique_id.c.html">mod_unique_id</a>, <a href="http://www.askapache.com/servers/mod_userdir.c.html">mod_userdir</a>, <a href="http://www.askapache.com/servers/mod_usertrack.c.html">mod_usertrack</a>, <a href="http://www.askapache.com/servers/mod_version.c.html">mod_version</a>, <a href="http://www.askapache.com/servers/mod_vhost_alias.c.html">mod_vhost_alias</a></p>
</blockquote>
<hr class="C" />
<hr class="C" />
<h2>Debugging HTTP protocol</h2>
<p>Check this out!  I&#8217;m particularly happy about this feature, which outputs an exact trace of any requests made by the plugin (such as during the testing phase) by saving the actual raw data sent out on the wire using fsockopen, RX and TX.  This is useful for a number of reasons, viewing your headers, finding Redirect Loops, testing RewriteRules, and following the request hop-by-hop for debugging.  The below example shows 2 requests for 2 URIs.  The first URI is protected using Digest Authentication, the 2nd shows Basic.</p>
<pre> ______________
|  RAW TRACE   |
==================================================================================================================================
GET /htaccess/index.txt?testing=query HTTP/1.1
Host: www.askapache.com
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1) AA_PassPro/1.9 (http://www.askapache.com/)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: close
Referer: http://www.askapache.com/
&nbsp;
HTTP/1.1 401 Authorization Required
Date: Wed, 22 Jul 2009 06:29:58 GMT
Server: Apache
WWW-Authenticate: Digest realm=&quot;do or die&quot;, nonce=&quot;03328f3ec7c7b&quot;, algorithm=MD5, domain=&quot;/&quot;, qop=&quot;auth&quot;
Accept-Ranges: bytes
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 882
Connection: close
Content-Type: text/html; charset=UTF-8
&nbsp;
GET /htaccess/index.txt?testing=query HTTP/1.1
Host: www.askapache.com
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1) AA_PassPro/1.9 (http://www.askapache.com/)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: close
Referer: http://www.askapache.com/
Authorization: Digest username=&quot;test&quot;,realm=&quot;do or die&quot;,nonce=&quot;03328f3ec7c7b&quot;,uri=&quot;/htaccess/index.txt?testing=query&quot;,
cnonce=&quot;82d057852a9dc497&quot;,nc=00000001,algorithm=MD5,response=&quot;9d476e9ea3&quot;,qop=&quot;auth&quot;
&nbsp;
HTTP/1.1 200 OK
Date: Wed, 22 Jul 2009 06:29:58 GMT
Server: Apache
Authentication-Info: rspauth=&quot;9051b01ee26dd62b3e2b40dada694f45&quot;, cnonce=&quot;82d057852a9dc497&quot;, nc=00000001, qop=auth
Last-Modified: Tue, 21 Jul 2009 23:56:00 GMT
Accept-Ranges: bytes
Cache-Control: max-age=3600
Expires: Wed, 22 Jul 2009 07:29:58 GMT
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 27
Connection: close
Content-Type: text/plain; charset=UTF-8
&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;&#96;`
&nbsp;
 ______________
|  RAW TRACE   |
==================================================================================================================================
GET /htaccess/po.txt?testing=query HTTP/1.1
Host: www.askapache.com
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1) AA_PassPro/1.9 (http://www.askapache.com/)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: close
Referer: http://www.askapache.com/
&nbsp;
HTTP/1.1 401 Authorization Required
Date: Wed, 22 Jul 2009 06:29:58 GMT
Server: Apache
WWW-Authenticate: Basic realm=&quot;Po Pimping&quot;
Accept-Ranges: bytes
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 878
Connection: close
Content-Type: text/html; charset=UTF-8
&nbsp;
GET /htaccess/po.txt?testing=query HTTP/1.1
Host: www.askapache.com
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1) AA_PassPro/1.9 (http://www.askapache.com/)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: close
Referer: http://www.askapache.com/
Authorization: Basic adfAGAltcA==
&nbsp;
HTTP/1.1 200 OK
Date: Wed, 22 Jul 2009 06:29:58 GMT
Server: Apache
Last-Modified: Wed, 22 Jul 2009 05:54:39 GMT
Accept-Ranges: bytes
Cache-Control: max-age=3600
Expires: Wed, 22 Jul 2009 07:29:58 GMT
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 27
Connection: close
Content-Type: text/plain; charset=UTF-8
&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;`&#96;&#96;`</pre>
<h2>.htaccess Directives</h2>
<p>AcceptFilter, AcceptMutex, AcceptPathInfo, AccessFileName, Action, AddAlt, AddAltByEncoding, AddAltByType, AddCharset, AddDefaultCharset, AddDescription, AddEncoding, AddHandler, AddIcon, AddIconByEncoding, AddIconByType, AddInputFilter, AddLanguage, AddModuleInfo, AddOutputFilter, AddOutputFilterByType, AddType, Alias, AliasMatch, AllowCONNECT, AllowEncodedSlashes, AllowOverride, Anonymous, Anonymous_Authoritative, Anonymous_LogEmail, Anonymous_MustGiveEmail, Anonymous_NoUserID, Anonymous_NoUserId, Anonymous_VerifyEmail, AssignUserId, AuthAuthoritative, AuthBasicAuthoritative, AuthBasicProvider, AuthDBDUserPWQuery, AuthDBDUserRealmQuery, AuthDBM, AuthDBMAuthoritative, AuthDBMGroupFile, AuthDBMType, AuthDBMUserFile, AuthDefaultAuthoritative, AuthDigestAlgorithm, AuthDigestDomain, AuthDigestFile, AuthDigestGroupFile, AuthDigestNcCheck, AuthDigestNonceFormat, AuthDigestNonceLifetime, AuthDigestProvider, AuthDigestQop, AuthDigestShmemSize, AuthGroupFile, AuthLDAPAuthzEnabled, AuthLDAPBindDN, AuthLDAPBindON, AuthLDAPBindPassword, AuthLDAPCharsetConfig, AuthLDAPCompareDNOnServer, AuthLDAPDereferenceAliases, AuthLDAPEnabled, AuthLDAPFrontPageHack, AuthLDAPGroupAttribute, AuthLDAPGroupAttributeIsDN, AuthLDAPRemoteUserAttribute, AuthLDAPRemoteUserIsDN, AuthLDAPStartTLS, AuthLDAPURL, AuthLDAPUrl, AuthName, AuthType, AuthUserFile, AuthzDBMAuthoritative, AuthzDBMType, AuthzDefaultAuthoritative, AuthzGroupFileAuthoritative, AuthzLDAPAuthoritative, AuthzOwnerAuthoritative, AuthzUserAuthoritative, BS2000Account, BalancerMember, BrowserMatch, BrowserMatchNoCase, BufferedLogs, CGIMapExtension, CacheDefaultExpire, CacheDirLength, CacheDirLevels, CacheDisable, CacheEnable, CacheExpiryCheck, CacheFile, CacheForceCompletion, CacheGcClean, CacheGcDaily, CacheGcInterval, CacheGcMemUsage, CacheGcUnused, CacheIgnoreCacheControl, CacheIgnoreHeaders, CacheIgnoreNoLastMod, CacheLastModifiedFactor, CacheMaxExpire, CacheMaxFileSize, CacheMaxStreamingBuffer, CacheMinFileSize, CacheNegotiatedDocs, CacheRoot, CacheSize, CacheStoreNoStore, CacheStorePrivate, CacheTimeMargin, CharsetDefault, CharsetOptions, CharsetSourceEnc, CheckCaseOnly, CheckSpelling, ChildPerUserId, ContentDigest, CookieDomain, CookieExpires, CookieLog, CookieName, CookieStyle, CookieTracking, CoreDumpDirectory, CustomLog, DAV, DAVDepthInfinity, DAVGenericLockDB, DAVMinTimeout, DBDExptime, DBDKeep, DBDMax, DBDMin, DBDParams, DBDPersist, DBDPrepareSQL, DBDriver, Dav, DavDepthInfinity, DavGenericLockDB, DavLockDB, DavMinTimeout, DefaultIcon, DefaultLanguage, DefaultType, DeflateBufferSize, DeflateCompressionLevel, DeflateFilterNote, DeflateMemLevel, DeflateWindowSize, Directory, DirectoryIndex, DirectoryMatch, DirectorySlash, DocumentRoot, DumpIOInput, DumpIOOutput, EnableExceptionHook, EnableMMAP, EnableSendfile, ErrorDocument, ErrorLog, Example, ExpiresActive, ExpiresByType, ExpiresDefault, ExtFilterDefine, ExtFilterOptions, ExtendedStatus, FancyIndexing, FileETag, Files, FilesMatch, FilterChain, FilterDeclare, FilterProtocol, FilterProvider, FilterTrace, ForceLanguagePriority, ForceType, ForensicLog, GprofDir, GracefulShutdownTimeout, Group, Header, HeaderName, HostNameLookups, HostnameLookups, ISAIPFakeAsync, ISAPIAppendLogToErrors, ISAPIAppendLogToQuery, ISAPICacheFile, ISAPIFakeAsync, ISAPILogNotSupported, ISAPIReadAheadBuffer, IdentityCheck, IdentityCheckTimeout, IfDefine, IfModule, IfVersion, ImapBase, ImapDefault, ImapMenu, Include, IndexIgnore, IndexOptions, IndexOrderDefault, IndexStyleSheet, KeepAlive, KeepAliveTimeout, LDAPCacheEntries, LDAPCacheTTL, LDAPCertDBPath, LDAPConnectionTimeout, LDAPOpCacheEntries, LDAPOpCacheTTL, LDAPSharedCacheFile, LDAPSharedCacheSize, LDAPTrustedClientCert, LDAPTrustedGlobalCert, LDAPTrustedMode, LDAPVerifyServerCert, LanguagePriority, Limit, LimitExcept, LimitInternalRecursion, LimitRequestBody, LimitRequestFields, LimitRequestFieldsize, LimitRequestLine, LimitXMLRequestBody, Listen, ListenBacklog, LoadFile, LoadModule, Location, LocationMatch, LockFile, LogFormat, LogLevel, MCacheMaxObjectCount, MCacheMaxObjectSize, MCacheMaxStreamingBuffer, MCacheMinObjectSize, MCacheRemovalAlgorithm, MCacheSize, MMapFile, MaxClients, MaxKeepAliveRequests, MaxMemFree, MaxRequestsPerChild, MaxSpareServers, MaxSpareThreads, MaxSpareThreadsPerChild, MaxThreads, MetaDir, MetaFiles, MetaSuffix, MimeMagicFile, MinSpareServers, MinSpareThreads, ModMimeUsePathInfo, MultiviewsMatch, NWSSLTrustedCerts, NWSSLUpgradeable, NameVirtualHost, NoProxy, NumServers, Options, PassEnv, PerlAccessHandler, PerlAuthenHandler, PerlAuthzHandler, PerlChildExitHandler, PerlChildInitHandler, PerlCleanupHandler, PerlDispatchHandler, PerlFixupHandler, PerlFreshRestart, PerlHandler, PerlHeaderParserHandler, PerlInitHandler, PerlLogHandler, PerlModule, PerlPassEnv, PerlPostReadRequestHandler, PerlRequire, PerlRestartHandler, PerlSendHeader, PerlSetEnv, PerlSetVar, PerlSetupEnv, PerlTaintCheck, PerlTransHandler, PerlTypeHandler, PerlWarn, PidFile, Port, Protocol, ProtocolEcho, Proxy, ProxyBadHeader, ProxyBlock, ProxyDomain, ProxyErrorOverride, ProxyFtpDirCharset, ProxyIOBufferSize, ProxyMatch, ProxyMaxForwards, ProxyPass, ProxyPassInterpolateEnv, ProxyPassMatch, ProxyPassReverse, ProxyPassReverseCookieDomain, ProxyPassReverseCookiePath, ProxyPreserveHost, ProxyReceiveBufferSize, ProxyRemote, ProxyRemoteMatch, ProxyRequests, ProxySet, ProxyStatus, ProxyTimeout, ProxyVia, RLimitCPU, RLimitMEM, RLimitNPROC, ReadmeName, Redirect, RedirectMatch, RedirectPermanent, RedirectTemp, RemoveCharset, RemoveEncoding, RemoveHandler, RemoveInputFilter, RemoveLanguage, RemoveOutputFilter, RemoveType, RequestHeader, Require, RewriteBase, RewriteCond, RewriteEngine, RewriteLock, RewriteLog, RewriteLogLevel, RewriteMap, RewriteOptions, RewriteRule, SSIAccessEnable, SSIEndTag, SSIErrorMsg, SSIStartTag, SSITimeFormat, SSIUndefinedEcho, SSLCACertificateFile, SSLCACertificatePath, SSLCADNRequestFile, SSLCADNRequestPath, SSLCARevocationFile, SSLCARevocationPath, SSLCertificateChainFile, SSLCertificateFile, SSLCertificateKeyFile, SSLCipherSuite, SSLCryptoDevice, SSLEngine, SSLHonorCipherOrder, SSLLog, SSLLogLevel, SSLMutex, SSLOptions, SSLPassPhraseDialog, SSLProtocol, SSLProxyCACertificateFile, SSLProxyCACertificatePath, SSLProxyCARevocationFile, SSLProxyCARevocationPath, SSLProxyCipherSuite, SSLProxyEngine, SSLProxyMachineCertificateFile, SSLProxyMachineCertificatePath, SSLProxyProtocol, SSLProxyVerify, SSLProxyVerifyDepth, SSLRandomSeed, SSLRequire, SSLRequireSSL, SSLSessionCache, SSLSessionCacheTimeout, SSLUserName, SSLVerifyClient, SSLVerifyDepth, Satisfy, ScoreBoardFile, Script, ScriptAlias, ScriptAliasMatch, ScriptInterpreterSource, ScriptLog, ScriptLogBuffer, ScriptLogLength, ScriptStock, SecureListen, SendBufferSize, ServerAdmin, ServerAlias, ServerLimit, ServerName, ServerPath, ServerRoot, ServerSignature, ServerTokens, SetEnv, SetEnvIf, SetEnvIfNoCase, SetHandler, SetInputFilter, SetOutputFilter, StartServers, StartThreads, Substitute, SuexecUserGroup, ThreadLimit, ThreadStackSize, ThreadsPerChild, TimeOut, Timeout, TraceEnable, TransferLog, TypeAuthDBMUserFile, TypesConfig, UnsetEnv, UseCanonicalName, UseCanonicalPhysicalPort, User, UserDir, VirtualDocumentRoot, VirtualDocumentRootIP, VirtualHost, VirtualScriptAlias, VirtualScriptAliasIP, Win32DisableAcceptEx, XBitHack, allow, deny, order, php_admin_flag, php_admin_value, php_flag, php_value</p>
<p class="anote">You can view the <a href="http://www.askapache.com/htaccess/htaccess-security-block-spam-hackers.html">plugins home page</a>, <a href="http://www.askapache.com/wordpress/htaccess-password-protect.html#aadl">old</a>, or <a href="http://wordpress.org/extend/plugins/askapache-password-protect/" rel="nofollow" >view it on the wordpress.org site</a>.</p>
<p><a href="http://www.askapache.com/wordpress/an-askapache-plugin-upgrade-to-rule-them-all.html"></a><a href="http://www.askapache.com/wordpress/an-askapache-plugin-upgrade-to-rule-them-all.html">An AskApache Plugin Upgrade to Rule them All</a> originally appeared on <cite>AskApache.com</cite> </p>]]></content:encoded>
			<wfw:commentRss>http://www.askapache.com/wordpress/an-askapache-plugin-upgrade-to-rule-them-all.html/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>DNS Round Robin Configuration using Rsync over SSH</title>
		<link>http://www.askapache.com/linux-unix/dns-round-robin-rsync-over-ssh.html</link>
		<comments>http://www.askapache.com/linux-unix/dns-round-robin-rsync-over-ssh.html#comments</comments>
		<pubDate>Tue, 14 Apr 2009 05:46:20 +0000</pubDate>
		<dc:creator>AskApache</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[Apache Modules]]></category>
		<category><![CDATA[Cache]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[Linux Unix BSD]]></category>
		<category><![CDATA[Web Hosting]]></category>
		<category><![CDATA[500]]></category>
		<category><![CDATA[503]]></category>
		<category><![CDATA[admin]]></category>
		<category><![CDATA[askapache]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[Bandwidth]]></category>
		<category><![CDATA[caching]]></category>
		<category><![CDATA[CNAME]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Dig]]></category>
		<category><![CDATA[DNS]]></category>
		<category><![CDATA[DreamHost]]></category>
		<category><![CDATA[experiments]]></category>
		<category><![CDATA[GET]]></category>
		<category><![CDATA[HostGator]]></category>
		<category><![CDATA[HowTo]]></category>
		<category><![CDATA[Htaccess]]></category>
		<category><![CDATA[HTTPS SSL]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Logs]]></category>
		<category><![CDATA[Networking]]></category>
		<category><![CDATA[Nice]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Port]]></category>
		<category><![CDATA[Powweb]]></category>
		<category><![CDATA[Prompt]]></category>
		<category><![CDATA[PS1]]></category>
		<category><![CDATA[Round Robin]]></category>
		<category><![CDATA[rsync]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[servers]]></category>
		<category><![CDATA[Shell]]></category>
		<category><![CDATA[SPEED]]></category>
		<category><![CDATA[SSH]]></category>
		<category><![CDATA[SSI]]></category>
		<category><![CDATA[stat]]></category>
		<category><![CDATA[trick]]></category>

		<guid isPermaLink="false">http://www.askapache.com/?p=2540</guid>
		<description><![CDATA[<p><a class="IFL" href="http://www.askapache.com/linux-unix/dns-round-robin-rsync-over-ssh.html" id="id12"></a><strong>The goal is to add the HostGator server</strong> to be an exact mirror of the static.askapache.com domain, then to add that server as a 2nd A record to my DNS zone.  That way half the visitors to the size will be taking up resources and bandwidth on the <a href="http://secure.hostgator.com/cgi-bin/affiliates/clickthru.cgi?id=AskApache-rrdns">HostGator</a> server instead of mine.<br /><br /><strong>Round Robin A records</strong> in DNS are intended to evenly distribute queries between each host of the same name.  Using some tricks straight out of a hackers toolbox we can verify if the distribution is taking place.  (<a href="http://www.askapache.com/linux-unix/dns-round-robin-rsync-over-ssh.html#dns-robin-works">It is.</a>)  <br class="C" /></p>]]></description>
			<content:encoded><![CDATA[<p>My traffic is growing, alot, and I need to plan how I&#8217;m going to maintain scalability, high availability, and redundancy.   Scalability is an application&#8217;s ability to support a growing number of users. High availability can be defined as redundancy or speed.  I decided to setup <a href="#dns-robin-round" rel="nofollow" >Round Robin DNS</a> for <a href="http://static.askapache.com/" rel="nofollow" >static.askapache.com</a>, which is the &#8220;static&#8221; <a href="http://www.askapache.com/htaccess/apache-speed-subdomains.html">subdomain</a> of <a href="http://www.askapache.com/">AskApache</a> that serves all the static assets like images, javascript, css, etc.. (<em>BTW, the z stands for ZAP</em>)..  All I needed to attempt setting this up was another hosting account on a separate server.  I have hosting accounts with around 10 different companies from working with various clients over the years, like <a href="http://www.powweb.com/join/index.bml?AffID=582654" rel="nofollow" >Powweb</a> and I don&#8217;t use them because they suck in terms of the unix environment.  Many of these web hosts are actually very fast bandwidth-wise..</p>
<h2><a id="#round-robin-concept" name="#round-robin-concept"></a>Round Robin Concept</h2>
<p><a href="#" rel="nofollow" class="IFL" ><img src="http://uploads.askapache.com/2009/04/round-robin-dns.png" alt="Round Robin DNS" title="Round Robin DNS" width="396" height="335" class="size-full wp-image-2622" /></a><strong>A few months ago</strong> I was given a free hosting account on <a href="http://secure.hostgator.com/cgi-bin/affiliates/clickthru.cgi?id=AskApache-rrdns" rel="nofollow" >HostGator</a> to evaluate and tempt me away from DreamHost to become a Gator.  I get a lot of these types of offers from time to time from the smaller Web companies who read AskApache.. but when I noticed the SSH access was jailed and saw how restrictive the shell was I felt like I was on a windows box..  I want a shell, cpanel sucks.  I compile and run everything from the shell so thats was a deal-breaker and I sorta forgot all about it.</p>
<p><strong>The goal is to add the HostGator server</strong> to be an <a href="http://www.askapache.com/security/mirror-using-rsync-ssh.html">exact mirror</a> of the static.askapache.com domain, then to add that server as a 2nd A record to my DNS zone.  That way half the visitors to the size will be taking up resources and bandwidth on the <a href="http://secure.hostgator.com/cgi-bin/affiliates/clickthru.cgi?id=AskApache-rrdns" rel="nofollow" >HostGator</a> server instead of mine.</p>
<p><strong>Round Robin A records</strong> in DNS are intended to evenly distribute queries between each host of the same name.  Using some tricks straight out of a <a href="http://www.askapache.com/security/computer-security-toolbox-2.html">hackers toolbox</a> we can <a href="#dns-robin-works" rel="nofollow" >verify if the distribution</a> is taking place.  (<a href="#dns-robin-works" rel="nofollow" >It is.</a>)  <br class="C" /></p>
<h2><a id="#dns-robin-dns" name="#dns-robin-dns"></a>DNS &#8211; Domain Name System</h2>
<p>The Domain Name System is often analogized as a &#8220;phone book&#8221; for the Internet because it translates human-friendly computer hostnames into IP addresses. For example, <code>www.askapache.com</code> translates to <code>208.113.134.190</code>.  Every request for a human-friendly hostname first needs to be translated to the IP before the server can be queried.  Normally each hostname corresponds to exactly 1 IP address.  But in a Round Robin setup, the idea is to have the hostname correspond to multiple IP addresses, which are different servers that house the exact same content, resulting in some hosts requesting files from one server, and another host requesting files from the other server, resulting in less CPU resources and bandwidth.</p>
<p>Here is an the zone for <code>static.askapache.com</code> Round Robin records:</p>
<table summary="Round Robin DNS Records" id="ver-zebra">
<colgroup>
<col class="e" />
<col class="o" />
<col class="e" />
<col class="o" />
<col class="e" /></colgroup>
<thead>
<tr>
<th scope="col" class="e">QUERY</th>
<th scope="col" class="o">TTL</th>
<th scope="col" class="e">CLASS</th>
<th scope="col" class="o">TYPE</th>
<th scope="col" class="e">ANSWER</th>
</tr>
</thead>
<tbody>
<tr>
<td>static.askapache.com</td>
<td>13084</td>
<td>IN</td>
<td>A</td>
<td>64.111.114.111</td>
</tr>
<tr>
<td>static.askapache.com</td>
<td>13084</td>
<td>IN</td>
<td>A</td>
<td>69.56.174.114</td>
</tr>
</tbody>
</table>
<h2><a id="#dns-robin-round" name="#dns-robin-round"></a>Round Robin DNS</h2>
<p>Round robin DNS is a technique of load distribution, load balancing, or fault-tolerance provisioning multiple, redundant Internet Protocol service hosts, e.g., Web servers, FTP servers, by managing the Domain Name System&#8217;s (DNS) responses to address requests from client computers according to an appropriate statistical model.</p>
<p>In its simplest implementation Round-robin DNS works by responding to DNS requests not only with a single IP address, but a list of IP addresses of several servers that host identical services. The order in which IP addresses from the list are returned is the basis for the term round robin. With each DNS response, the IP address sequence in the list is permuted. Usually, basic IP clients attempt connections with the first address returned from a DNS query so that on different connection attempts clients would receive service from different providers, thus distributing the overall load among servers.</p>
<p>Round robin DNS is often used for balancing the load of geographically-distributed Web servers. For example, a company has one domain name and three identical web sites residing on three servers with three different IP addresses. When one user accesses the home page it will be sent to the first IP address. The second user who accesses the home page will be sent to the next IP address, and the third user will be sent to the third IP address. In each case, once the IP address is given out, it goes to the end of the list. The fourth user, therefore, will be sent to the first IP address, and so forth.</p>
<p>Although easy to implement, round robin DNS has problematic drawbacks, such as those arising from record caching in the DNS hierarchy itself, as well as client-side address caching and reuse, the combination of which can be difficult to manage. Round robin DNS should not solely be relied upon for service availability. If a service at one of the addresses in the list fails, the DNS will continue to hand out that address and clients will still attempt to reach the inoperable service.</p>
<h2><a id="#dns-robin-works" name="#dns-robin-works" title="Efficacy of DNS Load Balancing"></a>Does Round Robin Work</h2>
<p>Definately.  I can look at the access logs for both servers and see that they are splitting the requests nicely.   It is definately not an exact split however, look at these statistics and you&#8217;ll see what I mean.</p>
<pre>$ dig @ns1.dreamhost.com +authority +all static.askapache.com
&nbsp;
;; ANSWER SECTION:
static.askapache.com.        14400   IN      A       69.56.174.114
static.askapache.com.        14400   IN      A       64.111.114.111
&nbsp;
$ dig @ns1.dreamhost.com +authority +all static.askapache.com
&nbsp;
;; ANSWER SECTION:
static.askapache.com.        14400   IN      A       64.111.114.111
static.askapache.com.        14400   IN      A       69.56.174.114</pre>
<p>The effects of caching will distort the effectiveness of any IP address allocation algorithm unless a 0 TTL is used which has the effect of significantly increasing the load on the DNS (and is not always implemented consistently). In this case the cure may be worse than the disease Good news we have good load balancing on our web servers. Bad news we need 17 more DNS servers!. Intuitively, and without running any experiments to verify, we would suggest that given a normal TTL (12 hours or more) and ANY IP allocation algorithm other than a single static list, loads should be reasonably balanced .</p>
<p><strong>Full root server query</strong></p>
<pre>Tracing to static.askapache.com[a] via A.ROOT-SERVERS.NET, maximum of 3 retries
A.ROOT-SERVERS.NET [.] (198.41.0.4)
 |\___ L.GTLD-SERVERS.NET [com] (192.41.162.30)
 |     |\___ ns3.dreamhost.com [askapache.com] (66.33.216.216) Got authoritative answer
 |     |\___ ns2.dreamhost.com [askapache.com] (208.96.10.221)
 |      \___ ns1.dreamhost.com [askapache.com] (66.33.206.206) Got authoritative answer
 |\___ D.GTLD-SERVERS.NET [com] (192.31.80.30)
 |     |\___ ns3.dreamhost.com [askapache.com] (66.33.216.216) Got authoritative answer
 |     |\___ ns2.dreamhost.com [askapache.com] (208.96.10.221)
 |      \___ ns1.dreamhost.com [askapache.com] (66.33.206.206) Got authoritative answer
 |\___ J.GTLD-SERVERS.NET [com] (192.48.79.30)
 |     |\___ ns3.dreamhost.com [askapache.com] (66.33.216.216) Got authoritative answer
 |     |\___ ns2.dreamhost.com [askapache.com] (208.96.10.221)
 |      \___ ns1.dreamhost.com [askapache.com] (66.33.206.206) Got authoritative answer
 |\___ H.GTLD-SERVERS.NET [com] (192.54.112.30)
 |     |\___ ns3.dreamhost.com [askapache.com] (66.33.216.216) Got authoritative answer
 |     |\___ ns2.dreamhost.com [askapache.com] (208.96.10.221)
 |      \___ ns1.dreamhost.com [askapache.com] (66.33.206.206) Got authoritative answer
 |\___ E.GTLD-SERVERS.NET [com] (192.12.94.30)
 |     |\___ ns3.dreamhost.com [askapache.com] (66.33.216.216) Got authoritative answer
 |     |\___ ns2.dreamhost.com [askapache.com] (208.96.10.221)
 |      \___ ns1.dreamhost.com [askapache.com] (66.33.206.206) Got authoritative answer
 |\___ F.GTLD-SERVERS.NET [com] (192.35.51.30)
 |     |\___ ns3.dreamhost.com [askapache.com] (66.33.216.216) Got authoritative answer
 |     |\___ ns2.dreamhost.com [askapache.com] (208.96.10.221)
 |      \___ ns1.dreamhost.com [askapache.com] (66.33.206.206) Got authoritative answer
 |\___ I.GTLD-SERVERS.NET [com] (192.43.172.30)
 |     |\___ ns3.dreamhost.com [askapache.com] (66.33.216.216) Got authoritative answer
 |     |\___ ns2.dreamhost.com [askapache.com] (208.96.10.221)
 |      \___ ns1.dreamhost.com [askapache.com] (66.33.206.206) Got authoritative answer
 |\___ G.GTLD-SERVERS.NET [com] (192.42.93.30)
 |     |\___ ns3.dreamhost.com [askapache.com] (66.33.216.216) Got authoritative answer
 |     |\___ ns2.dreamhost.com [askapache.com] (208.96.10.221)
 |      \___ ns1.dreamhost.com [askapache.com] (66.33.206.206) Got authoritative answer
 |\___ B.GTLD-SERVERS.NET [com] (2001:0503:231d:0000:0000:0000:0002:0030) Not queried
 |\___ B.GTLD-SERVERS.NET [com] (192.33.14.30)
 |     |\___ ns3.dreamhost.com [askapache.com] (66.33.216.216) Got authoritative answer
 |     |\___ ns2.dreamhost.com [askapache.com] (208.96.10.221)
 |      \___ ns1.dreamhost.com [askapache.com] (66.33.206.206) Got authoritative answer
 |\___ A.GTLD-SERVERS.NET [com] (2001:0503:a83e:0000:0000:0000:0002:0030) Not queried
 |\___ A.GTLD-SERVERS.NET [com] (192.5.6.30)
 |     |\___ ns3.dreamhost.com [askapache.com] (66.33.216.216) Got authoritative answer
 |     |\___ ns2.dreamhost.com [askapache.com] (208.96.10.221)
 |      \___ ns1.dreamhost.com [askapache.com] (66.33.206.206) Got authoritative answer
 |\___ C.GTLD-SERVERS.NET [com] (192.26.92.30)
 |     |\___ ns3.dreamhost.com [askapache.com] (66.33.216.216) Got authoritative answer
 |     |\___ ns2.dreamhost.com [askapache.com] (208.96.10.221)
 |      \___ ns1.dreamhost.com [askapache.com] (66.33.206.206) Got authoritative answer
 |\___ M.GTLD-SERVERS.NET [com] (192.55.83.30)
 |     |\___ ns3.dreamhost.com [askapache.com] (66.33.216.216) Got authoritative answer
 |     |\___ ns2.dreamhost.com [askapache.com] (208.96.10.221)
 |      \___ ns1.dreamhost.com [askapache.com] (66.33.206.206) Got authoritative answer
  \___ K.GTLD-SERVERS.NET [com] (192.52.178.30)
       |\___ ns3.dreamhost.com [askapache.com] (66.33.216.216) Got authoritative answer
       |\___ ns2.dreamhost.com [askapache.com] (208.96.10.221)
        \___ ns1.dreamhost.com [askapache.com] (66.33.206.206) Got authoritative answer
&nbsp;
  ns1.dreamhost.com (66.33.206.206)       static.askapache.com -&gt; 64.111.114.111
  ns1.dreamhost.com (66.33.206.206)       static.askapache.com -&gt; 69.56.174.114
  ns3.dreamhost.com (66.33.216.216)       static.askapache.com -&gt; 64.111.114.111
  ns3.dreamhost.com (66.33.216.216)       static.askapache.com -&gt; 69.56.174.114
  ns1.dreamhost.com (66.33.206.206)       static.askapache.com -&gt; 64.111.114.111
  ns1.dreamhost.com (66.33.206.206)       static.askapache.com -&gt; 69.56.174.114
  ns3.dreamhost.com (66.33.216.216)       static.askapache.com -&gt; 64.111.114.111
  ns3.dreamhost.com (66.33.216.216)       static.askapache.com -&gt; 69.56.174.114
  ns1.dreamhost.com (66.33.206.206)       static.askapache.com -&gt; 64.111.114.111
  ns1.dreamhost.com (66.33.206.206)       static.askapache.com -&gt; 69.56.174.114
  ns3.dreamhost.com (66.33.216.216)       static.askapache.com -&gt; 64.111.114.111
  ns3.dreamhost.com (66.33.216.216)       static.askapache.com -&gt; 69.56.174.114
  ns1.dreamhost.com (66.33.206.206)       static.askapache.com -&gt; 64.111.114.111
  ns1.dreamhost.com (66.33.206.206)       static.askapache.com -&gt; 69.56.174.114
  ns3.dreamhost.com (66.33.216.216)       static.askapache.com -&gt; 64.111.114.111
  ns3.dreamhost.com (66.33.216.216)       static.askapache.com -&gt; 69.56.174.114
  ns1.dreamhost.com (66.33.206.206)       static.askapache.com -&gt; 64.111.114.111
  ns1.dreamhost.com (66.33.206.206)       static.askapache.com -&gt; 69.56.174.114
  ns3.dreamhost.com (66.33.216.216)       static.askapache.com -&gt; 64.111.114.111
  ns3.dreamhost.com (66.33.216.216)       static.askapache.com -&gt; 69.56.174.114
  ns1.dreamhost.com (66.33.206.206)       static.askapache.com -&gt; 64.111.114.111
  ns1.dreamhost.com (66.33.206.206)       static.askapache.com -&gt; 69.56.174.114
  ns3.dreamhost.com (66.33.216.216)       static.askapache.com -&gt; 69.56.174.114
  ns3.dreamhost.com (66.33.216.216)       static.askapache.com -&gt; 64.111.114.111
  ns1.dreamhost.com (66.33.206.206)       static.askapache.com -&gt; 64.111.114.111
  ns1.dreamhost.com (66.33.206.206)       static.askapache.com -&gt; 69.56.174.114
  ns3.dreamhost.com (66.33.216.216)       static.askapache.com -&gt; 64.111.114.111
  ns3.dreamhost.com (66.33.216.216)       static.askapache.com -&gt; 69.56.174.114
  ns1.dreamhost.com (66.33.206.206)       static.askapache.com -&gt; 64.111.114.111
  ns1.dreamhost.com (66.33.206.206)       static.askapache.com -&gt; 69.56.174.114
  ns3.dreamhost.com (66.33.216.216)       static.askapache.com -&gt; 69.56.174.114
  ns3.dreamhost.com (66.33.216.216)       static.askapache.com -&gt; 64.111.114.111
  ns1.dreamhost.com (66.33.206.206)       static.askapache.com -&gt; 69.56.174.114
  ns1.dreamhost.com (66.33.206.206)       static.askapache.com -&gt; 64.111.114.111
  ns3.dreamhost.com (66.33.216.216)       static.askapache.com -&gt; 64.111.114.111
  ns3.dreamhost.com (66.33.216.216)       static.askapache.com -&gt; 69.56.174.114
  ns1.dreamhost.com (66.33.206.206)       static.askapache.com -&gt; 64.111.114.111
  ns1.dreamhost.com (66.33.206.206)       static.askapache.com -&gt; 69.56.174.114
  ns3.dreamhost.com (66.33.216.216)       static.askapache.com -&gt; 69.56.174.114
  ns3.dreamhost.com (66.33.216.216)       static.askapache.com -&gt; 64.111.114.111
  ns1.dreamhost.com (66.33.206.206)       static.askapache.com -&gt; 69.56.174.114
  ns1.dreamhost.com (66.33.206.206)       static.askapache.com -&gt; 64.111.114.111
  ns3.dreamhost.com (66.33.216.216)       static.askapache.com -&gt; 64.111.114.111
  ns3.dreamhost.com (66.33.216.216)       static.askapache.com -&gt; 69.56.174.114
  ns1.dreamhost.com (66.33.206.206)       static.askapache.com -&gt; 64.111.114.111
  ns1.dreamhost.com (66.33.206.206)       static.askapache.com -&gt; 69.56.174.114
  ns3.dreamhost.com (66.33.216.216)       static.askapache.com -&gt; 69.56.174.114
  ns3.dreamhost.com (66.33.216.216)       static.askapache.com -&gt; 64.111.114.111
  ns1.dreamhost.com (66.33.206.206)       static.askapache.com -&gt; 64.111.114.111
  ns1.dreamhost.com (66.33.206.206)       static.askapache.com -&gt; 69.56.174.114
  ns3.dreamhost.com (66.33.216.216)       static.askapache.com -&gt; 64.111.114.111
  ns3.dreamhost.com (66.33.216.216)       static.askapache.com -&gt; 69.56.174.114</pre>
<h2><a id="#dns-online-tools" name="#dns-online-tools"></a>Live Online DNS Tools</h2>
<ul>
<li><a href="http://member.dnsstuff.com/amember/go.php?r=323972&#038;i=l0" rel="nofollow" >DNSstuff.com &#8211; Your Destination for DNS and Networking Tools</a></li>
<li><a href="http://www.zonecheck.fr/cgi-bin/zc.cgi?zone=askapache.com&#038;ns0=ns1.dreamhost.com&#038;ips0=&#038;ns1=ns2.dreamhost.com&#038;ips1=&#038;ns2=ns3.dreamhost.com&#038;ips2=&#038;ns3=&#038;ips3=&#038;ns4=&#038;ips4=&#038;ns5=&#038;ips5=&#038;ns6=&#038;ips6=&#038;ns7=&#038;ips7=&#038;intro=t&#038;explain=t&#038;details=t&#038;progress=counter&#038;report=byseverity&#038;format=html&#038;lang=en&#038;errorlvl=allwarning&#038;profile=automatic&#038;chkmail=t&#038;chkzone=t&#038;chkrir=t&#038;transp3=ipv4&#038;transp3=ipv6&#038;transp4=std" rel="nofollow" >ZoneCheck</a></li>
<li><a href="http://pingability.com/zoneinfo.jsp?domain=askapache.com" rel="nofollow" >Quick Check &#8211; Pingability.com</a></li>
<li><a href="http://www.squish.net/dnscheck/dnscheck.cgi?host=askapache.com&#038;type=ANY&#038;show_rootservers=on&#038;removebroken=on&#038;cnameprocessing=on&#038;show_mainworkings=on&#038;show_resolving=on&#038;show_allservers=on&#038;getbindversions=on&#038;retries=5&#038;querylevel=15" rel="nofollow" >Squishywishywoo: complete dns traversal checking</a></li>
<li><a href="http://www.zonecut.net/dns/?domain=askapache.com&#038;find_subs=on" rel="nofollow" >ZoneCut DNS</a></li>
<li><a href="http://atrey.karlin.mff.cuni.cz/~mj/sleuth/?domain=askapache.com&#038;verbose=ON&#038;server=ns1.dreamhost.com&#038;serverip=&#038;action=Submit&#038;.cgifields=verbose" rel="nofollow" >DNS Sleuth</a></li>
<li><a href="http://www.pweb.cz/en/dns-test/dom.php" rel="nofollow" >DNS test &#8211; Domain name DNS test &#8211; pweb.cz</a></li>
<li><a href="http://www.opendns.com/support/cache/?d=static.askapache.com" rel="nofollow" >OpenDNS &#8211; Support &#8211; CacheCheck</a></li>
<li><a href="http://www.dnscolos.com/dnsreport.php" rel="nofollow" >DNSReport</a></li>
<li><a href="http://freedns.afraid.org/domain/dnstrace.php?domain=askapache.com&#038;submit=Trace" rel="nofollow" >DNSTrace</a></li>
<li><a href="http://www.intodns.com/askapache.com" rel="nofollow" >intoDNS</a></li>
<li><a href="http://www.dnsthru.com/" rel="nofollow" >DNSthru.com</a></li>
<li><a href="http://demo.dnsdoctor.org/cgi-bin/diagnose.cgi?zone=askapache.com&#038;ns0=ns1.dreamhost.com&#038;ips0=&#038;ns1=ns2.dreamhost.com&#038;ips1=&#038;ns2=ns3.dreamhost.com&#038;ips2=&#038;ns3=&#038;ips3=&#038;ns4=&#038;ips4=67.19.1.10&#038;ns5=&#038;ips5=67.19.0.10&#038;ns6=&#038;ips6=67.18.150.114&#038;ns7=&#038;ips7=&#038;intro=t&#038;format=html&#038;lang=en&#038;testname=t&#038;explain=t&#038;details=t&#038;progress=testdesc&#038;errorlvl=allwarning&#038;dontstop=nostop&#038;profile=automatic&#038;report=byseverity&#038;chkmail=t&#038;transp3=ipv4&#038;transp3=ipv6&#038;transp4=std" rel="nofollow" >DNS Doctor</a></li>
<li><a href="http://www.checkdns.net/powercheck.aspx" rel="nofollow" >Power Check</a></li>
</ul>
<h2><a id="#dns-links" name="#dns-links"></a>More Reading</h2>
<ul>
<li><a href="http://www.zytrax.com/books/dns/ch9/rr.html" rel="nofollow" >HOWTO &#8211; Configure Load Balancing</a></li>
<li><a href="http://ntrg.cs.tcd.ie/undergrad/4ba2.01/group8/DNS.html" rel="nofollow" >Load Sharing with DNS</a></li>
</ul>
<h3><a id="#dns-rfc-list" name="#dns-rfc-list"></a>RFC&#8217;s related to DNS</h3>
<ul>
<li><a href="http://rfc.askapache.com/rfc920/rfc920.html" rel="nofollow"  title="protocol,signature,resource,dnssec,records,response,record,dnskey,algorithm,standards,domain,server,resolver,security">RFC 920</a>:  Specified original TLDs: .arpa, .com, .edu, .org, .gov, .mil and two-character country codes</li>
<li><a href="http://rfc.askapache.com/rfc1032/rfc1032.html" rel="nofollow" >RFC 1032</a>:  Domain administrators guide</li>
<li><a href="http://rfc.askapache.com/rfc1033/rfc1033.html" rel="nofollow" >RFC 1033</a>:  Domain administrators operations guide</li>
<li><a href="http://rfc.askapache.com/rfc1034/rfc1034.html" rel="nofollow" >RFC 1034</a>:  Domain Names &#8211; Concepts and Facilities.</li>
<li><a href="http://rfc.askapache.com/rfc1035/rfc1035.html" rel="nofollow" >RFC 1035</a>:  Domain Names &#8211; Implementation and Specification</li>
<li><a href="http://rfc.askapache.com/rfc1101/rfc1101.html" rel="nofollow" >RFC 1101</a>:  DNS Encodings of Network Names and Other Types</li>
<li><a href="http://rfc.askapache.com/rfc1123/rfc1123.html" rel="nofollow" >RFC 1123</a>:  Requirements for Internet Hosts &#8212; Application and Support</li>
<li><a href="http://rfc.askapache.com/rfc1912/rfc1912.html" rel="nofollow" >RFC 1912</a>:  Common DNS Operational and Configuration Errors</li>
<li><a href="http://rfc.askapache.com/rfc1995/rfc1995.html" rel="nofollow" >RFC 1995</a>:  Incremental Zone Transfer in DNS</li>
<li><a href="http://rfc.askapache.com/rfc1996/rfc1996.html" rel="nofollow" >RFC 1996</a>:  A Mechanism for Prompt Notification of Zone Changes (DNS NOTIFY)</li>
<li><a href="http://rfc.askapache.com/rfc2136/rfc2136.html" rel="nofollow" >RFC 2136</a>:  Dynamic Updates in the domain name system (DNS UPDATE)</li>
<li><a href="http://rfc.askapache.com/rfc2181/rfc2181.html" rel="nofollow" >RFC 2181</a>:  Clarifications to the DNS Specification</li>
<li><a href="http://rfc.askapache.com/rfc2182/rfc2182.html" rel="nofollow" >RFC 2182</a>:  Selection and Operation of Secondary DNS Servers</li>
<li><a href="http://rfc.askapache.com/rfc2308/rfc2308.html" rel="nofollow" >RFC 2308</a>:  Negative Caching of DNS Queries (DNS NCACHE)</li>
<li><a href="http://rfc.askapache.com/rfc2317/rfc2317.html" rel="nofollow" >RFC 2317</a>:  Classless IN-ADDR.ARPA delegation</li>
<li><a href="http://rfc.askapache.com/rfc2671/rfc2671.html" rel="nofollow" >RFC 2671</a>:  Extension Mechanisms for DNS (EDNS0)</li>
<li><a href="http://rfc.askapache.com/rfc3597/rfc3597.html" rel="nofollow" >RFC 3597</a>:  Handling of Unknown DNS Resource Record (RR) Types</li>
<li><a href="http://rfc.askapache.com/rfc3696/rfc3696.html" rel="nofollow" >RFC 3696</a>:  Application Techniques for Checking and Transformation of Names</li>
<li><a href="http://rfc.askapache.com/rfc4343/rfc4343.html" rel="nofollow" >RFC 4343</a>:  Domain Name System (DNS) Case Insensitivity Clarification</li>
<li><a href="http://rfc.askapache.com/rfc4592/rfc4592.html" rel="nofollow" >RFC 4592</a>:  The Role of Wildcards in the Domain Name System</li>
<li><a href="http://rfc.askapache.com/rfc4892/rfc4892.html" rel="nofollow" >RFC 4892</a>:  Requirements for a Mechanism Identifying a Name Server Instance</li>
<li><a href="http://rfc.askapache.com/rfc5001/rfc5001.html" rel="nofollow" >RFC 5001</a>:  DNS Name Server Identifier Option (NSID)</li>
<li>RFC 5395:  Domain Name System (DNS) IANA Considerations</li>
</ul>
<p class="wikicop">This page contains content by <a href="http://en.wikipedia.org/w/index.php?title=Round_robin_DNS&#038;action=history"rel="nofollow" >Author</a> of <a href="http://en.wikipedia.org/wiki/Round_robin_DNS" rel="nofollow">Article</a> from <a href="http://en.wikipedia.org/wiki/Main_Page" rel="nofollow">Wikipedia</a> and is licensed under the <a href="http://www.askapache.com/gnu-fdl.txt" rel="nofollow">GNU FDL</a>.</p>
<p><strong>Table of Contents</strong></p>
<ul>
<li><a href="#round-robin-concept" rel="nofollow" >Round Robin Concept</a></li>
<li><a href="#dns-robin-dns" rel="nofollow" >DNS &#8211; Domain Name System</a></li>
<li><a href="#dns-robin-round" rel="nofollow" >Round Robin DNS</a></li>
<li><a href="#dns-robin-works" rel="nofollow" >Efficacy of DNS Load Balancing</a></li>
<li><a href="#dns-online-tools" rel="nofollow" >Live Online DNS Tools</a></li>
<li><a href="#dns-links" rel="nofollow" >More Reading</a></li>
<li><a href="#dns-rfc-list" rel="nofollow" >RFC&#8217;s related to DNS</a></li>
</ul>
<p><a href="http://www.askapache.com/linux-unix/dns-round-robin-rsync-over-ssh.html"></a><a href="http://www.askapache.com/linux-unix/dns-round-robin-rsync-over-ssh.html">DNS Round Robin Configuration using Rsync over SSH</a> originally appeared on <cite>AskApache.com</cite> </p>]]></content:encoded>
			<wfw:commentRss>http://www.askapache.com/linux-unix/dns-round-robin-rsync-over-ssh.html/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Advanced Htaccess &#8211; SSI, ErrorDocuments, DirectoryIndexing SEO</title>
		<link>http://www.askapache.com/htaccess/advanced-htaccess-ssi.html</link>
		<comments>http://www.askapache.com/htaccess/advanced-htaccess-ssi.html#comments</comments>
		<pubDate>Mon, 09 Mar 2009 08:02:02 +0000</pubDate>
		<dc:creator>AskApache</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Apache Modules]]></category>
		<category><![CDATA[Cache]]></category>
		<category><![CDATA[DNS]]></category>
		<category><![CDATA[DreamHost]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Htaccess]]></category>
		<category><![CDATA[Mod_Rewrite]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Web Hosting]]></category>
		<category><![CDATA[Webmaster]]></category>
		<category><![CDATA[WiredTree]]></category>
		<category><![CDATA[403 Forbidden]]></category>
		<category><![CDATA[404 Not Found]]></category>
		<category><![CDATA[500]]></category>
		<category><![CDATA[503]]></category>
		<category><![CDATA[admin]]></category>
		<category><![CDATA[Advanced]]></category>
		<category><![CDATA[Apache Htaccess]]></category>
		<category><![CDATA[askapache]]></category>
		<category><![CDATA[AskApache Google 404]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[Cookies]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Dig]]></category>
		<category><![CDATA[Email]]></category>
		<category><![CDATA[errordocument]]></category>
		<category><![CDATA[feed]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[Forms]]></category>
		<category><![CDATA[GET]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[HowTo]]></category>
		<category><![CDATA[htaccess files]]></category>
		<category><![CDATA[htaccess rewrite]]></category>
		<category><![CDATA[HTTP Headers]]></category>
		<category><![CDATA[HTTP-EQUIV]]></category>
		<category><![CDATA[httpd]]></category>
		<category><![CDATA[HTTPS SSL]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[mod_include]]></category>
		<category><![CDATA[Nice]]></category>
		<category><![CDATA[password]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Port]]></category>
		<category><![CDATA[ram]]></category>
		<category><![CDATA[Redirect]]></category>
		<category><![CDATA[Rewrite Tricks]]></category>
		<category><![CDATA[rewritecond]]></category>
		<category><![CDATA[rewriterule]]></category>
		<category><![CDATA[Scripts]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[Server Side Includes]]></category>
		<category><![CDATA[servers]]></category>
		<category><![CDATA[SetEnvIf]]></category>
		<category><![CDATA[Source Code]]></category>
		<category><![CDATA[SSH]]></category>
		<category><![CDATA[SSI]]></category>
		<category><![CDATA[stat]]></category>
		<category><![CDATA[SymLinks]]></category>
		<category><![CDATA[trick]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.askapache.com/?p=2236</guid>
		<description><![CDATA[<p><a class="IFL" href="http://www.askapache.com/htaccess/advanced-htaccess-ssi.html#htaccess-ssi-directory" title="Improved Directory Listings and SEO"><img src="http://uploads.askapache.com/2009/03/htaccess-directory-index-116x76.png" alt="htaccess directory indexing" title="Improved Directory Listings and SEO" width="116" height="76" /></a><a class="IFL" style="border-bottom:15px solid #FFF;" href="http://www.askapache.com/htaccess/advanced-htaccess-ssi.html#htaccess-ssi-error" title="Enhanced Error Pages"><img src="http://uploads.askapache.com/2009/03/example-errordocument-116x67.png" alt="ErrorDocument from .htaccess" title="Enhanced Error Pages" width="116" height="67" /></a>3-Part article covering practical implementation of 3 advanced .htaccess features.   Discover an easy way to <a href="http://www.askapache.com/htaccess/advanced-htaccess-ssi.html#htaccess-ssi-directory">boost your SEO the <dfn title="Design your site for Humans">AskApache way</dfn></a> (<em>focus on visitors</em>), a tip you might keep and use for life. <a href="http://www.askapache.com/htaccess/advanced-htaccess-ssi.html#htaccess-ssi-security">Get some cool security tricks</a> to use against spammers, crackers, and other nefarious sorts.  <a href="http://www.askapache.com/htaccess/advanced-htaccess-ssi.html#htaccess-ssi-error">Take your site's error handling to the next level</a>, enhanced ErrorDocuments that go beyond 404's. <br class="C" /></p>]]></description>
			<content:encoded><![CDATA[<p><acronym title="Server Side Includes">SSI</acronym>, Server Side Includes, can be very useful to webmasters and visitors alike.  They are easily set up in an .htaccess file and require little to no maintaining.. the term &#8220;Set it and Forget it&#8221; applies here.  Before we look at how to implement SSI, and dig into the Apache module that makes them possible, lets look at few uses for SSI so you can quickly determine if you would like to read further.</p>
<ol>
<li><a href="http://www.askapache.com/htaccess/advanced-htaccess-ssi.html#htaccess-ssi-directory">Improved Directory Listings and SEO</a></li>
<li><a href="http://www.askapache.com/htaccess/advanced-htaccess-ssi.html#htaccess-ssi-error">Enhanced Error Pages</a></li>
<li><a href="http://www.askapache.com/htaccess/advanced-htaccess-ssi.html#htaccess-ssi-security">Dealing with Spam and Website Attacks</a></li>
</ol>
<hr class="C" />
<h2><a name="htaccess-ssi-directory" id="htaccess-ssi-directory"></a>Improved Directory Listings and SEO</h2>
<p><a href="http://uploads.askapache.com/2009/03/htaccess-directory-index.png" rel="nofollow" class="IFL"  title="htaccess directory indexing"><img src="http://uploads.askapache.com/2009/03/htaccess-directory-index-116x76.png" alt="htaccess directory indexing" title="htaccess directory indexing" /></a>One way that I use SSI is for improved Directory Listing.  Anyone here like SEO?  Check out my <a href="http://uploads.askapache.com/" rel="nofollow" >WordPress uploads directory</a> to get an idea.  Basically I can customize the header and footer of each directory..  Pretty sweet, thanks Apache!<br class="C" /></p>
<p>In your <code>/uploads/.htaccess</code></p>
<pre># turn on auto-indexing and turn off SSI&#039;s ability to exec
Options None
Options SymLinksIfOwnerMatch Indexes IncludesNOEXEC
&nbsp;
# we need to make sure files are displayed when requested, not executed or parsed
AddType text/plain .ini .sh .bsh .bash .csh .var .asc .md5 .sha .sha1 .cgi .pl .php .inc .asp .exe .bin
DefaultType text/plain
&nbsp;
# turn on auto-indexing, with askapache-optimized options
IndexOptions FancyIndexing SuppressColumnSorting SuppressHTMLPreamble IconHeight=22 IconWidth=20
IndexOptions IgnoreClient NameWidth=40 DescriptionWidth=* XHTML FoldersFirst
&nbsp;
# don&#039;t show these files and folders
IndexIgnore .htaccess .ht* *_notes *.log feed inc HEADER.html FOOTER.html feed*.gif
&nbsp;
# the SSI files used for the header and footer
HeaderName /ssi/HEADER.html
ReadmeName /ssi/FOOTER.html
&nbsp;
# used to determine the time and for SSI output
SetEnv TZ America/Indianapolis
SetEnv SERVER_ADMIN webmaster@askapache.com</pre>
<p>In your <code>/ssi/.htaccess</code></p>
<pre># makes files ending in .html be filtered through the INCLUDES filter before being sent to client
AddOutputFilter Includes html</pre>
<p>My <code>HEADER.html</code></p>
<pre>&lt;!&#45;-#set var=&quot;PAGETITLE&quot; value=&quot;&#45;- static.askapache.com&quot; &#45;-&gt;
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot;
&quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;
&lt;html&gt;
&lt;head&gt;
  &lt;title&gt;&lt;!&#45;-#echo encoding=&quot;none&quot; var=&quot;REQUEST_URI&quot; &#45;-&gt; &lt;!&#45;-#echo encoding=&quot;none&quot; var=&quot;PAGETITLE&quot; &#45;-&gt;&lt;/title&gt;
  &lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html; charset=UTF-8&quot; /&gt;
  &lt;link rel=&quot;stylesheet&quot; href=&quot;http://static.askapache.com/c/error.css&quot; /&gt;
  &lt;link rev=&quot;made&quot; href=&quot;mailto:&lt;!&#45;-#echo encoding=&quot;url&quot; var=&quot;SERVER_ADMIN&quot; &#45;-&gt;&quot; /&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;&lt;a href=&quot;http://www.askapache.com/&quot; title=&quot;AskApache Home&quot; accesskey=&quot;1&quot;&gt;
&lt;img src=&quot;http://www.askapache.com/nlogo.jpg&quot; height=&quot;75&quot; alt=&quot;AskApache&quot; /&gt;
&lt;/a&gt; &lt;!&#45;-#echo encoding=&quot;url&quot; var=&quot;REQUEST_URI&quot; &#45;-&gt; &lt;!&#45;-#echo encoding=&quot;none&quot; var=&quot;PAGETITLE&quot; &#45;-&gt;&lt;/h1&gt;
&lt;hr /&gt;</pre>
<p>My <code>FOOTER.html</code></p>
<pre>&lt;p&gt;Find the information you are looking for on the &lt;a href=&quot;http://www.askapache.com/&quot;&gt;AskApache Home page&lt;/a&gt;
or the &lt;a href=&quot;http://www.askapache.com/search&lt;!&#45;-#echo encoding=&quot;url&quot; var=&quot;REQUEST_URI&quot; &#45;-&gt;&quot;&gt;
AskApache search page&lt;/a&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;address&gt;
  &lt;small&gt;$Id:&lt;!&#45;-#echo encoding=&quot;none&quot; var=&quot;UNIQUE_ID&quot; &#45;-&gt; E:&lt;!&#45;-#echo encoding=&quot;none&quot; var=&quot;REDIRECT_STATUS&quot; &#45;-&gt;,v 1.30
&lt;!&#45;-#config timefmt=&quot;%c&quot; &#45;-&gt;&lt;!&#45;-#echo var=&quot;DATE_LOCAL&quot; &#45;-&gt;&lt;/small&gt;&lt;br /&gt;
  &lt;small&gt;&lt;!&#45;-#echo var=&quot;SERVER_SOFTWARE&quot; &#45;-&gt;&lt;/small&gt;&lt;br /&gt;&lt;br /&gt;
  static.askapache.com &#45;- AskApache | &lt;a href=&quot;http://www.askapache.com/about/&quot;&gt;Webmaster&lt;/a&gt;
| Copyright &amp;copy; 2009 AskApache&lt;br /&gt;
&lt;/address&gt;
&lt;!&#45;-#if expr=&quot;$REMOTE_ADDR = 10.10.10.10&quot; &#45;-&gt;
&lt;pre &gt;&lt;!&#45;-#printenv &#45;-&gt;&lt;/ pre&gt;
&lt;!&#45;-#endif &#45;-&gt;
&lt;script src=&quot;http://static.askapache.com/j/apache-0780.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot;&gt;var pageTracker = _gat._getTracker(&quot;UA-7&quot;+&quot;321&quot;+&quot;53-38&quot;);
pageTracker._initData();pageTracker._trackPageview();&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<h2><a name="htaccess-ssi-error id="htaccess-ssi-error></a>Enhanced Error Pages</h2>
<p><a href="http://uploads.askapache.com/2009/03/example-errordocument.png" rel="nofollow" class="IFL"  title="htaccess-errordocument"><img src="http://uploads.askapache.com/2009/03/example-errordocument-116x67.png" alt="ErrorDocument from .htaccess" title="htaccess-errordocument" /></a>If you are using WordPress, I&#8217;m sure you are using my <a href="http://www.askapache.com/seo/404-google-wordpress-plugin.html">AskApache Google 404 Plugin</a>, but whatever your <a href="http://www.askapache.com/htaccess/apache-status-code-headers-errordocument.html">error pages</a> may be, using SSI you can make them better.  My 404 Error Page is handled by WordPress and PHP, but all of my other error pages (codes 4xx to 5xx) are handled using SSI.  You can check out any of them: <a href="http://www.askapache.com/show-error-400">/show-error-400</a>, <a href="http://www.askapache.com/show-error-400">/show-error-403</a>, <a href="http://www.askapache.com/show-error-500">/show-error-503</a>, etc..<br class="C" /></p>
<p>Notice the email note which has the subject prefilled?  Thats one of the main uses for SSI, you can add forms to your errordocuments and get notified of problems which mean you can fix them.</p>
<p>Add this to your <code>/.htaccess</code> for each <code>ErrorDocument</code> you make.</p>
<pre>ErrorDocument 503 /errordocs/503.html</pre>
<p>My <code>/errordocs/.htaccess</code></p>
<pre># turn on symlinks for rewrites and turn off SSI&#039;s ability to exec
Options None
Options SymLinksIfOwnerMatch IncludesNOEXEC
&nbsp;
# makes files ending in .html be filtered through the INCLUDES filter before being sent to client
AddOutputFilter Includes html
&nbsp;
# this internal apache variable prevents your errordocs from allowing keep-alive connections
SetEnv nokeepalive
&nbsp;
# used to determine the time and for SSI output
SetEnv TZ America/Indianapolis
SetEnv SERVER_ADMIN webmaster@askapache.com</pre>
<p>My <code>/errordocs/503.html</code></p>
<pre>&lt;!&#45;-#set var=&quot;TITLE&quot; value=&quot;Service Temporarily Unavailable&quot; &#45;-&gt;
&lt;!&#45;-#include virtual=&quot;/errordocs/TOP.html&quot; &#45;-&gt;
&lt;p&gt;The server is temporarily unable to service your
request due to &lt;strong&gt;maintenance downtime&lt;/strong&gt;
or super-crazy-extreme capacity problems. Please try
again later&#46;.. Or &lt;a href=&quot;mailto:&lt;!&#45;-#echo encoding=&quot;url&quot; var=&quot;SERVER_ADMIN&quot; &#45;-&gt;&quot;&gt;send me an email&lt;/a&gt; and let me know about it..&lt;/p&gt;
&lt;!&#45;-#include virtual=&quot;/errordocs/BOTTOM.html&quot; &#45;-&gt;</pre>
<p>My <code>/errordocs/TOP.html</code></p>
<pre>&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot;
&quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;
&lt;html&gt;
&lt;head&gt;
  &lt;title&gt;&lt;!&#45;-#echo encoding=&quot;none&quot; var=&quot;REQUEST_URI&quot; &#45;-&gt; &lt;!&#45;-#echo encoding=&quot;none&quot; var=&quot;TITLE&quot; &#45;-&gt;&lt;/title&gt;
  &lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html; charset=UTF-8&quot; /&gt;
  &lt;link rel=&quot;stylesheet&quot; href=&quot;http://static.askapache.com/c/error.css&quot; /&gt;
  &lt;link rev=&quot;made&quot; href=&quot;mailto:&lt;!&#45;-#echo encoding=&quot;url&quot; var=&quot;SERVER_ADMIN&quot; &#45;-&gt;&quot; /&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;&lt;a href=&quot;http://www.askapache.com/&quot; title=&quot;AskApache Home&quot; accesskey=&quot;1&quot;&gt;&lt;img src=&quot;http://www.askapache.com/nlogo.jpg&quot; height=&quot;75&quot; alt=&quot;AskApache&quot; /&gt;
&lt;/a&gt; &lt;!&#45;-#echo encoding=&quot;url&quot; var=&quot;REQUEST_URI&quot; &#45;-&gt; &lt;!&#45;-#echo encoding=&quot;none&quot; var=&quot;TITLE&quot; &#45;-&gt;&lt;/h1&gt;
&lt;hr /&gt;</pre>
<p>My <code>/errordocs/BOTTOM.html</code></p>
<pre>&lt;p&gt;If this should not be an error please &lt;a href=&quot;mailto:webmaster@askapache.com?subject=ID#&lt;!&#45;-#echo encoding=&quot;none&quot; var=&quot;UNIQUE_ID&quot; &#45;-&gt;&quot;&gt;email&lt;/a&gt; me right away.&lt;/p&gt;
&lt;!&#45;-#if expr=&quot;$HTTP_REFERER&quot; &#45;-&gt;
&lt;p&gt;You came from &lt;!&#45;-#echo var=&quot;HTTP_REFERER&quot;&#45;-&gt;&lt;/p&gt;
&lt;!&#45;-#endif &#45;-&gt;
&lt;p&gt;If you still have a question, please try to find the information you are looking
for on the &lt;a href=&quot;http://www.askapache.com/&quot;&gt;AskApache Home page&lt;/a&gt; or
the &lt;a href=&quot;http://www.askapache.com/search/&quot;&gt;AskApache search page&lt;/a&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;address&gt;
  &lt;a href=&quot;http://www.askapache.com/about/&quot;&gt;Webmaster&lt;/a&gt;
  $Id:&lt;!&#45;-#echo encoding=&quot;none&quot; var=&quot;UNIQUE_ID&quot; &#45;-&gt; Error-&lt;!&#45;-#echo encoding=&quot;none&quot; var=&quot;REDIRECT_STATUS&quot; &#45;-&gt;,v 1.30 &lt;!&#45;-#config timefmt=&quot;%c&quot; &#45;-&gt;&lt;!&#45;-#echo var=&quot;DATE_LOCAL&quot; &#45;-&gt;&lt;br /&gt;
  &lt;!&#45;-#echo var=&quot;SERVER_SOFTWARE&quot; &#45;-&gt;
&lt;/address&gt;
&lt;!&#45;-#if expr=&quot;$REMOTE_ADDR = 10.10.10.10&quot; &#45;-&gt;
&lt;pre &gt;&lt;!&#45;-#printenv &#45;-&gt;&lt;/ pre&gt;
&lt;!&#45;-#endif &#45;-&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<h2><a name="htaccess-ssi-security" id="htaccess-ssi-security"></a>Dealing with Spam and Website Attacks</h2>
<p><a href="http://uploads.askapache.com/2009/03/htaccess-f-off.png" rel="nofollow" class="IFL"  title="htaccess f-off"><img src="http://uploads.askapache.com/2009/03/htaccess-f-off-350x273.png" alt="htaccess SSI to scare spammers and crackers" title="htaccess f-off" /></a>Say you are using some nice <a href="http://www.askapache.com/htaccess/htaccess-plugin-blocks-spam-hackers-and-password-protects-blog.html">.htaccess rewrite</a> rules to block offending bots, web scrapers, and other nefarious net characters.  Instead of just sending a 403 Denied, you could send them to be handled by an SSI document that could do any number of things.. From adding the offending bot&#8217;s IP address to the .htaccess Deny List (blacklisting), emailing you with an alert, emailing the IP Block Owner, executing a denial-of-service response ala <a href="http://www.xav.com/scripts/guardian/help/1013.html" rel="nofollow" >guardian</a> (<em>script will return an artificially high Content-Length, and will then spoon-feed content bytes back to the client at a rate of one byte per second, for single-threaded or fixed-threadpool clients, this will hang all of their requests and render the attack inoperable</em>), or just output a frightening looking message which usually does the trick if the bot is humanoid.<br class="C" /></p>
<pre>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]
RewriteRule .* - [F]
&nbsp;
ErrorDocument 403 /errordocs/f-off.html</pre>
<p>Example <code>/errordocs/f-off.html</code>  <a href="http://static.askapache.com/f-off" rel="nofollow" >View it Live</a> (<em>Not Responsible for mental or physical harm caused by fright</em>)</p>
<pre>&lt;html&gt;&lt;head&gt;&lt;title&gt;WARNING &lt;!&#45;-#echo encoding=&quot;none&quot; var=&quot;REMOTE_ADDR&quot; &#45;-&gt;
- SECURITY TEAM ALERTED&lt;/title&gt;&lt;/head&gt;&lt;body&gt;
&lt;h2&gt;ATTENTION &lt;!&#45;-#echo encoding=&quot;none&quot; var=&quot;REMOTE_ADDR&quot; &#45;-&gt;&lt;/h2&gt;
&lt;p&gt;You have been flagged by our system as a potential threat.&lt;/p&gt;
&lt;p&gt;This request has been logged and the Security Team has been notified.&lt;br&gt;
Repeated attempts from IP address &lt;strong&gt;&lt;!&#45;-#echo encoding=&quot;none&quot; var=&quot;REMOTE_ADDR&quot; &#45;-&gt;&lt;/strong&gt; will result &lt;br&gt;
in the IP automatically being &lt;strong&gt;blacklisted&lt;/strong&gt; on this server&lt;br&gt;
and sent to blacklists around the world.  Additionally, the Security Team&lt;br&gt;
WILL alert the IP Address Block Owner and/or contact the authorities.&lt;br&gt;&lt;br&gt;&lt;/p&gt;
&nbsp;
&lt;h3&gt;LOGGED INFORMATION FROM THIS REQUEST&lt;/h3&gt;
&lt; pre&gt;
REMOTE_ADDR   :  &lt;!&#45;-#echo encoding=&quot;none&quot; var=&quot;REMOTE_ADDR&quot; &#45;-&gt;
REMOTE_PORT   :  &lt;!&#45;-#echo encoding=&quot;none&quot; var=&quot;REMOTE_PORT&quot; &#45;-&gt;
REQUEST_METHOD:  &lt;!&#45;-#echo encoding=&quot;none&quot; var=&quot;REQUEST_METHOD&quot; &#45;-&gt;&lt;!&#45;-#if expr=&quot;$HTTP_REFERER&quot;
&#45;-&gt;
REFERER       :  &lt;!&#45;-#echo encoding=&quot;url&quot; var=&quot;HTTP_REFERER&quot; &#45;-&gt;&lt;!&#45;-#endif
&#45;-&gt;
REQUEST_URI   :  &lt;!&#45;-#echo encoding=&quot;url&quot; var=&quot;REQUEST_URI&quot; &#45;-&gt;&lt;!&#45;-#if expr=&quot;$HTTP_USER_AGENT&quot;
&#45;-&gt;
USER_AGENT    :&lt;/ pre&gt;
&lt; pre style=&quot;white-space:normal;margin-left:150px;max-width:80%;&quot;&gt;  &lt;!&#45;-#echo encoding=&quot;none&quot; var=&quot;HTTP_USER_AGENT&quot; &#45;-&gt;
&lt;/ pre&gt;
&lt; pre&gt;&lt;!&#45;-#endif
&#45;-&gt;&lt;!&#45;-#if expr=&quot;$HTTP_COOKIE&quot;
&#45;-&gt;
COOKIES       :&lt;/ pre&gt;
&lt; pre style=&quot;white-space:normal;margin-left:150px;max-width:80%;&quot;&gt;  &lt;!&#45;-#echo encoding=&quot;none&quot; var=&quot;HTTP_COOKIE&quot; &#45;-&gt;
&lt;/ pre&gt;
&lt; pre&gt;&lt;!&#45;-#endif
&#45;-&gt;&lt;!&#45;-#if expr=&quot;$QUERY_STRING&quot;
&#45;-&gt;
QUERY_STRING  :  &lt;!&#45;-#echo encoding=&quot;url&quot; var=&quot;QUERY_STRING&quot; &#45;-&gt;&lt;!&#45;-#endif
&#45;-&gt;
&lt;/ pre&gt;&lt;/body&gt;&lt;/html&gt;</pre>
<hr class="C" />
<h2>Server Side Includes Detailed Info</h2>
<p>Ok now that we have the real-world usage out of the way, lets dig in a bit to the actual module <a href="http://static.askapache.com/servers/mod_include.c.html" rel="nofollow" style="color:#222;" href='http://static.askapache.com/servers/mod_include.c'>mod_include</a>, which if you want you can <a >view the source code here</a>.</p>
<h3>Enabling Server-Side Includes</h3>
<p>Server Side Includes are implemented by the INCLUDES filter.  For backwards compatibility, the server-parsed handler also activates the INCLUDES filter. As well, Apache will activate the INCLUDES filter for any document with mime type text/x-server-parsed-html or text/x-server-parsed-html3 (and the resulting output will have the mime type text/html).  If documents containing server-side include directives are given the extension .shtml, the following directives will make Apache parse them and assign the resulting document the mime type of text/html:</p>
<pre>AddType text/html .shtml
AddOutputFilter INCLUDES .shtml</pre>
<p>The following directive must be given for the directories containing the shtml files (typically in a <directory> section, but this directive is also valid in <a href="http://www.askapache.com/htaccess/htaccess.html">.htaccess files</a> if AllowOverride Options is set):</p>
<pre>Options +Includes</pre>
<h3>Server-Side Include Directives</h3>
<p>These are the Directives allowed in .htaccess files that are handled by <a href="http://httpd.apache.org/docs/1.3/mod/mod_include.html" rel="nofollow" >mod_include</a>.  Note that other modules may add additional directives, for instance the <code>exec</code> SSI Directive is supplied by <a href="http://httpd.apache.org/docs/trunk/mod/mod_cgi.html" rel="nofollow" >mod_cgi</a>.  This is how mod_cgi registers with mod_include to provide processing of the <code>exec</code> directive.  This is the code required to handle the &#8220;exec&#8221; SSI directive.</p>
<pre>cgi_pfn_reg_with_ssi = APR_RETRIEVE_OPTIONAL_FN(ap_register_include_handler);
cgi_pfn_reg_with_ssi(&quot;exec&quot;, handle_exec);
static const char * const aszPre[] = { &quot;mod_include.c&quot;, NULL };</pre>
<dl>
<dt><code>config</code></dt>
<dd>Controls various aspects of the parsing.</p>
<pre>&lt;!&#45;-#config [timefmt=&quot;&#46;..&quot;] [sizefmt=&quot;&#46;..&quot;] [errmsg=&quot;&#46;..&quot;] &#45;-&gt;
&lt;!&#45;-#config [echomsg=&quot;&#46;..&quot;] &#45;-&gt;
&lt;!&#45;-#config errmsg=&quot;[It appears that you don&#039;t know how to use SSI]&quot; &#45;-&gt;</pre>
<dl>
<dt><code>echomsg</code></dt>
<dd>(<em>since 2.1</em>) The value is a message that is sent back to the client if the <code><a href="#element.echo" rel="nofollow" >echo</a></code> element attempts to echo an undefined variable. This overrides any <code class="directive"><a href="#ssiundefinedecho" rel="nofollow" >SSIUndefinedEcho</a></code> directives.</dd>
<dt><code>errmsg</code></dt>
<dd>The value is a message that is sent back to the client if an error occurs while parsing the document. This overrides any <code class="directive"><a href="#ssierrormsg" rel="nofollow" >SSIErrorMsg</a></code> directives.</dd>
<dt><code>sizefmt</code></dt>
<dd>The value sets the format to be used which displaying the size of a file. Valid values are <code>bytes</code> for a count in bytes, or <code>abbrev</code> for a count in Kb or Mb as appropriate, for example a size of 1024 bytes will be printed as &#8220;1K&#8221;.</dd>
<dt><code>timefmt</code></dt>
<dd>The value is a string to be used by the <code>strftime(3)</code> library routine when printing dates.</dd>
</dl>
</dd>
<dt><code>echo</code></dt>
<dd>Prints one of the include variables. If the variable is unset, the result is determined by the SSIUndefinedEcho directive.</p>
<pre class='a'>&lt;!&#45;-#echo [encoding=&quot;none|url|entity&quot;] var=&quot;&#46;..&quot; [encoding=&quot;none|url|entity&quot;] var=&quot;&#46;..&quot; &#46;.. &#45;-&gt;</pre>
<dl>
<dt><code>var</code></dt>
<dd>The value is the name of the variable to print.</dd>
<dt><code>encoding</code></dt>
<dd>
<p>Specifies how Apache should encode special characters contained in the variable before outputting them. If set to <code>none</code>, no encoding will be done. If set to <code>url</code>, then URL encoding (also known as %-encoding; this is appropriate for use within URLs in links, etc.) will be performed. The default is set to <code>entity</code>, resulting in entity encoding.</p>
</dd>
</dl>
</dd>
<dt><code>exec</code></dt>
<dd>Execute external programs</p>
<pre>&lt;!&#45;-#exec cgi=&quot;/cgi-bin/s.cgi&quot; &#45;-&gt;
&lt;!&#45;-#exec cmd=&quot;ls&quot; &#45;-&gt;
&lt;!&#45;-#include virtual=&quot;/cgi-bin/s.cgi?argument=value&quot; &#45;-&gt;
&lt;!&#45;-#exec cmd=&quot;perl /cgi-bin/s.pl args&quot; &#45;-&gt;</pre>
</dd>
<dt><code>include</code></dt>
<dd>Include a file</p>
<pre class='a'>&lt;!&#45;-#include virtual|file=&quot;&#46;..&quot; [virtual|file=&quot;&#46;..&quot;] &#46;.. &#45;-&gt;</pre>
</dd>
<dt><code>printenv</code></dt>
<dd>Print all available variables</p>
<pre>&lt;!&#45;-#printenv &#45;-&gt;</pre>
</dd>
<dt><code>set</code></dt>
<dd>Set a value of a variable.</p>
<pre class='a'>&lt;!&#45;-#set var=&quot;&#46;..&quot; value=&quot;&#46;..&quot; &#46;.. &#45;-&gt;
&lt;!&#45;-#set var=&quot;modified&quot; value=&quot;$LAST_MODIFIED&quot; &#45;-&gt;
&lt;!&#45;-#set var=&quot;name&quot; value=&quot;AskApache&quot; &#45;-&gt;
&lt;!&#45;-#set var=&quot;date&quot; value=&quot;${DATE_LOCAL}_${DATE_GMT}&quot; &#45;-&gt;</pre>
</dd>
<dt><code>flastmod</code></dt>
<dd>Prints the last modification date of the specified file, subject to the timefmt format specification.</p>
<pre>&lt;!&#45;-#flastmod virtual|file=&quot;&#46;..&quot; [virtual|file=&quot;&#46;..&quot;] &#46;.. &#45;-&gt;</pre>
</dd>
<dt><code>fsize</code></dt>
<dd>Prints the size of the specified file, subject to the sizefmt format specification.</p>
<pre class='a'>&lt;!&#45;-#fsize virtual|file=&quot;&#46;..&quot; [virtual|file=&quot;&#46;..&quot;] &#46;.. &#45;-&gt;</pre>
</dd>
<dt><code>if</code></dt>
<dd>The if element works like an if statement in a programming language. The test condition is evaluated and if the result is true, then the text until the next elif, else or endif element is included in the output stream.</p>
<pre>&lt;!&#45;-#if expr=&quot;&#46;..&quot; &#45;-&gt;
&lt;!&#45;-#if expr=&quot;${REMOTE_USER} &amp;&amp; ${HTTP_USER_AGENT}&quot; &#45;-&gt;</pre>
<pre>&lt;!&#45;-#if expr=&quot;test_condition&quot; &#45;-&gt;
&lt;!&#45;-#elif expr=&quot;test_condition&quot; &#45;-&gt;
&lt;!&#45;-#else &#45;-&gt;
&lt;!&#45;-#endif &#45;-&gt;</pre>
</dd>
<dt><code>elif</code></dt>
<dd>Used to put text into the output stream if the original test_condition was false. </p>
<pre class='a'>&lt;!&#45;-#elif expr=&quot;&#46;..&quot; &#45;-&gt;</pre>
</dd>
<dt><code>else</code></dt>
<dd>Used to put text into the output stream if the original test_condition was false.</p>
<pre>&lt;!&#45;-#else &#45;-&gt;</pre>
</dd>
<dt><code>endif</code></dt>
<dd>Ends the if element and is required.</p>
<pre class='a'>&lt;!&#45;-#endif &#45;-&gt;</pre>
</dd>
</dl>
<h3>.htaccess directives</h3>
<ol>
<li>XBitHack</li>
<li>SSIErrorMsg</li>
<li>SSITimeFormat</li>
<li>SSIStartTag</li>
<li>SSIEndTag</li>
<li>SSIUndefinedEcho</li>
<li>SSIAccessEnable</li>
</ol>
<h3>mod_include Default SSI Values</h3>
<dl>
<dt><code>START_SEQUENCE</code></dt>
<dd><code><!--#</code> - The starting tag for mod_include to recognize and parse as SSI.</code></dd>
<dt><code>END_SEQUENCE</code></dt>
<dd><code>--></code> &#8211; The ending tag for mod_include to recognize and parse as SSI.</dd>
<dt><code>ERROR_MSG</code></dt>
<dd><code>[an error occurred while processing this directive]</code> &#8211; On Errors parsing SSI.</dd>
<dt><code>TIME_FORMAT</code></dt>
<dd><code>%A, %d-%b-%Y %H:%M:%S %Z</code> &#8211; Default Time format for DATE</dd>
<dt><code>UNDEFINED_ECHO</code></dt>
<dd><code>(none)</code> &#8211; When echoing an undefined variable.</dd>
</dl>
<h3>SSI Variables</h3>
<pre>DATE_GMT=Sun Mar  8 22:58:56 2009
DATE_LOCAL=Sun Mar  8 15:58:56 2009
DOCUMENT_NAME=FOOTER.html
DOCUMENT_ROOT=/root-srv/protected/askapache.com/sec
DOCUMENT_URI=/includes/FOOTER.html
GATEWAY_INTERFACE=CGI/1.1
HTTP_ACCEPT=text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
HTTP_ACCEPT_CHARSET=ISO-8859-1,utf-8;q=0.7,*;q=0.7
HTTP_ACCEPT_ENCODING=gzip,deflate
HTTP_ACCEPT_LANGUAGE=en-us,en;q=0.5
HTTP_CACHE_CONTROL=max-age=0
HTTP_CONNECTION=keep-alive
HTTP_COOKIE=__qca=12298910-686528-46510;  __utmb=50625.1.0.11311
HTTP_HOST=www.askapache.com
HTTP_KEEP_ALIVE=300
HTTP_REFERER=http://www.askapache.com/htaccess/htaccess.html
HTTP_USER_AGENT=Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.6) Gecko/2009011913 Firefox/3.0.6 (.NET CLR 3.5.30729)
LAST_MODIFIED=Sun Mar  8 14:53:50 2009
PATH=/bin:/usr/bin:/sbin:/usr/sbin
QUERY_STRING=
REMOTE_ADDR=24.123.215.60
REMOTE_PORT=4785
REQUEST_METHOD=GET
REQUEST_URI=/htaccess/
SCRIPT_FILENAME=/root-srv/protected/askapache.com/sec/includes/FOOTER.html
SCRIPT_NAME=/includes/FOOTER.html
SCRIPT_URI=http://www.askapache.com/htaccess/
SCRIPT_URL=/htaccess/
SERVER_ADDR=64.111.114.111
SERVER_ADMIN=webmaster@askapache.com
SERVER_NAME=www.askapache.com
SERVER_PORT=80
SERVER_PROTOCOL=INCLUDED
SERVER_SIGNATURE=
SERVER_SOFTWARE=Apache/2.0.61 (Unix) PHP/4.4.7 mod_ssl/2.0.63 OpenSSL/0.9.7e mod_fastcgi/2.4.2 DAV/2 SVN/1.4.2
UNIQUE_ID=dnbtH0Bvcm8A2ZHqcAAAAM
USER_NAME=</pre>
<h3>More SSI Information</h3>
<ol>
<li><a href="http://httpd.apache.org/docs/trunk/mod/mod_include.html" rel="nofollow" >mod_include</a></li>
<li><a href="http://httpd.apache.org/docs/trunk/filter.html" rel="nofollow" >Apache Filters</a></li>
<li><a href="http://httpd.apache.org/docs/trunk/howto/ssi.html" rel="nofollow" >Introduction to Server Side Includes</a></li>
<li><a href="http://httpd.apache.org/docs/trunk/handler.html" rel="nofollow" >Apache Handlers</a></li>
</ol>
<p><a href="http://www.askapache.com/htaccess/advanced-htaccess-ssi.html"></a><a href="http://www.askapache.com/htaccess/advanced-htaccess-ssi.html">Advanced Htaccess &#8211; SSI, ErrorDocuments, DirectoryIndexing SEO</a> originally appeared on <cite>AskApache.com</cite> </p>]]></content:encoded>
			<wfw:commentRss>http://www.askapache.com/htaccess/advanced-htaccess-ssi.html/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>The Ultimate Htaccess</title>
		<link>http://www.askapache.com/htaccess/htaccess.html</link>
		<comments>http://www.askapache.com/htaccess/htaccess.html#comments</comments>
		<pubDate>Sat, 10 Jan 2009 13:05:32 +0000</pubDate>
		<dc:creator>AskApache</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Apache Modules]]></category>
		<category><![CDATA[Cache]]></category>
		<category><![CDATA[DreamHost]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Htaccess]]></category>
		<category><![CDATA[Linux Unix BSD]]></category>
		<category><![CDATA[Mod_Rewrite]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Web Design]]></category>
		<category><![CDATA[Web Hosting]]></category>
		<category><![CDATA[Web Tools]]></category>
		<category><![CDATA[Webmaster]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[.htaccess examples]]></category>
		<category><![CDATA[301 Redirect]]></category>
		<category><![CDATA[302 Redirect]]></category>
		<category><![CDATA[401]]></category>
		<category><![CDATA[403 Forbidden]]></category>
		<category><![CDATA[404 Not Found]]></category>
		<category><![CDATA[500]]></category>
		<category><![CDATA[503]]></category>
		<category><![CDATA[admin]]></category>
		<category><![CDATA[Advanced]]></category>
		<category><![CDATA[Apache Htaccess]]></category>
		<category><![CDATA[apache ssl]]></category>
		<category><![CDATA[askapache]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[authorization]]></category>
		<category><![CDATA[Backups]]></category>
		<category><![CDATA[Bandwidth]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[Blocking]]></category>
		<category><![CDATA[Boot]]></category>
		<category><![CDATA[Cache-Control]]></category>
		<category><![CDATA[caching]]></category>
		<category><![CDATA[cheatsheet]]></category>
		<category><![CDATA[chmod]]></category>
		<category><![CDATA[code snippets]]></category>
		<category><![CDATA[compression]]></category>
		<category><![CDATA[Cookies]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[debugging]]></category>
		<category><![CDATA[Email]]></category>
		<category><![CDATA[error log]]></category>
		<category><![CDATA[errordocument]]></category>
		<category><![CDATA[Etags]]></category>
		<category><![CDATA[Examples]]></category>
		<category><![CDATA[experiments]]></category>
		<category><![CDATA[feed]]></category>
		<category><![CDATA[FeedBurner]]></category>
		<category><![CDATA[File System]]></category>
		<category><![CDATA[FilesMatch]]></category>
		<category><![CDATA[filesystem]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Forms]]></category>
		<category><![CDATA[GET]]></category>
		<category><![CDATA[hotlinking]]></category>
		<category><![CDATA[HowTo]]></category>
		<category><![CDATA[htaccess files]]></category>
		<category><![CDATA[htaccess guide]]></category>
		<category><![CDATA[htaccess rewrite]]></category>
		<category><![CDATA[htaccess tricks]]></category>
		<category><![CDATA[htaccess tutorial]]></category>
		<category><![CDATA[Htpasswd]]></category>
		<category><![CDATA[HTTP Error]]></category>
		<category><![CDATA[HTTP Headers]]></category>
		<category><![CDATA[HTTP-EQUIV]]></category>
		<category><![CDATA[httpd]]></category>
		<category><![CDATA[httpd.conf]]></category>
		<category><![CDATA[HTTPS SSL]]></category>
		<category><![CDATA[hyper text transfer protocol]]></category>
		<category><![CDATA[If-Modified-Since]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Last-Modified]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Login]]></category>
		<category><![CDATA[Logs]]></category>
		<category><![CDATA[mad skills]]></category>
		<category><![CDATA[mod_include]]></category>
		<category><![CDATA[mod_python]]></category>
		<category><![CDATA[Mod_Rewrite examples]]></category>
		<category><![CDATA[Mod_Security]]></category>
		<category><![CDATA[Mod_Setenvif]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[Nice]]></category>
		<category><![CDATA[nsa]]></category>
		<category><![CDATA[password]]></category>
		<category><![CDATA[password protection]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[php.ini]]></category>
		<category><![CDATA[phpinfo]]></category>
		<category><![CDATA[Port]]></category>
		<category><![CDATA[post]]></category>
		<category><![CDATA[Powweb]]></category>
		<category><![CDATA[Prompt]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[ram]]></category>
		<category><![CDATA[Redirect]]></category>
		<category><![CDATA[Redirection]]></category>
		<category><![CDATA[Request Method]]></category>
		<category><![CDATA[Rewrite Tricks]]></category>
		<category><![CDATA[rewritecond]]></category>
		<category><![CDATA[rewriterule]]></category>
		<category><![CDATA[Robot]]></category>
		<category><![CDATA[robots]]></category>
		<category><![CDATA[Sample .htaccess]]></category>
		<category><![CDATA[Scripts]]></category>
		<category><![CDATA[seo secrets]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[server config]]></category>
		<category><![CDATA[servers]]></category>
		<category><![CDATA[SetEnvIf]]></category>
		<category><![CDATA[Shell]]></category>
		<category><![CDATA[Socket]]></category>
		<category><![CDATA[Source Code]]></category>
		<category><![CDATA[SPEED]]></category>
		<category><![CDATA[SSH]]></category>
		<category><![CDATA[SSI]]></category>
		<category><![CDATA[stat]]></category>
		<category><![CDATA[SymLinks]]></category>
		<category><![CDATA[trick]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[ultimate htaccess]]></category>
		<category><![CDATA[Username]]></category>

		<guid isPermaLink="false">http://www.askapache.com.com/htaccess/htaccesselite-ultimate-htaccess-article.html</guid>
		<description><![CDATA[<p><strong>Skip this - still under edit</strong></p>
<p>I discovered these tips and tricks mostly while working as a network security penetration specialist hired to find security holes in web hosting environments.  Shared hosting is the most common and cheapest form of web-hosting where multiple customers are placed on a single machine and "share" the resources (CPU/RAM/SPACE).  The machines are configured to basically ONLY do HTTP and FTP.  No shells or any interactive logins, no ssh, just FTP access.  That is when I started examining htaccess files in great detail and learned about the incredible untapped power of htaccess.  For 99% of the worlds best Apache admins, they don't use .htaccess much, if AT ALL.  It's much easier, safer, and faster to configure Apache using the httpd.conf file instead.  However, this file is almost never readable on shared-hosts, and I've never seen it writable.  So the only avenue left for those on shared-hosting was and is the .htaccess file, and holy freaking fiber-optics.. it's almost as powerful as httpd.conf itself!<br /><br />Most all .htaccess code works in the httpd.conf file, but not all httpd.conf code works in .htaccess files, around 50%.  So all the best Apache admins and programmers never used .htaccess files.  There was no incentive for those with access to httpd.conf to use htaccess, and the gap grew.  It's common to see "computer gurus" on forums and mailing lists rail against all uses and users of .htaccess files, smugly announcing the well known problems with .htaccess files compared with httpd.conf - I wonder if these "gurus" know the history of the htaccess file, like it's use in the earliest versions of the HTTP Server- NCSA's HTTPd, which BTW, became known as Apache HTTP.  So you could easily say that htaccess files predates Apache itself.<br /><br />Once I discovered what .htaccess files could do towards helping me enumerate and exploit security vulnerabilities even on big shared-hosts I focused all my research into .htaccess files, meaning I was reading the venerable Apache HTTP Source code 24/7!  I compiled every released version of the Apache Web Server, ever, even NCSA's, and focused on enumerating the most powerful htaccess directives. Good times! Because my focus was on protocol/file/network vulnerabilites instead of web dev I built up a nice toolbox of htaccess tricks to do unusual things.  When I switched over to webdev in 2005 I started using htaccess for websites, not research.  I documented most of my favorites and rewrote the htaccess guide for webdevelopers.  After some great encouragement on various forums and nets I decided to start a blog to share my work with everyone, AskApache.com was registered, I published my guide, and it was quickly plagiarized and scraped all over the net.  Information is freedom, and freedom is information, so this blog has the least restrictive copyright for you.  Feel free to modify, copy, republish, sell, or use anything on this site ;)</p>]]></description>
			<content:encoded><![CDATA[<p><strong><dfn title="HyperText Access">.htaccess</dfn></strong> is a very ancient configuration file that controls the Web Server running your website, and is one of the most powerful configuration files you will ever come across. Htaccess is sometimes called:  &#8220;HyperText Access&#8221; because of its ability to control access of the <acronym title="World Wide Web">WWW</acronym>&#8216;s HyperText Transfer Protocol (<acronym title="HyperText Transfer Protocol">HTTP</acronym>) using Password Protection, 301 Redirects, and much much more.  This is because this configuration file was coded in the earliest days of the web (HTTP), for one of the first Web Servers built for HTTP.  Eventually these Web Servers (configured with htaccess) became known as the World Wide Web, and eventually grew into the Internet we know today.</p>
<p><a href="/htaccess/htaccess.html" rel="nofollow" class="IFL" ><img src="http://uploads.askapache.com/2008/08/htaccess-up.png" alt=".htaccess file tutorial" title=".htaccess file tutorial" width="141" height="144" /></a>This is not an <em>introduction to .htaccess</em>&hellip; This is the evolution of the best of the best <tt>.htaccess</tt> on the planet.  Its changed over the years with more and better <strong>.htaccess tricks</strong> using real <a href="#htaccess-code-examples" rel="nofollow" >.htaccess example code</a>.  I add my favorite htaccess-related links and sites, results from my <a href="#best-htaccess-articles" rel="nofollow" >htaccess research</a>, and frequently update this article.</p>
<p>You&#8217;ve come to the right place if you are looking to acquire <strong>mad skills</strong> for using .htaccess files.</p>
<p>Originally (2003) this guide was known in certain hacker circles and hidden corners of the net as an <em>ultimate .htaccess</em> due to the powerful <strong>htaccess tricks</strong> and tips to bypass security on a webhost, and also because many of the tricks and <a href="#htaccess-code-examples" rel="nofollow" >examples</a> were pretty impressive back then in that group.<br class="C" /></p>
<h3>AskApache Htaccess Journey</h3>
<p><strong>Skip this &#8211; still under edit</strong></p>
<p>I discovered these tips and tricks mostly while working as a network security penetration specialist hired to find security holes in web hosting environments.  Shared hosting is the most common and cheapest form of web-hosting where multiple customers are placed on a single machine and &#8220;share&#8221; the resources (CPU/RAM/SPACE).  The machines are configured to basically ONLY do HTTP and FTP.  No shells or any interactive logins, no ssh, just FTP access.  That is when I started examining htaccess files in great detail and learned about the incredible untapped power of htaccess.  For 99% of the worlds best Apache admins, they don&#8217;t use .htaccess much, if AT ALL.  It&#8217;s much easier, safer, and faster to configure Apache using the httpd.conf file instead.  However, this file is almost never readable on shared-hosts, and I&#8217;ve never seen it writable.  So the only avenue left for those on shared-hosting was and is the .htaccess file, and holy freaking fiber-optics.. it&#8217;s almost as powerful as httpd.conf itself!</p>
<p>Most all .htaccess code works in the httpd.conf file, but not all httpd.conf code works in .htaccess files, around 50%.  So all the best Apache admins and programmers never used .htaccess files.  There was no incentive for those with access to httpd.conf to use htaccess, and the gap grew.  It&#8217;s common to see &#8220;computer gurus&#8221; on forums and mailing lists rail against all uses and users of .htaccess files, smugly announcing the well known problems with .htaccess files compared with httpd.conf &#8211; I wonder if these &#8220;gurus&#8221; know the history of the htaccess file, like it&#8217;s use in the earliest versions of the HTTP Server- NCSA&#8217;s HTTPd, which BTW, became known as Apache HTTP.  So you could easily say that htaccess files predates Apache itself.</p>
<p>Once I discovered what .htaccess files could do towards helping me enumerate and exploit security vulnerabilities even on big shared-hosts I focused all my research into .htaccess files, meaning I was reading the venerable Apache HTTP Source code 24/7!  I compiled every released version of the Apache Web Server, ever, even NCSA&#8217;s, and focused on enumerating the most powerful htaccess directives. Good times! Because my focus was on protocol/file/network vulnerabilites instead of web dev I built up a nice toolbox of htaccess tricks to do unusual things.  When I switched over to webdev in 2005 I started using htaccess for websites, not research.  I documented most of my favorites and rewrote the htaccess guide for webdevelopers.  After some great encouragement on various forums and nets I decided to start a blog to share my work with everyone, AskApache.com was registered, I published my guide, and it was quickly plagiarized and scraped all over the net.  Information is freedom, and freedom is information, so this blog has the least restrictive copyright for you.  Feel free to modify, copy, republish, sell, or use anything on this site ;)</p>
<div style="margin-left:2em;">
<p><a id="htaccess-toc" title="Htaccess - Table of Contents"></a></p>
<h2>Table of Contents</h2>
<ol class="TOC">
<li><a href="#htaccess-evolution" rel="nofollow"  title="Evolution of Htaccess">Evolution of Htaccess</a></li>
<li><a href="#httpd-config-examples" rel="nofollow"  title="Server Config (httpd.conf) Examples">Server Config (httpd.conf) Examples</a></li>
<li><a href="#htaccess-example-files" rel="nofollow"  title="Example .htaccess Files"><strong>Example .htaccess Files</strong></a></li>
<li><a href="#htaccess-code-examples" rel="nofollow"  title="Example .htaccess Code Snippets"><strong>Example .htaccess Code Snippets</strong></a></li>
<li><a href="#mod_rewrite-examples" rel="nofollow"  title="Example mod_rewrite code and tricks"><strong>NEW: Advanced Mod_Rewrite Tricks</strong></a></li>
<li><a href="#best-htaccess-articles" rel="nofollow"  title="Best AskApache .htaccess Articles">Best AskApache .htaccess Articles</a></li>
<li><a href="#favorite-htaccess" rel="nofollow"  title="Favorite .htaccess Links">Favorite .htaccess Links</a></li>
<li><a href="#htaccess-directives-list" rel="nofollow"  title="Master List of .htaccess Directives">Master List of .htaccess Directives</a></li>
<li><a href="#htaccess-modules" rel="nofollow"  title="Htaccess Modules List">Htaccess Modules List</a></li>
</ol>
</div>
<p><a id="htaccess-evolution" title="Htaccess - Evolved"></a></p>
<h2>Htaccess &#8211; Evolved</h2>
<p>The Hyper Text Transfer Protocol (HTTP) was initiated at the CERN in Geneve (Switzerland), where it emerged (together with the HTML presentation language) from the need to exchange scientific information on a computer network in a simple manner. The first public HTTP implementation only allowed for plain text information, and almost instantaneously became a replacement of the GOPHER service. One of the first text-based browsers was LYNX which still exists today; a graphical HTTP client appeared very quickly with the name NCSA Mosaic. Mosaic was a popular browser back in 1994. Soon the need for a more rich multimedia experience was born, and the markup language provided support for a growing multitude of media types.</p>
<p>Htaccess file know-how will do several things for you:</p>
<ul>
<li>Make your website noticeably faster.</li>
<li>Allow you to debug your server with ease.</li>
<li>Make your life easier and more rewarding.</li>
<li>Allow you to work faster and more productively.</li>
</ul>
<h3>What Is .htaccess</h3>
<p>Specifically, <kbd>.htaccess</kbd> is the default file name of a special configuration file that provides a number of <a href="#htaccess-directives" rel="nofollow" >directives</a> (commands) for controlling and configuring the <a href="http://httpd.apache.org/" rel="nofollow"  title="open-source HTTP server running the WWW">Apache Web Server</a>, and also to control and configure <a href="#htaccess-modules" rel="nofollow" >modules</a> that can be built into the Apache installation, or included at run-time like mod_rewrite (for htaccess rewrite), mod_alias (for htaccess redirects), and mod_ssl (for controlling SSL connections).</p>
<p><strong>Htaccess</strong> allows for decentralized management of Web Server configurations which makes life very easy for web hosting companies and especially their savvy consumers.  They set up and run &#8220;server farms&#8221; where many hundreds and thousands of web hosting customers are all put on the same Apache Server.  This type of hosting is called &#8220;virtual hosting&#8221; and without .htaccess files would mean that every customer must use the same exact settings as everyone else on their segment.  So that is why any half-decent web host allows/enables <em>(DreamHost, Powweb, MediaTemple, GoDaddy) .htaccess files</em>, though few people are aware of it.  Let&#8217;s just say that if I was a customer on your server-farm, and .htaccess files were enabled, my websites would be a LOT faster than yours, as these configuration files allow you to fully take advantage of and utilize the resources allotted to you by your host.  If even 1/10 of the sites on a server-farm took advantage of what they are paying for, the providers would go out of business.</p>
<blockquote cite="http://httpd.apache.org/docs/1.3/misc/API.html">
<p>One of the design goals for this server was to maintain external compatibility with the NCSA 1.3 server &#8212; that is, to read the same configuration files, to process all the directives therein correctly, and in general to be a drop-in replacement for NCSA. On the other hand, another design goal was to move as much of the server&#8217;s functionality into modules which have as little as possible to do with the monolithic server core. The only way to reconcile these goals is to move the handling of most commands from the central server into the modules.</p>
<p>However, just giving the modules command tables is not enough to divorce them completely from the server core. The server has to remember the commands in order to act on them later. That involves maintaining data which is private to the modules, and which can be either per-server, or per-directory. Most things are per-directory, including in particular access control and authorization information, but also information on how to determine file types from suffixes, which can be modified by AddType and DefaultType directives, and so forth. In general, the governing philosophy is that anything which can be made configurable by directory should be; per-server information is generally used in the standard set of modules for information like Aliases and Redirects which come into play before the request is tied to a particular place in the underlying file system.</p>
<p>Another requirement for emulating the NCSA server is being able to handle the <strong>per-directory configuration files, generally called .htaccess files</strong>, though even in the NCSA server they can contain directives which have nothing at all to do with access control. Accordingly, after URI -> filename translation, but before performing any other phase, the server walks down the directory hierarchy of the underlying filesystem, following the translated pathname, to read any .htaccess files which might be present. The information which is read in then has to be merged with the applicable information from the server&#8217;s own config files (either from the <Directory> sections in access.conf, or from defaults in srm.conf, which actually behaves for most purposes almost exactly like <code><Directory /></code>).</p>
<p>Finally, after having served a request which involved <strong>reading .htaccess files</strong>, we need to discard the storage allocated for handling them. That is solved the same way it is solved wherever else similar problems come up, by tying those structures to the per-transaction resource pool.</p>
</blockquote>
<h4>Creating Htaccess Files</h4>
<p><a href="http://uploads.askapache.com/2009/01/htaccess-explorer.png" rel="nofollow" class="IFL" ><img src="http://uploads.askapache.com/2009/01/htaccess-explorer.png" alt="What an Htaccess File Looks Like in Windows Explorer" title="What an Htaccess File Looks Like in Windows Explorer" width="243" height="322" /></a>Htaccess files use the default filename &#8220;<code>.htaccess</code>&#8221; but any unix-style file name can be specified from the <a href="#httpd-config-examples" rel="nofollow" >main server config</a> using the <code>AccessFileName</code> directive.  The file isn&#8217;t <code>.htaccess.txt</code>, its literally just named <code>.htaccess</code>.<br class="C" /></p>
<p><a href="http://uploads.askapache.com/2009/01/viewing-htaccess-files.png" rel="nofollow" class="IFR" ><img src="http://uploads.askapache.com/2009/01/viewing-htaccess-files.png" alt="View .htaccess files" title="View .htaccess files" width="386" height="287" /></a>In a Windows Environment like the one I use for work, you can change how Windows opens and views .htaccess files by modifying the Folder Options in explorer.  As you can see, on my computer files ending in .htaccess are recognized as having the HTACCESS extension and are handled/opened by Adobe Dreamweaver CS4.<br class="C" /></p>
<h4>Htaccess Scope</h4>
<p>Unlike the main server configuration files like <a href="#httpd-config-examples" rel="nofollow" >httpd.conf</a>, <strong>Htaccess files are read on every request</strong> therefore changes in these files take immediate effect.  Apache searches all directories and subdirectories that are htaccess-enabled for an .htaccess file which results in performance loss due to file accesses. I&#8217;ve never noticed a performance loss but OTOH, I know how to use them.  If you do have access to your main server configuration file, you should of course use that instead, and lucky for you ALL the .htaccess tricks and examples can be used there as well (just not vice versa).</p>
<h3>Htaccess File Syntax</h3>
<p>Htaccess files follow the same syntax as the main Apache configuration files, for powerusers here&#8217;s an <a href='http://uploads.askapache.com/2009/01/apache.vim'>apache.vim</a> for VI. The one main difference is the <dfn title="Whether the directive is allowed in .htaccess files">context</dfn> of the directive, which means whether or not that directive is ALLOWED to be used inside of an .htaccess file.  Htaccess files are incredibly powerful, and can also be very dangerous as some directives allowed in the main configuration files would allow users/customers to completely bypass security/bandwidth-limits/resource-limits/file-permissions, etc..  About 1/4 of all Apache directives cannot be used inside an .htaccess file (also known as a per-directory context config).  The Apache Developers are well-regarded throughout the world as being among some of the best programmers, ever.  To enable a disallowed directive inside a .htaccess file would require modifying the source code and re-compiling the server (which they allow and encourage if you are the owner/admin).  Here&#8217;s a taste of that famous Apache source code that builds the directives allowed in .htaccess file context, the key that tells whether its enabled in .htaccess context is the DIR_CMD_PERMS and then the OR_FILEINFO, which means a directive is enabled dependent on the AllowOverride directive that is only allowed in the main config.  First Apache 1.3.0, then Apache 2.2.10</p>
<h5>mod_autoindex</h5>
<pre>AddIcon, add_icon, BY_PATH, DIR_CMD_PERMS, an icon URL followed by one or more filenames
AddIconByType, add_icon, BY_TYPE, DIR_CMD_PERMS, an icon URL followed by one or more MIME types
AddIconByEncoding, add_icon, BY_ENCODING, DIR_CMD_PERMS, an icon URL followed by one or more content encodings
AddAlt, add_alt, BY_PATH, DIR_CMD_PERMS, alternate descriptive text followed by one or more filenames
AddAltByType, add_alt, BY_TYPE, DIR_CMD_PERMS, alternate descriptive text followed by one or more MIME types
AddAltByEncoding, add_alt, BY_ENCODING, DIR_CMD_PERMS, alternate descriptive text followed by one or more content encodings
IndexOptions, add_opts, DIR_CMD_PERMS, RAW_ARGS, one or more index options
IndexIgnore, add_ignore, DIR_CMD_PERMS, ITERATE, one or more file extensions
AddDescription, add_desc, BY_PATH, DIR_CMD_PERMS, Descriptive text followed by one or more filenames
HeaderName, add_header, DIR_CMD_PERMS, TAKE1, a filename
ReadmeName, add_readme, DIR_CMD_PERMS, TAKE1, a filename
FancyIndexing, fancy_indexing, DIR_CMD_PERMS, FLAG, Limited to &#039;on&#039; or &#039;off&#039; (superseded by IndexOptions FancyIndexing)
DefaultIcon, ap_set_string_slot, (void *) XtOffsetOf(autoindex_config_rec, default_icon), DIR_CMD_PERMS, TAKE1, an icon URL</pre>
<h5>mod_rewrite</h5>
<pre>// mod_rewrite
RewriteEngine, cmd_rewriteengine, OR_FILEINFO, On or Off to enable or disable (default)
RewriteOptions, cmd_rewriteoptions, OR_FILEINFO, List of option strings to set
RewriteBase, cmd_rewritebase, OR_FILEINFO, the base URL of the per-directory context
RewriteCond, cmd_rewritecond, OR_FILEINFO, an input string and a to be applied regexp-pattern
RewriteRule, cmd_rewriterule, OR_FILEINFO, an URL-applied regexp-pattern and a substitution URL
RewriteMap, cmd_rewritemap, RSRC_CONF, a mapname and a filename
RewriteLock, cmd_rewritelock, RSRC_CONF, the filename of a lockfile used for inter-process synchronization
RewriteLog, cmd_rewritelog, RSRC_CONF, the filename of the rewriting logfile
RewriteLogLevel, cmd_rewriteloglevel, RSRC_CONF, the level of the rewriting logfile verbosity (0=none, 1=std, .., 9=max)
RewriteLog, fake_rewritelog, RSRC_CONF, [DISABLED] the filename of the rewriting logfile
RewriteLogLevel, fake_rewritelog, RSRC_CONF, [DISABLED] the level of the rewriting logfile verbosity </pre>
<h3>Htaccess Directives</h3>
<p><strong>Don&#8217;t ask why</strong>, but I personally downloaded each major/beta release of the Apache HTTPD source code from version 1.3.0 to version 2.2.10 (<dfn title="1.3.0, 1.3.1, 1.3.11, 1.3.12, 1.3.14, 1.3.17, 1.3.19, 1.3.2, 1.3.20, 1.3.22, 1.3.23, 1.3.24, 1.3.27, 1.3.28, 1.3.29, 1.3.3, 1.3.31, 1.3.32, 1.3.33, 1.3.34, 1.3.35, 1.3.36, 1.3.37, 1.3.39, 1.3.4, 1.3.41, 1.3.6, 1.3.9, 2.0.35, 2.0.36, 2.0.39, 2.0.40, 2.0.42, 2.0.43, 2.0.44, 2.0.45, 2.0.46, 2.0.47, 2.0.48, 2.0.49, 2.0.50, 2.0.51, 2.0.52, 2.0.53, 2.0.54, 2.0.55, 2.0.58, 2.0.59, 2.0.61, 2.0.63, 2.1.3-beta, 2.1.6-alpha, 2.1.7-beta, 2.1.8-beta, 2.1.9-beta, 2.2.0, 2.2.2, 2.2.3, 2.2.4, 2.2.6, 2.2.8, 2.2.9, 2.2.10">all 63 Apache versions</dfn>!), then I <strong>configured and compiled each version for a custom HTTPD installation built from source</strong>. This allowed me to find <strong><a href="#htaccess-directives-list" rel="nofollow" >every directive allowed in .htaccess files</a></strong> for each particular version, which has never been done before, or since. <strong>YES!</strong> <em>I think that is so cool..</em></p>
<p><strong>An .htaccess directive</strong> is basically a command that is specific to a module or builtin to the core that performs a specific task or sets a specific setting for how Apache serves your WebSite.  Directives placed in Htaccess files <strong>apply to the directory they are in, and all sub-directories</strong>.  Here&#8217;s the 3 top links (<em>official Apache Docs</em>) you will repeatedly use, bookmark/print/save them.</p>
<p><a href="http://uploads.askapache.com/2008/08/htaccess-up1.png" rel="nofollow" ><img src="http://uploads.askapache.com/2008/08/htaccess-up1-350x178.png" alt="htaccess Context Legend" title="htaccess-up1" width="350" height="178" /></a></p>
<ol>
<li><a href="http://httpd.apache.org/docs/trunk/mod/directive-dict.html" rel="nofollow" >Terms Used to Describe Directives</a></li>
<li><a href="http://httpd.apache.org/docs/trunk/mod/directives.html" rel="nofollow" >Official List of Apache Directives</a></li>
<li><a href="http://httpd.apache.org/docs/trunk/mod/quickreference.html" rel="nofollow" >Directive Quick-Reference &#8212; with Context</a></li>
</ol>
<hr class="C" />
<h3>Litespeed .htaccess support</h3>
<p>Unlike other lightweight web servers, Apache compatible per-directory configuration overridden is fully supported by <a href="http://www.litespeedtech.com/" rel="nofollow" >LiteSpeed Web Server</a>. With .htacess you can change configurations for any directory under document root on-the-fly, which in most cases is a mandatory feature in shared hosting environment.   It is worth noting that <em>enabling .htaccess support in LiteSpeed</em> Web Server will not degrade server&#8217;s performance, comparing to Apache&#8217;s 40% drop in performance. </p>
<p><a id="httpd-config-examples"></a></p>
<h2>Main Server Config Examples</h2>
<p>Now lets take a look at some htaccess examples to get a feel for the syntax and some general ideas at the capabilities.  Some of the best examples for .htaccess files are included with Apache for <a href="http://httpd.apache.org/docs/trunk/configuring.html" rel="nofollow" >main server config</a> files, so lets take a quick look at a couple of them on our way down to the actual .htaccess examples further down the page (this site has thousands, take your time).  As you can see, the basic syntax is a line starting with # is a comment, everything else are directives followed by the directive argument.</p>
<p><strong><a href="http://uploads.askapache.com/2008/08/httpd-multilang-errordocconf.in" rel="nofollow" >httpd-multilang-errordoc.conf</a></strong>: The configuration below implements multi-language error documents through content-negotiation</p>
<pre>Options IncludesNoExec
AddOutputFilter Includes html
AddHandler type-map var
LanguagePriority en cs de es fr it ja ko nl pl pt-br ro sv tr
ForceLanguagePriority Prefer Fallback
ErrorDocument 401 /error/HTTP_UNAUTHORIZED.html.var
ErrorDocument 403 /error/HTTP_FORBIDDEN.html.var
ErrorDocument 404 /error/HTTP_NOT_FOUND.html.var</pre>
<p><strong><a href="http://uploads.askapache.com/2008/08/httpd-manualconf.in" rel="nofollow" >httpd-manual.conf</a></strong>: Provide local access to the server documentation on your server</p>
<pre>SetEnvIf Request_URI ^/manual/(de|en|es|fr|ja|ko|pt-br|ru|tr)/ prefer-language=$1
RedirectMatch 301 ^/manual(?:/(de|en|es|fr|ja|ko|pt-br|ru|tr)){2, }(/.*)?$ /manual/$1$2
LanguagePriority en de es fr ja ko pt-br ru tr
ForceLanguagePriority Prefer Fallback</pre>
<p><strong><a href="http://uploads.askapache.com/2008/08/httpd-languagesconf.in" rel="nofollow" >httpd-languages.conf</a></strong>: Settings for hosting different languages.</p>
<pre>DefaultLanguage en
AddLanguage ca .ca
# Just list the languages in decreasing order of preference.
LanguagePriority en ca cs da de el eo es et fr he hr it ja ko ltz nl nn no pl pt pt-BR ru sv tr zh-CN zh-TW
# Commonly used filename extensions to character sets.
AddCharset us-ascii.ascii .us-ascii
AddCharset ISO-8859-1  .iso8859-1  .latin1</pre>
<p><strong><a href="http://uploads.askapache.com/2008/08/httpd-autoindexconf.in" rel="nofollow" >httpd-autoindex.conf</a></strong>: Directives controlling the display of server-generated directory listings.</p>
<pre># IndexOptions: Controls the appearance of server-generated directory listings.
IndexOptions FancyIndexing HTMLTable VersionSort
# AddIcon* directives tell the server which icon to show for different files or filename extensions.
AddIconByEncoding (CMP, /icons/compressed.gif) x-compress x-gzip
AddIconByType (TXT, /icons/text.gif) text/*
AddIcon /icons/folder.gif ^^DIRECTORY^^
# DefaultIcon is which icon to show for files which do not have an icon explicitly set.
DefaultIcon /icons/unknown.gif
# AddDescription allows you to place a short description after a file in server-generated indexes.
AddDescription &quot;GZIP compressed document&quot; .gz
# ReadmeName is the name of the README file the server will look for by default, and append to directory listings.
ReadmeName README.html
# HeaderName is the name of a file which should be prepended to directory indexes.
HeaderName HEADER.html</pre>
<p>Here are the rest of them if you wanna take a look.  (<a href="http://uploads.askapache.com/2008/08/httpd-mpmconf.in" rel="nofollow"  title="Server-Pool Management (MPM specific)">httpd-mpm.conf</a>, <a href="http://uploads.askapache.com/2008/08/httpd-defaultconf.in" rel="nofollow"  title="This configuration file reflects default settings for Apache HTTP Server">httpd-default.conf</a>, <a href="http://uploads.askapache.com/2008/08/httpd-sslconf.in" rel="nofollow"  title="Contains the configuration directives to instruct the server how to serve pages over an https connection">httpd-ssl.conf</a>, <a href="http://uploads.askapache.com/2008/08/httpd-infoconf.in" rel="nofollow"  title="Get information about the requests being processed by the server and the configuration of the server">httpd-info.conf</a>, <a href="http://uploads.askapache.com/2008/08/httpd-vhostsconf.in" rel="nofollow"  title="If you want to maintain multiple domains/hostnames on your machine">httpd-vhosts.conf</a>, <a href="http://uploads.askapache.com/2008/08/httpd-davconf.in" rel="nofollow"  title="Distributed authoring and versioning (WebDAV)">httpd-dav.conf</a>)</p>
<hr class="C" />
<p><a id="htaccess-example-files"></a></p>
<h2>Example .htaccess Files</h2>
<p>Here are some samples and examples taken from different .htaccess files I&#8217;ve used over the years.  Specific solutions are farther down on this page and throughout the site.</p>
<pre># Set the Time Zone of your Server
SetEnv TZ America/Indianapolis
# ServerAdmin:  This address appears on some server-generated pages, such as error documents.
SetEnv SERVER_ADMIN webmaster@askapache.com
# Possible values for the Options directive are &quot;None&quot;, &quot;All&quot;, or any combination of:
#  Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
Options -ExecCGI -MultiViews -Includes -Indexes FollowSymLinks
# DirectoryIndex: sets the file that Apache will serve if a directory is requested.
DirectoryIndex index.html index.php /index.php
#
# Action lets you define media types that will execute a script whenever
# a matching file is called. This eliminates the need for repeated URL
# pathnames for oft-used CGI file processors.
# Format: Action media/type /cgi-script/location
# Format: Action handler-name /cgi-script/location
#
Action php5-cgi /bin/php.cgi
#
# AddHandler allows you to map certain file extensions to &quot;handlers&quot;:
# actions unrelated to filetype. These can be either built into the server
# or added with the Action directive (see below)
#
# To use CGI scripts outside of ScriptAliased directories:
# (You will also need to add &quot;ExecCGI&quot; to the &quot;Options&quot; directive.)
#
AddHandler php-cgi .php .inc
# Commonly used filename extensions to character sets.
AddDefaultCharset UTF-8
# AddType allows you to add to or override the MIME configuration
AddType &#039;application/rdf+xml; charset=UTF-8&#039; .rdf
AddType &#039;application/xhtml+xml; charset=UTF-8&#039; .xhtml
AddType &#039;application/xhtml+xml; charset=UTF-8&#039; .xhtml.gz
AddType &#039;text/html; charset=UTF-8&#039; .html
AddType &#039;text/html; charset=UTF-8&#039; .html.gz
AddType application/octet-stream .rar .chm .bz2 .tgz .msi .pdf .exe
AddType application/vnd.ms-excel .csv
AddType application/x-httpd-php-source .phps
AddType application/x-pilot .prc .pdb
AddType application/x-shockwave-flash .swf
AddType application/xrds+xml .xrdf
AddType text/plain .ini .sh .bsh .bash .awk .nawk .gawk .csh .var .c .in .h .asc .md5 .sha .sha1
AddType video/x-flv .flv
# AddEncoding allows you to have certain browsers uncompress information on the fly. Note: Not all browsers support this.
AddEncoding x-compress .Z
AddEncoding x-gzip .gz .tgz
# DefaultType: the default MIME type the server will use for a document.
DefaultType text/html
#
# Optionally add a line containing the server version and virtual host
# name to server-generated pages (internal error documents, FTP directory
# listings, mod_status and mod_info output etc., but not CGI generated
# documents or custom error documents).
# Set to &quot;EMail&quot; to also include a mailto: link to the ServerAdmin.
# Set to one of:  On | Off | EMail
#
ServerSignature Off</pre>
<pre>## MAIN DEFAULTS
Options +ExecCGI -Indexes
DirectoryIndex index.html index.htm index.php
DefaultLanguage en-US
AddDefaultCharset UTF-8
ServerSignature Off
## ENVIRONMENT VARIABLES
SetEnv PHPRC /webroot/includes
SetEnv TZ America/Indianapolis
&nbsp;
SetEnv SERVER_ADMIN webmaster@askapache.com
## MIME TYPES
AddType video/x-flv .flv
AddType application/x-shockwave-flash .swf
AddType image/x-icon .ico
## FORCE FILE TO DOWNLOAD INSTEAD OF APPEAR IN BROWSER
# http://www.htaccesselite.com/addtype-addhandler-action-vf6.html
AddType application/octet-stream .mov .mp3 .zip
## ERRORDOCUMENTS
# http://askapache.com/htaccess/apache-status-code-headers-errordocument.html
ErrorDocument 400 /e400/
ErrorDocument 401 /e401/
ErrorDocument 402 /e402/
ErrorDocument 403 /e403/
ErrorDocument 404 /e404/
#
# Handlers be builtin, included in a module, or added with Action directive
# default-handler: default, handles static content (core)
#   send-as-is: Send file with HTTP headers (mod_asis)
#   cgi-script: treat file as CGI script (mod_cgi)
#    imap-file: Parse as an imagemap rule file (mod_imap)
#   server-info: Get server config info (mod_info)
#  server-status: Get server status report (mod_status)
#    type-map: type map file for content negotiation (mod_negotiation)
#  fastcgi-script: treat file as fastcgi script (mod_fastcgi)
#
# http://www.askapache.com/php/custom-phpini-tips-and-tricks.html
## PARSE AS CGI
AddHandler cgi-script .cgi .pl .spl
## RUN PHP AS APACHE MODULE
AddHandler application/x-httpd-php .php .htm
## RUN PHP AS CGI
AddHandler php-cgi .php .htm
## CGI PHP WRAPPER FOR CUSTOM PHP.INI
AddHandler phpini-cgi .php .htm
Action phpini-cgi /cgi-bin/php5-custom-ini.cgi
## FAST-CGI SETUP WITH PHP-CGI WRAPPER FOR CUSTOM PHP.INI
AddHandler fastcgi-script .fcgi
AddHandler php-cgi .php .htm
Action php-cgi /cgi-bin/php5-wrapper.fcgi
## CUSTOM PHP CGI BINARY SETUP
AddHandler php-cgi .php .htm
Action php-cgi /cgi-bin/php.cgi
## PROCESS SPECIFIC FILETYPES WITH CGI-SCRIPT
Action image/gif /cgi-bin/img-create.cgi
## CREATE CUSTOM HANDLER FOR SPECIFIC FILE EXTENSIONS
AddHandler custom-processor .ssp
Action custom-processor /cgi-bin/myprocessor.cgi
### HEADER CACHING
# http://www.askapache.com/htaccess/speed-up-sites-with-htaccess-caching.html
&lt;FilesMatch &quot;\.(flv|gif|jpg|jpeg|png|ico)$&quot;&gt;
Header set Cache-Control &quot;max-age=2592000&quot;
&lt;/FilesMatch&gt;
&lt;FilesMatch &quot;\.(js|css|pdf|swf)$&quot;&gt;
Header set Cache-Control &quot;max-age=604800&quot;
&lt;/FilesMatch&gt;
&lt;FilesMatch &quot;\.(html|htm|txt)$&quot;&gt;
Header set Cache-Control &quot;max-age=600&quot;
&lt;/FilesMatch&gt;
&lt;FilesMatch &quot;\.(pl|php|cgi|spl|scgi|fcgi)$&quot;&gt;
Header unset Cache-Control
&lt;/FilesMatch&gt;
## ALTERNATE EXPIRES CACHING
# htaccesselite.com/d/use-htaccess-to-speed-up-your-site-discussion-vt67.html
ExpiresActive On
ExpiresDefault A604800
ExpiresByType image/x-icon A2592000
ExpiresByType application/x-javascript A2592000
ExpiresByType text/css A2592000
ExpiresByType text/html A300
&lt;FilesMatch &quot;\.(pl|php|cgi|spl|scgi|fcgi)$&quot;&gt;
ExpiresActive Off
&lt;/FilesMatch&gt;
## META HTTP-EQUIV REPLACEMENTS
&lt;FilesMatch &quot;\.(html|htm|php)$&quot;&gt;
Header set imagetoolbar &quot;no&quot;
&lt;/FilesMatch&gt;</pre>
<p>Here are some default MOD_REWRITE code examples.</p>
<pre>## REWRITE DEFAULTS
RewriteEngine On
RewriteBase /
## REQUIRE SUBDOMAIN
RewriteCond %{HTTP_HOST} !^$
RewriteCond %{HTTP_HOST} !^subdomain\.askapache\.com$ [NC]
RewriteRule ^/(.*)$ http://subdomain.askapache.com/$1 [L,R=301]
## SEO REWRITES
RewriteRule ^(.*)/ve/(.*)$ $1/voluntary-employee/$2 [L,R=301]
RewriteRule ^(.*)/hsa/(.*)$ $1/health-saving-account/$2 [L,R=301]
## WORDPRESS
RewriteCond %{REQUEST_FILENAME} !-f  # Existing File
RewriteCond %{REQUEST_FILENAME} !-d  # Existing Directory
RewriteRule . /index.php [L]
## ALTERNATIVE ANTI-HOTLINKING
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(subdomain\.)?askapache.com/.*$ [NC]
RewriteRule ^.*\.(bmp|tif|gif|jpg|jpeg|jpe|png)$ - [F]
## REDIRECT HOTLINKERS
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(subdomain\.)?askapache.com/.*$ [NC]
RewriteRule ^.*\.(bmp|tif|gif|jpg|jpeg|jpe|png)$ http://google.com [R]
## DENY REQUEST BASED ON REQUEST METHOD
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK|OPTIONS|HEAD)$ [NC]
RewriteRule ^.*$ - [F]
## REDIRECT UPLOADS
RewriteCond %{REQUEST_METHOD} ^(PUT|POST)$ [NC]
RewriteRule ^(.*)$ /cgi-bin/form-upload-processor.cgi?p=$1 [L,QSA]
## REQUIRE SSL EVEN WHEN MOD_SSL IS NOT LOADED
RewriteCond %{HTTPS} !=on [NC]
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]
### ALTERNATATIVE TO USING ERRORDOCUMENT
# http://www.htaccesselite.com/d/htaccess-errordocument-examples-vt11.html
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /error.php [L]
## SEO REDIRECTS
Redirect 301 /2006/oldfile.html http://subdomain.askapache.com/newfile.html
RedirectMatch 301 /o/(.*)$ http://subdomain.askapache.com/s/dl/$1</pre>
<p>Examples of protecting your files and securing with password protection.</p>
<pre>#
# Require (user|group|valid-user) (username|groupname)
#
## BASIC PASSWORD PROTECTION
AuthType basic
AuthName &quot;prompt&quot;
AuthUserFile /.htpasswd
AuthGroupFile /dev/null
Require valid-user
## ALLOW FROM IP OR VALID PASSWORD
Require valid-user
Allow from 192.168.1.23
Satisfy Any
## PROTECT FILES
&lt;FilesMatch &quot;\.(htaccess|htpasswd|ini|phps|fla|psd|log|sh)$&quot;&gt;
Order Allow,Deny
Deny from all
&lt;/FilesMatch&gt;
## PREVENT HOTLINKING
SetEnvIfNoCase Referer &quot;^http://subdomain.askapache.com/&quot; good
SetEnvIfNoCase Referer &quot;^$&quot; good
&lt;FilesMatch &quot;\.(png|jpg|jpeg|gif|bmp|swf|flv)$&quot;&gt;
Order Deny,Allow
Deny from all
Allow from env=good
ErrorDocument 403 http://www.google.com/intl/en_ALL/images/logo.gif
ErrorDocument 403 /images/you_bad_hotlinker.gif
&lt;/FilesMatch&gt;
## LIMIT UPLOAD FILE SIZE TO PROTECT AGAINST DOS ATTACK
#bytes, 0-2147483647(2GB)
LimitRequestBody 10240000
## MOST SECURE WAY TO REQUIRE SSL
# http://www.askapache.com/htaccess/apache-ssl-in-htaccess-examples.html
SSLOptions +StrictRequire
SSLRequireSSL
SSLRequire %{HTTP_HOST} eq &quot;askapache.com&quot;
ErrorDocument 403 https://askapache.com
## COMBINED DEVELOPER HTACCESS CODE-USE THIS
&lt;FilesMatch &quot;\.(flv|gif|jpg|jpeg|png|ico|js|css|pdf|swf|html|htm|txt)$&quot;&gt;
Header set Cache-Control &quot;max-age=5&quot;
&lt;/FilesMatch&gt;
AuthType basic
AuthName &quot;Ooops! Temporarily Under Construction&#46;..&quot;
AuthUserFile /.htpasswd
AuthGroupFile /dev/null
Require valid-user      # password prompt for everyone else
Order Deny,Allow
Deny from all
Allow from 192.168.64.5   # Your, the developers IP address
Allow from w3.org      # css/xhtml check jigsaw.w3.org/css-validator/
Allow from googlebot.com   # Allows google to crawl your pages
Satisfy Any        # no password required if host/ip is Allowed
## DONT HAVE TO EMPTY CACHE OR RELOAD TO SEE CHANGES
ExpiresDefault A5 #If using mod_expires
&lt;FilesMatch &quot;\.(flv|gif|jpg|jpeg|png|ico|js|css|pdf|swf|html|htm|txt)$&quot;&gt;
Header set Cache-Control &quot;max-age=5&quot;
&lt;/FilesMatch&gt;
## ALLOW ACCESS WITH PASSWORD OR NO PASSWORD FOR SPECIFIC IP/HOSTS
AuthType basic
AuthName &quot;Ooops! Temporarily Under Construction&#46;..&quot;
AuthUserFile /.htpasswd
AuthGroupFile /dev/null
Require valid-user      # password prompt for everyone else
Order Deny,Allow
Deny from all
Allow from 192.168.64.5   # Your, the developers IP address
Allow from w3.org      # css/xhtml check jigsaw.w3.org/css-validator/
Allow from googlebot.com   # Allows google to crawl your pages
Satisfy Any        # no password required if host/ip is Allowed</pre>
<hr class="C" />
<p><a id="htaccess-code-examples"></a></p>
<h2>Example .htaccess Code Snippets</h2>
<p>Here are some specific examples, this is the most popular section of this page.  Updated frequently.</p>
<h4>Redirect Everyone Except IP address to alternate page</h4>
<pre>ErrorDocument 403 http://www.yahoo.com/
Order deny,allow
Deny from all
Allow from 208.113.134.190</pre>
<h4>When developing sites</h4>
<p>This lets google crawl the page, lets me access  without a password, and lets my client access the page WITH a password.  It also allows for XHTML and CSS validation! (w3.org)</p>
<pre>AuthName &quot;Under Development&quot;
AuthUserFile /home/sitename.com/.htpasswd
AuthType basic
Require valid-user
Order deny,allow
Deny from all
Allow from 208.113.134.190 w3.org htmlhelp.com googlebot.com
Satisfy Any</pre>
<h4>Fix double-login prompt</h4>
<p>Redirect non-https requests to https server and ensure that <strong>.htpasswd authorization</strong> can only be entered across HTTPS</p>
<pre>SSLOptions +StrictRequire
SSLRequireSSL
SSLRequire %{HTTP_HOST} eq &quot;askapache.com&quot;
ErrorDocument 403 https://askapache.com</pre>
<h4>Set Timezone of the Server (GMT)</h4>
<pre>SetEnv TZ America/Indianapolis</pre>
<h4>Administrator Email for ErrorDocument</h4>
<pre>SetEnv SERVER_ADMIN webmaster@google.com</pre>
<h4><code>ServerSignature</code> for <code>ErrorDocument</code></h4>
<pre>ServerSignature off | on | email</pre>
<h4>Charset and Language headers</h4>
<p>Article: <a href="/htaccess/setting-charset-in-htaccess.html" rel="nofollow" >Setting Charset in htaccess</a>, and <a href="http://www.w3.org/International/questions/qa-htaccess-charset" rel="nofollow" >article by <cite>Richard Ishida</cite></a></p>
<pre>AddDefaultCharset UTF-8
DefaultLanguage en-US</pre>
<h4>Disallow Script Execution</h4>
<pre>Options -ExecCGI
AddHandler cgi-script .php .pl .py .jsp .asp .htm .shtml .sh .cgi</pre>
<h4>Deny Request Methods</h4>
<pre>RewriteCond %{REQUEST_METHOD} !^(GET|HEAD|OPTIONS|POST|PUT)
RewriteRule .* - [F]</pre>
<h4>Force &#8220;File Save As&#8221; Prompt</h4>
<pre>AddType application/octet-stream .avi .mpg .mov .pdf .xls .mp4</pre>
<h4>Show CGI Source Code</h4>
<pre>RemoveHandler cgi-script .pl .py .cgi
AddType text/plain .pl .py .cgi</pre>
<h4>Serve all .pdf files on your site using .htaccess and mod_rewrite with the php script.</h4>
<pre>RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(.+)\.pdf$  /cgi-bin/pdf.php?file=$1 [L,NC,QSA]</pre>
<h4>Rewrite to www</h4>
<pre>RewriteCond %{REQUEST_URI} !^/(robots\.txt|favicon\.ico|sitemap\.xml)$
RewriteCond %{HTTP_HOST} !^www\.askapache\.com$ [NC]
RewriteRule ^(.*)$ http://www.askapache.com/$1 [R=301,L]</pre>
<h4>Rewrite to www dynamically</h4>
<pre>RewriteCond %{REQUEST_URI} !^/robots\.txt$ [NC]
RewriteCond %{HTTP_HOST} !^www\.[a-z-]+\.[a-z]{2,6} [NC]
RewriteCond %{HTTP_HOST} ([a-z-]+\.[a-z]{2,6})$   [NC]
RewriteRule ^/(.*)$ http://%1/$1 [R=301,L]</pre>
<h4>301 Redirect Old File</h4>
<pre>Redirect 301 /old/file.html http://www.askapache.com/new/file.html</pre>
<h4>301 Redirect Entire Directory</h4>
<pre>RedirectMatch 301 /blog(.*) http://www.askapache.com/$1</pre>
<h4>Protecting your php.cgi</h4>
<pre>&lt;FilesMatch &quot;^php5?\.(ini|cgi)$&quot;&gt;
Order Deny,Allow
Deny from All
Allow from env=REDIRECT_STATUS
&lt;/FilesMatch&gt;</pre>
<h4>Set Cookie based on Request</h4>
<p>This code sends the <code>Set-Cookie</code> header to create a cookie on the client with the value of a matching item in 2nd parantheses.</p>
<pre>RewriteEngine On
RewriteBase /
RewriteRule ^(.*)(de|es|fr|it|ja|ru|en)/$ - [co=lang:$2:.askapache.com:7200:/]</pre>
<h4>Set Cookie with env variable</h4>
<pre>Header set Set-Cookie &quot;language=%{lang}e; path=/;&quot; env=lang</pre>
<h4>Custom ErrorDocuments</h4>
<pre>ErrorDocument 100 /100_CONTINUE
ErrorDocument 101 /101_SWITCHING_PROTOCOLS
ErrorDocument 102 /102_PROCESSING
ErrorDocument 200 /200_OK
ErrorDocument 201 /201_CREATED
ErrorDocument 202 /202_ACCEPTED
ErrorDocument 203 /203_NON_AUTHORITATIVE
ErrorDocument 204 /204_NO_CONTENT
ErrorDocument 205 /205_RESET_CONTENT
ErrorDocument 206 /206_PARTIAL_CONTENT
ErrorDocument 207 /207_MULTI_STATUS
ErrorDocument 300 /300_MULTIPLE_CHOICES
ErrorDocument 301 /301_MOVED_PERMANENTLY
ErrorDocument 302 /302_MOVED_TEMPORARILY
ErrorDocument 303 /303_SEE_OTHER
ErrorDocument 304 /304_NOT_MODIFIED
ErrorDocument 305 /305_USE_PROXY
ErrorDocument 307 /307_TEMPORARY_REDIRECT
ErrorDocument 400 /400_BAD_REQUEST
ErrorDocument 401 /401_UNAUTHORIZED
ErrorDocument 402 /402_PAYMENT_REQUIRED
ErrorDocument 403 /403_FORBIDDEN
ErrorDocument 404 /404_NOT_FOUND
&nbsp;
ErrorDocument 405 /405_METHOD_NOT_ALLOWED
ErrorDocument 406 /406_NOT_ACCEPTABLE
ErrorDocument 407 /407_PROXY_AUTHENTICATION_REQUIRED
ErrorDocument 408 /408_REQUEST_TIME_OUT
ErrorDocument 409 /409_CONFLICT
ErrorDocument 410 /410_GONE
ErrorDocument 411 /411_LENGTH_REQUIRED
ErrorDocument 412 /412_PRECONDITION_FAILED
ErrorDocument 413 /413_REQUEST_ENTITY_TOO_LARGE
ErrorDocument 414 /414_REQUEST_URI_TOO_LARGE
ErrorDocument 415 /415_UNSUPPORTED_MEDIA_TYPE
ErrorDocument 416 /416_RANGE_NOT_SATISFIABLE
ErrorDocument 417 /417_EXPECTATION_FAILED
ErrorDocument 422 /422_UNPROCESSABLE_ENTITY
ErrorDocument 423 /423_LOCKED
ErrorDocument 424 /424_FAILED_DEPENDENCY
ErrorDocument 426 /426_UPGRADE_REQUIRED
ErrorDocument 500 /500_INTERNAL_SERVER_ERROR
ErrorDocument 501 /501_NOT_IMPLEMENTED
ErrorDocument 502 /502_BAD_GATEWAY
ErrorDocument 503 /503_SERVICE_UNAVAILABLE
ErrorDocument 504 /504_GATEWAY_TIME_OUT
ErrorDocument 505 /505_VERSION_NOT_SUPPORTED
ErrorDocument 506 /506_VARIANT_ALSO_VARIES
ErrorDocument 507 /507_INSUFFICIENT_STORAGE
ErrorDocument 510 /510_NOT_EXTENDED</pre>
<h4>Implementing a Caching Scheme with .htaccess</h4>
<pre># year
&lt;FilesMatch &quot;\.(ico|pdf|flv|jpg|jpeg|png|gif|swf|mp3|mp4)$&quot;&gt;
Header set Cache-Control &quot;public&quot;
Header set Expires &quot;Thu, 15 Apr 2010 20:00:00 GMT&quot;
Header unset Last-Modified
&lt;/FilesMatch&gt;
#2 hours
&lt;FilesMatch &quot;\.(html|htm|xml|txt|xsl)$&quot;&gt;
Header set Cache-Control &quot;max-age=7200, must-revalidate&quot;
&lt;/FilesMatch&gt;
&lt;FilesMatch &quot;\.(js|css)$&quot;&gt;
SetOutputFilter DEFLATE
Header set Expires &quot;Thu, 15 Apr 2010 20:00:00 GMT&quot;
&lt;/FilesMatch&gt;</pre>
<h4>Password Protect single file</h4>
<pre>&lt;Files login.php&gt;
AuthName &quot;Prompt&quot;
AuthType Basic
AuthUserFile /home/askapache.com/.htpasswd
Require valid-user
&lt;/Files&gt;</pre>
<h4>Password Protect multiple files</h4>
<pre>&lt;FilesMatch &quot;^(private|phpinfo)\.*$&quot;&gt;
AuthName &quot;Development&quot;
AuthUserFile /.htpasswd
AuthType basic
Require valid-user
&lt;/FilesMatch&gt;</pre>
<h4>Send Custom Headers</h4>
<pre>Header set P3P &quot;policyref=\&quot;http://www.askapache.com/w3c/p3p.xml\&quot;&quot;
Header set X-Pingback &quot;http://www.askapache.com/xmlrpc.php&quot;
Header set Content-Language &quot;en-US&quot;
Header set Vary &quot;Accept-Encoding&quot;</pre>
<h4>Blocking based on User-Agent Header</h4>
<pre>SetEnvIfNoCase ^User-Agent$ .*(craftbot|download|extract|stripper|sucker|ninja|clshttp|webspider|leacher|collector|grabber|webpictures) HTTP_SAFE_BADBOT
SetEnvIfNoCase ^User-Agent$ .*(libwww-perl|aesop_com_spiderman) HTTP_SAFE_BADBOT
Deny from env=HTTP_SAFE_BADBOT</pre>
<h4>Blocking with RewriteCond</h4>
<pre>RewriteCond %{HTTP_USER_AGENT} ^.*(craftbot|download|extract|stripper|sucker|ninja|clshttp|webspider|leacher|collector|grabber|webpictures).*$ [NC]
RewriteRule . - [F,L]</pre>
<h4>.htaccess for mod_php</h4>
<pre>SetEnv PHPRC /location/todir/containing/phpinifile</pre>
<h4>.htaccess for php as cgi</h4>
<pre>AddHandler php-cgi .php .htm
Action php-cgi /cgi-bin/php5.cgi</pre>
<h4>Shell wrapper for custom php.ini</h4>
<pre>#!/bin/sh
export PHP_FCGI_CHILDREN=3
exec php5.cgi -c /abs/php5/php.ini</pre>
<h4>Add values from HTTP Headers</h4>
<pre>SetEnvIfNoCase ^If-Modified-Since$ &quot;(.+)&quot; HTTP_IF_MODIFIED_SINCE=$1
SetEnvIfNoCase ^If-None-Match$ &quot;(.+)&quot; HTTP_IF_NONE_MATCH=$1
SetEnvIfNoCase ^Cache-Control$ &quot;(.+)&quot; HTTP_CACHE_CONTROL=$1
SetEnvIfNoCase ^Connection$ &quot;(.+)&quot; HTTP_CONNECTION=$1
SetEnvIfNoCase ^Keep-Alive$ &quot;(.+)&quot; HTTP_KEEP_ALIVE=$1
SetEnvIfNoCase ^Authorization$ &quot;(.+)&quot; HTTP_AUTHORIZATION=$1
SetEnvIfNoCase ^Cookie$ &quot;(.+)&quot; HTTP_MY_COOKIE=$1</pre>
<h4>Stop hotlinking</h4>
<pre>RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?askapache.com/.*$ [NC]
RewriteRule \.(gif|jpg|swf|flv|png)$ http://www.askapache.com/feed.gif [R=302,L]</pre>
<h4>Turn logging off for IP</h4>
<pre>SecFilterSelective REMOTE_ADDR &quot;208\.113\.183\.103&quot; &quot;nolog,noauditlog,pass&quot;</pre>
<h4>Turn logging on for IP</h4>
<pre>SecFilterSelective REMOTE_ADDR &quot;!^208\.113\.183\.103&quot; &quot;nolog,noauditlog,pass&quot;
SecFilterSelective REMOTE_ADDR &quot;208\.113\.183\.103&quot; &quot;log,auditlog,pass&quot;</pre>
<hr class="C" />
<p><a id="mod_rewrite-examples"></a></p>
<h2>Advanced Mod_Rewrite Examples</h2>
<p>Here are some specific examples taken mostly from my WordPress Password Protection plugin, that also does alot more than password protection as you can see from the following mod_rewrite examples.  These are a few of the mod_rewrite uses that BlogSecurity declared pushed the boundaries of Mod_Rewrite!  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" rel="nofollow" >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" rel="nofollow" >401</a>]</p>
<pre>&lt;Files wp-login.php&gt;
Order Deny,Allow
Deny from All
Satisfy Any
AuthName &quot;Protected By AskApache&quot;
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" rel="nofollow" >401</a>]</p>
<pre>Options -ExecCGI -Indexes +FollowSymLinks -Includes
DirectoryIndex index.php /index.php
Order Deny,Allow
Deny from All
Satisfy Any
AuthName &quot;Protected By AskApache&quot;
AuthUserFile /home/askapache.com/.htpasswda1
AuthType Basic
Require valid-user
&lt;FilesMatch &quot;\.(ico|pdf|flv|jpg|jpeg|mp3|mpg|mp4|mov|wav|wmv|png|gif|swf|css|js)$&quot;&gt;
Allow from All
&lt;/FilesMatch&gt;
&lt;FilesMatch &quot;(async-upload)\.php$&quot;&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" rel="nofollow" >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" rel="nofollow" >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" rel="nofollow" >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" rel="nofollow" >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" rel="nofollow" >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/" rel="nofollow" >Perishable Press</a> [<a href="/htaccess/apache-status-code-headers-errordocument.html#status-403" rel="nofollow" >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" rel="nofollow" >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" rel="nofollow" >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 &#8220;a-zA-Z0-9.+/-?=&#038;&#8221;  &#8211; REALLY helps but may break your site depending on your links. [<a href="/htaccess/apache-status-code-headers-errordocument.html#status-403" rel="nofollow" >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" rel="nofollow" >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" rel="nofollow" >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" rel="nofollow" >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" rel="nofollow" >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" rel="nofollow" >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" rel="nofollow" >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 <a href="http://ocaoimh.ie/wordpress/more-ways-to-stop-spammers-and-unwanted-traffic/" rel="nofollow" >Holy Shmoly!</a> [<a href="/htaccess/apache-status-code-headers-errordocument.html#status-403" rel="nofollow" >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:<br />
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&#8217;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&#8217;t rewrite if val isn&#8217;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 id="best-htaccess-articles"></a></p>
<h2>Best .htaccess Articles</h2>
<h3><a href="http://www.askapache.com/htaccess/htaccess-for-webmasters.html"title="Apache HTTP Web Server htaccess tips and tricks" rel="chapter" >.htaccess for Webmasters</a></h3>
<ul>
<li><a href="/htaccess/htaccess-for-webmasters.html#process-file-through-cgi" rel="nofollow" title="htaccess trick to run requests through a cgi script" >Process certain requests for files using a cgi script</a></li>
<li><a href="/htaccess/htaccess-for-webmasters.html#process-request-methods-with-script" rel="nofollow" title="htaccess security for apache hacking" >Process Requests with certain Request Methods</a></li>
<li><a href="/htaccess/htaccess-for-webmasters.html#force-filetype-with-forcetype" rel="nofollow" title="Apache ForceType Directive in htaccess process file" >Make any file be a certain filetype</a></li>
<li><a href="/htaccess/htaccess-for-webmasters.html#ifmodule-in-apache" rel="nofollow" title="Using the IfModule Directive in Apache htaccess files." >Use IfModule directive for robust code</a></li>
</ul>
<h3><a href="http://www.askapache.com/htaccess/mod_rewrite-tips-and-tricks.html"title="mod_rewrite RewriteRule, RewriteCond help" rel="chapter" >Mod_Rewrite URL Rewriting</a></h3>
<p><a href="/htaccess/crazy-advanced-mod_rewrite-tutorial.html#decoded" rel="nofollow" class="hs hs13" ></a>Undocumented techniques and methods will allow you to utilize mod_rewrite at an  &#8220;expert level&#8221; by showing you how to <a href="/htaccess/crazy-advanced-mod_rewrite-tutorial.html#decoded" rel="nofollow" >unlock its secrets</a>.</p>
<ul>
<li><a href="/htaccess/mod_rewrite-tips-and-tricks.html#check-for-key-in-query-string" rel="nofollow" title="Search query string at QUERY_STRING" >Check for a key in QUERY_STRING</a></li>
<li><a href="/htaccess/mod_rewrite-tips-and-tricks.html#time-based-access" rel="nofollow" title="Deny access using htaccess during certain time" >Block access to files during certain hours of the day</a></li>
<li><a href="/htaccess/mod_rewrite-tips-and-tricks.html#convert-underscore-hyphen" rel="nofollow" title="Change underscores to hyphens for SEO URL" >Rewrite underscores to hyphens for SEO URL</a></li>
<li><a href="/htaccess/mod_rewrite-tips-and-tricks.html#redirect-wordpress-feed" rel="nofollow" title="Rewriting WordPress RSS feeds to Feedburner in SEO friendly method" >Redirecting WordPress Feeds to Feedburner</a></li>
</ul>
<h3><a href="http://www.askapache.com/htaccess/seo-search-engine-friendly-redirects-without-mod_rewrite.html"title="301 Redirects" rel="chapter" >301 Redirects without mod_rewrite</a></h3>
<ul>
<li><a href="/htaccess/seo-search-engine-friendly-redirects-without-mod_rewrite.html#seo-301-redirect-single-file" rel="nofollow" title="301 Redirect single file" >Redirect single url</a></li>
<li><a href="/htaccess/seo-search-engine-friendly-redirects-without-mod_rewrite.html#seo-301-redirect-new-domain" rel="nofollow" title="301 Redirect new domain" >Redirect to new Domain</a></li>
</ul>
<h3><a href="/htaccess/php-cgi-redirect_status.html" rel="nofollow" >Secure PHP with .htaccess</a></h3>
<p><a href="/htaccess/php-cgi-redirect_status.html" rel="nofollow" class="IFL" title="Locking down your php.ini and php cgi with .htaccess" ><img src="http://uploads.askapache.com/2008/01/jail-bars-1.png" alt="Locking down your php.ini and php cgi with .htaccess" title="jail bars 1 apache" /></a>If you have a php.cgi or php.ini file in your /cgi-bin/ directory or other pub directory, try requesting them from your web browser.  If your php.ini shows up or worse you are able to execute your php cgi, you&#8217;ll need to secure it ASAP.  This shows several ways to secure these files, and other interpreters like perl, fastCGI, bash, csh, etc.<br class="C" /></p>
<h3><a href="/htaccess/htaccess-fresh.html" rel="nofollow" >.htaccess Cookie Manipulation</a></h3>
<p><a href="/htaccess/htaccess-fresh.html" rel="nofollow" class="IFL" title="Cookie Manipulation in .htaccess with RewriteRule" ><img src="http://uploads.askapache.com/2007/10/cookies.png" alt="Cookie Manipulation in .htaccess with RewriteRule" title="cookies apache" /></a><strong>Fresh <a href="/htaccess/htaccess.html" rel="nofollow" >.htaccess</a> code</strong> for you!  Check out the Cookie Manipulation and environment variable usage with mod_rewrite!  I also included a couple Mod_Security .htaccess examples. <strong>Enjoy!</strong><br class="C" /></p>
<ul>
<li><a href="/htaccess/htaccess-fresh.html#modrewrite1" rel="nofollow" >Mod_Rewrite .htaccess Examples</a></li>
<li><a href="/htaccess/htaccess-fresh.html#modrewrite2" rel="nofollow" >Cookie Manipulation and Tests with mod_rewrite</a></li>
<li><a href="/htaccess/htaccess-fresh.html#modrewrite3" rel="nofollow" >Setting Environment Variables</a></li>
<li><a href="/htaccess/htaccess-fresh.html#modrewrite4" rel="nofollow" >Using the Environment Variable</a></li>
<li><a href="/htaccess/htaccess-fresh.html#modrewrite5" rel="nofollow" >Mod_Security .htaccess Examples</a></li>
</ul>
<h3><a href="http://www.askapache.com/htaccess/speed-up-your-site-with-caching-and-cache-control.html"title="htaccess Caching" rel="chapter" >.htaccess Caching</a></h3>
<ul>
<li><a href="/htaccess/speed-up-sites-with-htaccess-caching.html" rel="nofollow" >Speed Up Sites with htaccess Caching</a></li>
<li><a href="/htaccess/speed-up-your-site-with-caching-and-cache-control.html#htaccess-time-cheatsheet" rel="nofollow" title="htaccess time cheatsheet" >htaccess time cheat sheet</a></li>
</ul>
<h3><a href="http://www.askapache.com/htaccess/apache-authentication-in-htaccess.html"title="401, 403 htpasswd authentication" rel="chapter" >Password Protection and Authentication</a></h3>
<ul>
<li><a href="/htaccess/apache-authentication-in-htaccess.html#require-password-for-single-file" rel="nofollow" title="Requiring a password for single file" >Require password for single file</a></li>
<li><a href="/htaccess/apache-authentication-in-htaccess.html#skeleton-htaccess" rel="nofollow" title="A comprehensive default Apache .htaccess example file" >Example .htaccess file for password protection</a></li>
</ul>
<h3><a href="http://www.askapache.com/htaccess/using-http-headers-with-htaccess.html"title="Creating and using HTTP Headers with htaccess" rel="chapter" >Control HTTP Headers</a></h3>
<ul>
<li><a href="/htaccess/using-http-headers-with-htaccess.html#prevent-caching-with-htaccess" rel="nofollow" title="Prevent Browsers and Proxies from caching" >Prevent Caching 100%</a></li>
<li><a href="/htaccess/using-http-headers-with-htaccess.html#remove-ie-imagetoolbar" rel="nofollow" title="Remove Internet Explorer imagetoolbar" >Remove IE imagetoolbar without meta tag</a></li>
<li><a href="/htaccess/using-http-headers-with-htaccess.html#privacy-p3p-header-in-apache" rel="nofollow" title="How To use Apache to send P3P Privacy Header for website" >Add Privacy (P3P) Header to your site</a></li>
<li><a href="/htaccess/using-http-headers-with-htaccess.html#language-and-content-header-in-htaccess" rel="nofollow" title="Language header, Charset header without meta" >Add language and charset headers without meta tags</a></li>
</ul>
<h3><a href="/htaccess/blocking-bad-bots-and-scrapers-with-htaccess.html" rel="nofollow" >Blocking Spam and bad Bots</a></h3>
<p><a href="/htaccess/blocking-bad-bots-and-scrapers-with-htaccess.html" rel="nofollow" class="IFR" ><img title="Block Bad Robot" src="http://uploads.askapache.com/2008/04/bad_robot1.png" alt="Block Bad Robot" height="100" /></a>Want to block a bad robot or web scraper using .htaccess files?  Here are 2 methods that illustrate blocking 436 various user-agents.  You can block them using either SetEnvIf methods, or by using Rewrite Blocks.<br class="C" /></p>
<h3><a href="http://www.askapache.com/htaccess/php-htaccess-tips-and-tricks.html"title="php htaccess tips, htaccess php tricks" rel="chapter" >PHP htaccess tips</a></h3>
<p>By using some cool .htaccess tricks we can control PHP to be run as a cgi or a module.  If php is run as a cgi then we need to compile it ourselves or use .htaccess to force php to use a local php.ini file.  If it is running as a module then we can use various directives supplied by that modules in .htaccess</p>
<ul>
<li><a href="/htaccess/php-htaccess-tips-and-tricks.html#php-run-as-cgi" rel="nofollow" title=".htaccess for php as cgi" >When php run as CGI</a></li>
<li><a href="/htaccess/php-htaccess-tips-and-tricks.html#htaccess-php-ini" rel="nofollow" title="custom php.ini with Apache htaccess using PHPRC" >Use a custom php.ini with mod_php or php as a cgi</a></li>
<li><a href="/htaccess/php-htaccess-tips-and-tricks.html#sub-mod_php" rel="nofollow" title="htaccess tips for mod_php php running as Apache module" >When php run as Apache Module (mod_php)</a></li>
<li><a href="/htaccess/php-htaccess-tips-and-tricks.html#php-and-fastcgi-in-htaccess" rel="nofollow" title="Apache FastCGI wrapper for php cgi" >When cgi php is run with wrapper (FastCGI)</a></li>
</ul>
<h3><a href="/htaccess/http-https-rewriterule-redirect.html" rel="nofollow" >HTTP to HTTPS Redirects with mod_rewrite</a></h3>
<p><a href="/htaccess/http-https-rewriterule-redirect.html" rel="nofollow" ><img class="IFL" src="http://uploads.askapache.com/2007/11/security.png" alt="HTTP to HTTPS Redirects with mod_rewrite" title="security apache" /></a>This is freaking sweet if you use SSL I promise you!  Basically instead of having to check for HTTPS using a <code>RewriteCond %{HTTPS} =on</code> for every redirect that can be either HTTP or HTTPS, I set an environment variable once with the value &#8220;http&#8221; or &#8220;https&#8221; if HTTP or HTTPS is being used for that request, and use that env variable in the RewriteRule.<br class="C" /></p>
<h3><a href="http://www.askapache.com/htaccess/ssl-example-usage-in-htaccess.html"title="Apache SSL examples" rel="chapter" >SSL in .htaccess</a></h3>
<ul>
<li><a href="/htaccess/ssl-example-usage-in-htaccess.html#redirect-http-to-https" rel="nofollow" title="Redirecting non-SSL to SSL in Apache" >Redirect non-https requests to https server</a></li>
<li><a href="/htaccess/ssl-example-usage-in-htaccess.html#rewrite-http-to-https-no-mod_ssl" rel="nofollow" title="redirect HTTP to HTTPS without mod_ssl!" >Rewrite non-https to HTTPS without mod_ssl!</a></li>
<li><a href="/htaccess/ssl-example-usage-in-htaccess.html#redirect-port-80-to-https" rel="nofollow" title="Redirect HTTP to HTTPS by port" >Redirect everything served on port 80 to HTTPS URI</a></li>
</ul>
<h3><a href="http://www.askapache.com/htaccess/setenvif.html"title="Conditionally setting variables in Apache .htaccess" rel="chapter" >SetEnvIf and SetEnvIfNoCase in .htaccess</a></h3>
<ul>
<li><a href="/htaccess/setenvif.html#setenvif-variables" rel="nofollow" title="Unique mod_setenvif Variables" >Unique mod_setenvif Variables</a></li>
<li><a href="/htaccess/setenvif.html#http-headers" rel="nofollow" title="Populates HTTP_MY_ Variables with mod_setenvif variable values" >Populates HTTP_MY_ Variables with mod_setenvif variable values</a></li>
<li><a href="/htaccess/setenvif.html#allow-host" rel="nofollow" title="Allows only if HOST Header is present in request" >Allows only if HOST Header is present in request</a></li>
<li><a href="/htaccess/setenvif.html#header-copy" rel="nofollow" title="Add values from HTTP Headers" >Add values from HTTP Headers</a></li>
</ul>
<h3><a href="http://www.askapache.com/htaccess/security-with-htaccess.html"title="htaccess security and hacking" rel="chapter" >Site Security with .htaccess</a></h3>
<p>chmod .htpasswd files 640, chmod .htaccess 644, php files 600, and chmod files that you really dont want people to see as 400. (NEVER chmod 777, try 766)</p>
<ul>
<li><a href="/htaccess/security-with-htaccess.html#chmod-htaccess-info" rel="nofollow" title="CHMOD .htaccess, chmod .htpasswd, chmodding files" >CHMOD your files</a></li>
<li><a href="/htaccess/security-with-htaccess.html#deny-htaccess-htpasswd-access" rel="nofollow" title="Deny access for htaccess/htpasswd file" >Prevent access to .htaccess and .htpasswd files</a></li>
<li><a href="/htaccess/security-with-htaccess.html#show-source-code" rel="nofollow" title="Show source code in browser, prevent executing file" >Show Source Code instead of executing</a></li>
<li><a href="/htaccess/security-with-htaccess.html#securing-directories-with-htaccess" rel="nofollow" title="Remove execution privileges" >Securing directories: Remove ability to execute scripts</a></li>
<li><a href="/htaccess/security-with-htaccess.html#errordocument-usage-in-htaccess" rel="nofollow" title="ErrorDocument usage in htaccess files" >.htaccess ErrorDocuments</a></li>
</ul>
<h3><a href="http://www.askapache.com/htaccess/mod_security-htaccess-tricks.html"title="mod_security Guide and sample mod_Security diretive usage in .htaccess" rel="chapter" >.htaccess Security with MOD_SECURITY</a></h3>
<ul>
<li><a href="/htaccess/mod_security-htaccess-tricks.html#mod_security-mod_rewrite" rel="nofollow" >mod_security + mod_rewrite</a></li>
<li><a href="/htaccess/mod_security-htaccess-tricks.html#block-post-spam" rel="nofollow" >Block Spam by examining POST form fields</a></li>
<li><a href="/htaccess/mod_security-htaccess-tricks.html#disable-mod_security" rel="nofollow" >Disabling mod_security conditionally per IP</a></li>
<li><a href="/htaccess/mod_security-htaccess-tricks.html#mod_security-authorization" rel="nofollow" >Disabling mod_security with .htaccess Authorization</a></li>
<li><a href="/htaccess/mod_security-htaccess-tricks.html#block-wordpress-spam" rel="nofollow" >Block WordPress Spam Forever!</a></li>
<li><a href="/htaccess/mod_security-htaccess-tricks.html#pause-connections" rel="nofollow" >Force Any Connections to be Paused a set number of ms</a></li>
<li><a href="/htaccess/mod_security-htaccess-tricks.html#mod_security-debugging" rel="nofollow" >ModSecurity Debugging and Logging</a></li>
<li><a href="/htaccess/mod_security-htaccess-tricks.html#conditional-logging" rel="nofollow" >Turn Off/On Logging JUST for your IP Address</a></li>
<li><a href="/htaccess/mod_security-htaccess-tricks.html#mod_security-directives" rel="nofollow" >Mod_Security Directives for DreamHost</a></li>
<li><a href="/htaccess/mod_security-htaccess-tricks.html#httpdconf-rules" rel="nofollow" >Example httpd.conf mod_security rule files</a></li>
</ul>
<hr class="C" />
<p><a id="htaccess-merging-order"></a></p>
<h3>Merging Notes</h3>
<p>The order of merging is:</p>
<ol>
<li><code>&lt;Directory&gt;</code> (except regular expressions) and .htaccess done simultaneously (with .htaccess, if allowed, overriding <code>&lt;Directory&gt;</code>)</li>
<li><code>&lt;DirectoryMatch&gt;</code> (and <code>&lt;Directory ~&gt;</code>)</li>
<li><code>&lt;Files&gt;</code> and <code>&lt;FilesMatch&gt;</code> done simultaneously</li>
<li><code>&lt;Location&gt;</code> and <code>&lt;LocationMatch&gt;</code> done simultaneously</li>
</ol>
<p>Below is an artificial example to show the order of merging. Assuming they all apply to the request, the directives in this example will be applied in the order:</p>
<p><code>A &gt; B &gt; C &gt; D &gt; E</code></p>
<p>.</p>
<pre>&lt;Location /&gt;
E
&lt;/Location&gt;
&lt;Files askapache.txt&gt;
D
&lt;/Files&gt;
&lt;VirtualHost *&gt;
&lt;Directory /a/b&gt;
B
&lt;/Directory&gt;
&lt;/VirtualHost&gt;
&lt;DirectoryMatch &quot;^.*b$&quot;&gt;
C
&lt;/DirectoryMatch&gt;
&lt;Directory /a/b&gt;
A
&lt;/Directory&gt;</pre>
<p><a id="favorite-htaccess"></a></p>
<h2>My Favorite .htaccess Links</h2>
<p class="anote">These are just some of my favorite <a href="http://www.google.com/Top/Computers/Internet/Web_Design_and_Development/Authoring/FAQs,_Help,_and_Tutorials/Access_Control/" rel="nofollow" >.htaccess resources</a>.  I&#8217;m really into doing your own hacking to get knowledge and these links are all great resources in that respect.  I&#8217;m really interested in new or unusual htaccess solutions or htaccess hacks using .htaccess files, so let me know if you find one.</p>
<p><strong>NCSA HTTPd Tutorials</strong></p>
<p><strong>Robert Hansen</strong><br />Here&#8217;s a great <a href="http://www.securityfocus.com/infocus/1368" rel="nofollow" >Hardening HTAccess part 1</a>, <a href="http://www.securityfocus.com/infocus/1369" rel="nofollow" >part 2</a>, <a href="http://www.securityfocus.com/infocus/1370" rel="nofollow" >part 3</a> article that goes into detail about some of the rarer security applications for .htaccess files.</p>
<p><strong>SAMAXES</strong><br />Some very detailed and helpful .htaccess articles, such as the <a href="http://www.samaxes.com/2008/04/20/htaccess-gzip-and-cache-your-site-for-faster-loading-and-bandwidth-saving/" rel="nofollow" >&#8220;.htaccess &#8211; gzip and cache your site for faster loading and bandwidth saving.&#8221;</a></p>
<p><strong>PerishablePress</strong><br /><a href="http://perishablepress.com/press/2006/01/10/stupid-htaccess-tricks/" rel="nofollow" >Stupid .htaccess tricks</a> is probably the <strong>best explanation online</strong> for many of the best .htaccess solutions, including many from this page. Unlike me they are fantastic writers, even for technical stuff they are very readable, so its a good blog to kick back on and read.  They also have a <a href="http://perishablepress.com/press/2009/02/03/eight-ways-to-blacklist-with-apaches-mod_rewrite/" rel="nofollow" title="Eight Ways to Blacklist with Apache's mod_rewrite" >fantastic article</a> detailing how to block/deny specific requests using mod_rewrite.</p>
<p><strong>BlogSecurity</strong><br />Mostly a site for&#8230; blog security (which is really any web-app security) this blog has a few really impressive articles full of solid information for <a href="http://blogsecurity.net/wordpress/article-210607/" rel="nofollow" >Hardening WordPress with .htaccess</a> among more advanced topics that can be challenging but effective.  This is a good site to subscribe to their feed, they publish plugin exploits and wordpress core vulnerabilities quite a bit.</p>
<p><strong>Check-These</strong><br />Oldschool security/unix dude with some incredibly detailed mod_rewrite tutorials, helped me the most when I first got into this, and a great guy too. See: <a href="http://check-these.info/mod_rewrite-basic.html" rel="nofollow" >Basic Mod_Rewrite Guide</a>, and <a href="http://check-these.info/RewriteRule.html" rel="nofollow" >Advanced Mod_Rewrite Tutorial</a></p>
<p><strong>Reaper-X</strong><br />Alot of .htaccess tutorials and code.  See: <a href="http://www.reaper-x.com/2007/09/01/hardening-wordpress-with-mod-rewrite-and-htaccess/" rel="nofollow" >Hardening WordPress with Mod Rewrite and htaccess</a></p>
<p><strong>jdMorgan</strong><br /><a href="http://www.webmasterworld.com/profilev4.cgi?action=view&#038;member=jdMorgan" rel="nofollow" >jdMorgan</a> is the Moderator of the <a href="http://www.webmasterworld.com/apache/" rel="nofollow" >Apache Forum</a> at WebmasterWorld, a great place for answers.  In my experience he can answer any tough question pertaining to advanced .htaccess usage, haven&#8217;t seen him stumped yet.</p>
<p><strong>The W3C</strong><br /><a href="http://www.w3.org/International/questions/qa-htaccess-charset" rel="nofollow" >Setting Charset in .htaccess</a> is very informative.</p>
<p><strong>Holy Shmoly!</strong><br />A great blogger with analysis of attacks and spam.  See: <a href="http://ocaoimh.ie/wordpress/more-ways-to-stop-spammers-and-unwanted-traffic/" rel="nofollow" >More ways to stop spammers and unwanted traffic</a>.</p>
<p><strong>Apache Week</strong><br />A partnership with Red Hat back in the 90&#8242;s that produced some <a href="http://www.apacheweek.com/features/userauth" rel="nofollow" >excellent documentation</a>.</p>
<p><strong>Corz</strong><br />Here&#8217;s a resource that I consider to have some of the most creative and ingenious ideas for .htaccess files, although the author is somewhat of a character ;) Its a trip trying to navigate around the site, a fun trip. Its like nothing I&#8217;ve ever seen. There are only a few articles on the site, but the htaccess articles are very original and well-worth a look. See: <a href="http://corz.org/serv/tricks/htaccess.php"rel="nofollow" >htaccess tricks and tips</a>.</a></p>
<hr class="C" />
<p><a id="htaccess-directives-list"></a></p>
<h2>Htaccess Directives</h2>
<p class="anote">This is an AskApache.com exclusive <em>you won&#8217;t find this anywhere else</em>.</p>
<p>Directory, DirectoryMatch, Files, FilesMatch, IfDefine, IfVersion, IfModule, Limit, LimitExcept, Location, LocationMatch, Proxy, ProxyMatch, VirtualHost, AcceptMutex, AcceptPathInfo, AccessFileName, Action, AddCharset, AddDefaultCharset, AddDescription, AddEncoding, AddHandler, AddInputFilter, AddLanguage, AddOutputFilter, AddOutputFilterByType, AddType, Alias, AliasMatch, AllowCONNECT, AllowOverride, Anonymous, Anonymous_Authoritative, Anonymous_LogEmail, Anonymous_MustGiveEmail, Anonymous_NoUserId, Anonymous_VerifyEmail, AuthAuthoritative, AuthDBMAuthoritative, AuthDBMGroupFile, AuthDBMType, AuthDBMUserFile, AuthDigestAlgorithm, AuthDigestDomain, AuthDigestFile, AuthDigestGroupFile, AuthDigestNcCheck, AuthDigestNonceFormat, AuthDigestNonceLifetime, AuthDigestQop, AuthDigestShmemSize, AuthGroupFile, AuthName, AuthType, AuthUserFile, BS2000Account, BrowserMatch, BrowserMatchNoCase, CacheNegotiatedDocs, CharsetDefault, CharsetOptions, CharsetSourceEnc, CheckSpelling, ContentDigest, CookieDomain, CookieExpires, CookieName, CookieStyle, CookieTracking, CoreDumpDirectory, DAV, DAVDepthInfinity, DAVMinTimeout, DefaultIcon, DefaultLanguage, DefaultType, DocumentRoot, ErrorDocument, ErrorLog, ExtFilterDefine, ExtFilterOptions, FancyIndexing, FileETag, ForceLanguagePriority, ForceType, GprofDir, Header, HeaderName, HostnameLookups, IdentityCheck, ImapBase, ImapDefault, ImapMenu, Include, IndexIgnore, LanguagePriority, LimitRequestBody, LimitRequestFields, LimitRequestFieldsize, LimitRequestLine, LimitXMLRequestBody, LockFile, LogLevel, MaxRequestsPerChild, MultiviewsMatch, NameVirtualHost, NoProxy, Options, PassEnv, PidFile, Port, ProxyBlock, ProxyDomain, ProxyErrorOverride, ProxyIOBufferSize, ProxyMaxForwards, ProxyPass, ProxyPassReverse, ProxyPreserveHost, ProxyReceiveBufferSize, ProxyRemote, ProxyRemoteMatch, ProxyRequests, ProxyTimeout, ProxyVia, RLimitCPU, RLimitMEM, RLimitNPROC, ReadmeName, Redirect, RedirectMatch, RedirectPermanent, RedirectTemp, RemoveCharset, RemoveEncoding, RemoveHandler, RemoveInputFilter, RemoveLanguage, RemoveOutputFilter, RemoveType, RequestHeader, Require, RewriteCond, RewriteRule, SSIEndTag, SSIErrorMsg, SSIStartTag, SSITimeFormat, SSIUndefinedEcho, Satisfy, ScoreBoardFile, Script, ScriptAlias, ScriptAliasMatch, ScriptInterpreterSource, ServerAdmin, ServerAlias, ServerName, ServerPath, ServerRoot, ServerSignature, ServerTokens, SetEnv, SetEnvIf, SetEnvIfNoCase, SetHandler, SetInputFilter, SetOutputFilter, Timeout, TypesConfig, UnsetEnv, UseCanonicalName, XBitHack, allow, deny, order, CGIMapExtension, EnableMMAP, ISAPIAppendLogToErrors, ISAPIAppendLogToQuery, ISAPICacheFile, ISAPIFakeAsync, ISAPILogNotSupported, ISAPIReadAheadBuffer, SSLLog, SSLLogLevel, MaxMemFree, ModMimeUsePathInfo, EnableSendfile, ProxyBadHeader, AllowEncodedSlashes, LimitInternalRecursion, EnableExceptionHook, TraceEnable, ProxyFtpDirCharset, AuthBasicAuthoritative, AuthBasicProvider, AuthDefaultAuthoritative, AuthDigestProvider, AuthLDAPAuthzEnabled, AuthLDAPBindDN, AuthLDAPBindPassword, AuthLDAPCharsetConfig, AuthLDAPCompareDNOnServer, AuthLDAPDereferenceAliases, AuthLDAPGroupAttribute, AuthLDAPGroupAttributeIsDN, AuthLDAPRemoteUserIsDN, AuthLDAPURL, AuthzDBMAuthoritative, AuthzDBMType, AuthzDefaultAuthoritative, AuthzGroupFileAuthoritative, AuthzLDAPAuthoritative, AuthzOwnerAuthoritative, AuthzUserAuthoritative, BalancerMember, DAVGenericLockDB, FilterChain, FilterDeclare, FilterProtocol, FilterProvider, FilterTrace, IdentityCheckTimeout, IndexStyleSheet, ProxyPassReverseCookieDomain, ProxyPassReverseCookiePath, ProxySet, ProxyStatus, ThreadStackSize, AcceptFilter, Protocol, AuthDBDUserPWQuery, AuthDBDUserRealmQuery, UseCanonicalPhysicalPort, CheckCaseOnly, AuthLDAPRemoteUserAttribute, ProxyPassMatch, SSIAccessEnable, Substitute, ProxyPassInterpolateEnv</p>
<hr class="C" />
<p><a id="htaccess-modules"></a></p>
<h2>Htaccess Modules</h2>
<p>Here are most of the modules that come with Apache.  Each one can have new commands that can be used in .htaccess file scopes.</p>
<p><a href="/servers/mod_actions.c.html" rel="nofollow" >mod_actions</a>, <a href="/servers/mod_alias.c.html" rel="nofollow" >mod_alias</a>, <a href="/servers/mod_asis.c.html" rel="nofollow" >mod_asis</a>, <a href="/servers/mod_auth_basic.c.html" rel="nofollow" >mod_auth_basic</a>, <a href="/servers/mod_auth_digest.c.html" rel="nofollow" >mod_auth_digest</a>, <a href="/servers/mod_authn_anon.c.html" rel="nofollow" >mod_authn_anon</a>, <a href="/servers/mod_authn_dbd.c.html" rel="nofollow" >mod_authn_dbd</a>, <a href="/servers/mod_authn_dbm.c.html" rel="nofollow" >mod_authn_dbm</a>, <a href="/servers/mod_authn_default.c.html" rel="nofollow" >mod_authn_default</a>, <a href="/servers/mod_authn_file.c.html" rel="nofollow" >mod_authn_file</a>, <a href="/servers/mod_authz_dbm.c.html" rel="nofollow" >mod_authz_dbm</a>, <a href="/servers/mod_authz_default.c.html" rel="nofollow" >mod_authz_default</a>, <a href="/servers/mod_authz_groupfile.c.html" rel="nofollow" >mod_authz_groupfile</a>, <a href="/servers/mod_authz_host.c.html" rel="nofollow" >mod_authz_host</a>, <a href="/servers/mod_authz_owner.c.html" rel="nofollow" >mod_authz_owner</a>, <a href="/servers/mod_authz_user.c.html" rel="nofollow" >mod_authz_user</a>, <a href="/servers/mod_autoindex.c.html" rel="nofollow" >mod_autoindex</a>, <a href="/servers/mod_cache.c.html" rel="nofollow" >mod_cache</a>, <a href="/servers/mod_cern_meta.c.html" rel="nofollow" >mod_cern_meta</a>, <a href="/servers/mod_cgi.c.html" rel="nofollow" >mod_cgi</a>, <a href="/servers/mod_dav.c.html" rel="nofollow" >mod_dav</a>, <a href="/servers/mod_dav_fs.c.html" rel="nofollow" >mod_dav_fs</a>, <a href="/servers/mod_dbd.c.html" rel="nofollow" >mod_dbd</a>, <a href="/servers/mod_deflate.c.html" rel="nofollow" >mod_deflate</a>, <a href="/servers/mod_dir.c.html" rel="nofollow" >mod_dir</a>, <a href="/servers/mod_disk_cache.c.html" rel="nofollow" >mod_disk_cache</a>, <a href="/servers/mod_dumpio.c.html" rel="nofollow" >mod_dumpio</a>, <a href="/servers/mod_env.c.html" rel="nofollow" >mod_env</a>, <a href="/servers/mod_expires.c.html" rel="nofollow" >mod_expires</a>, <a href="/servers/mod_ext_filter.c.html" rel="nofollow" >mod_ext_filter</a>, <a href="/servers/mod_file_cache.c.html" rel="nofollow" >mod_file_cache</a>, <a href="/servers/mod_filter.c.html" rel="nofollow" >mod_filter</a>, <a href="/servers/mod_headers.c.html" rel="nofollow" >mod_headers</a>, <a href="/servers/mod_ident.c.html" rel="nofollow" >mod_ident</a>, <a href="/servers/mod_imagemap.c.html" rel="nofollow" >mod_imagemap</a>, <a href="/servers/mod_include.c.html" rel="nofollow" >mod_include</a>, <a href="/servers/mod_info.c.html" rel="nofollow" >mod_info</a>, <a href="/servers/mod_log_config.c.html" rel="nofollow" >mod_log_config</a>, <a href="/servers/mod_log_forensic.c.html" rel="nofollow" >mod_log_forensic</a>, <a href="/servers/mod_logio.c.html" rel="nofollow" >mod_logio</a>, <a href="/servers/mod_mem_cache.c.html" rel="nofollow" >mod_mem_cache</a>, <a href="/servers/mod_mime.c.html" rel="nofollow" >mod_mime</a>, <a href="/servers/mod_mime_magic.c.html" rel="nofollow" >mod_mime_magic</a>, <a href="/servers/mod_negotiation.c.html" rel="nofollow" >mod_negotiation</a>, <a href="/servers/mod_proxy.c.html" rel="nofollow" >mod_proxy</a>, <a href="/servers/mod_proxy_ajp.c.html" rel="nofollow" >mod_proxy_ajp</a>, <a href="/servers/mod_proxy_balancer.c.html" rel="nofollow" >mod_proxy_balancer</a>, <a href="/servers/mod_proxy_connect.c.html" rel="nofollow" >mod_proxy_connect</a>, <a href="/servers/mod_proxy_ftp.c.html" rel="nofollow" >mod_proxy_ftp</a>, <a href="/servers/mod_proxy_http.c.html" rel="nofollow" >mod_proxy_http</a>, <a href="/servers/mod_rewrite.c.html" rel="nofollow" >mod_rewrite</a>, <a href="/servers/mod_setenvif.c.html" rel="nofollow" >mod_setenvif</a>, <a href="/servers/mod_speling.c.html" rel="nofollow" >mod_speling</a>, <a href="/servers/mod_ssl.c.html" rel="nofollow" >mod_ssl</a>, <a href="/servers/mod_status.c.html" rel="nofollow" >mod_status</a>, <a href="/servers/mod_substitute.c.html" rel="nofollow" >mod_substitute</a>, <a href="/servers/mod_unique_id.c.html" rel="nofollow" >mod_unique_id</a>, <a href="/servers/mod_userdir.c.html" rel="nofollow" >mod_userdir</a>, <a href="/servers/mod_usertrack.c.html" rel="nofollow" >mod_usertrack</a>, <a href="/servers/mod_version.c.html" rel="nofollow" >mod_version</a>, <a href="/servers/mod_vhost_alias.c.html" rel="nofollow" >mod_vhost_alias</a></p>
<hr class="C" />
<p><a id="htaccess-software"></a></p>
<h2>Htaccess Software</h2>
<p>Apache HTTP Server comes with the following <a href="http://httpd.apache.org/docs/trunk/programs/" rel="nofollow" >programs</a>.</p>
<dl>
<dt><code>httpd</code></dt>
<dd>Apache hypertext transfer protocol server</dd>
<dt><code>apachectl</code></dt>
<dd>Apache HTTP server control interface</dd>
<dt><code>ab</code></dt>
<dd>Apache HTTP server benchmarking tool</dd>
<dt><code>apxs</code></dt>
<dd>APache eXtenSion tool</dd>
<dt><code>dbmmanage</code></dt>
<dd>Create and update user authentication files in DBM format for basic authentication</dd>
<dt><code>fcgistarter</code></dt>
<dd>Start a FastCGI program</dd>
<dt><code>htcacheclean</code></dt>
<dd>Clean up the disk cache</dd>
<dt><code>htdigest</code></dt>
<dd>Create and update user authentication files for digest authentication</dd>
<dt><code>htdbm</code></dt>
<dd>Manipulate DBM password databases.</dd>
<dt><code>htpasswd</code></dt>
<dd>Create and update user authentication files for basic authentication</dd>
<dt><code>httxt2dbm</code></dt>
<dd>Create dbm files for use with RewriteMap</dd>
<dt><code>logresolve</code></dt>
<dd>Resolve hostnames for IP-addresses in Apache logfiles</dd>
<dt>log_server_status</dt>
<dd>Periodically log the server&#8217;s status</dd>
<dt><code>rotatelogs</code></dt>
<dd>Rotate Apache logs without having to kill the server</dd>
<dt>split-logfile</dt>
<dd>Split a multi-vhost logfile into per-host logfiles</dd>
<dt><code>suexec</code></dt>
<dd>Switch User For Exec</dd>
</dl>
<p>Here are some <strong>example snippets of htaccess files</strong> grabbed from various sites.</p>
<pre>&lt;IfModule mod_rewrite.c&gt;
RewriteEngine on
RewriteRule ^$ webroot/ [L]
RewriteRule (.*) webroot/$1 [L]
&lt;/IfModule&gt;
&nbsp;
&lt;Limit GET POST PUT&gt;
Order Allow,Deny
Deny from All
&lt;/Limit&gt;
&nbsp;
&lt;IfModule mod_rewrite.c&gt;
RewriteEngine on
RewriteRule ^$ app/webroot/ [L]
RewriteRule (.*) app/webroot/$1 [L]
&lt;/IfModule&gt;
&nbsp;
#
# Apache/PHP/Drupal settings:
#
# Protect files and directories from prying eyes.
&nbsp;
Options +Indexes
&nbsp;
AddIcon /icons/compressed.gif .bz2
AddType image/svg+xml .svg
AddType image/svg+xml .svgz
AddType text/html .shtml
AddHandler server-parsed .shtml .html
&nbsp;
#DirectoryIndex index.php index.html
#Options +FollowSymLinks
#Options -Indexes
&nbsp;
Options All -Indexes
&nbsp;
# The concept for this was taken from the Drupal project by D. Keith Casey Jr. - caseydk@use&#46;..
# PHP 4, Apache 1
&lt;IfModule mod_php4.c&gt;
php_value magic_quotes_gpc 0
&nbsp;
Options Indexes
&nbsp;
XBitHack on
&nbsp;
&lt;ifmodule mod_rewrite.c&gt;
RewriteEngine On
RewriteRule ^user/(\w+)/(\w+)/(\w+) index.php?user=$1&amp;w=$2&amp;root=$3 [L,QSA]
RewriteRule ^user/(\w+)/(\w+) index.php?user=$1&amp;w=$2 [L,QSA]
RewriteRule ^user/(\w+) index.php?user=$1 [L,QSA]
&nbsp;
Satisfy All
Options -Indexes
&lt;Files ~ &quot;^\.&quot;&gt;
order allow,deny
&nbsp;
#
# Apache/PHP/Drupal settings:
#
#php_flag display_errors on
#php_flag display_startup_errors on
&nbsp;
&lt;Files &quot;config.php&quot;&gt;
Order Allow,Deny
Deny from All
&lt;/Files&gt;
&nbsp;
&lt;?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
&nbsp;
DirectoryIndex index.htm index.html index.php index.prc index.htpl
&lt;FilesMatch &quot;\.(htpl|prc)$&quot;&gt;
SetHandler htpl-script
&lt;/FilesMatch&gt;
&nbsp;
SetEnv APPLICATION_ENV development
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
&nbsp;
&lt;filesmatch &quot;\.php$&quot;&gt;
allow from all
&lt;/filesmatch&gt;
#Uncomment the below to enable podcasting
&nbsp;
#
# Apache/PHP/Drupal settings:
#
# Protect files and directories from prying eyes.
AddDefaultCharset utf-8
&nbsp;
# $Id: .htaccess,v 1.8 2004/11/03 18:21:16 rurban Exp $
&lt;IfModule mod_php4.c&gt;
# For added security (and PhpWiki debugging purposes) you may want to
&nbsp;
&lt;IfModule mod_rewrite.c&gt;
RewriteEngine on
RewriteRule ^$ webroot/ [L]
RewriteRule (.*) webroot/$1 [L]
&lt;/IfModule&gt;
&nbsp;
&lt;IfModule mod_rewrite.c&gt;
RewriteEngine On
RewriteRule ^([0-9]+)$ index.cgi?id=$1 [L]
RewriteRule ^(rss|atom)$ index.cgi?action=qotw&amp;output=$1 [L]
RewriteRule ^([a-z_]+)(/([a-z_]*))?$ index.cgi?action=$1&amp;admin_action=$3 [L,QSA]</pre>
<p><strong>More on Page 2.</strong></p>
<p><span id="more-23"></span></p>
<p><a href="http://www.askapache.com/htaccess/htaccess.html"></a><a href="http://www.askapache.com/htaccess/htaccess.html">The Ultimate Htaccess</a> originally appeared on <cite>AskApache.com</cite> </p>]]></content:encoded>
			<wfw:commentRss>http://www.askapache.com/htaccess/htaccess.html/feed/</wfw:commentRss>
		<slash:comments>66</slash:comments>
		</item>
		<item>
		<title>Htaccess SetEnvIf and SetEnvIfNoCase Examples</title>
		<link>http://www.askapache.com/htaccess/setenvif.html</link>
		<comments>http://www.askapache.com/htaccess/setenvif.html#comments</comments>
		<pubDate>Sun, 07 Dec 2008 17:36:59 +0000</pubDate>
		<dc:creator>AskApache</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Apache Modules]]></category>
		<category><![CDATA[Cache]]></category>
		<category><![CDATA[DreamHost]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Htaccess]]></category>
		<category><![CDATA[Mod_Rewrite]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[Server Administration]]></category>
		<category><![CDATA[Webmaster]]></category>
		<category><![CDATA[301 Redirect]]></category>
		<category><![CDATA[401]]></category>
		<category><![CDATA[403 Forbidden]]></category>
		<category><![CDATA[apache ssl]]></category>
		<category><![CDATA[askapache]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[authorization]]></category>
		<category><![CDATA[Cache-Control]]></category>
		<category><![CDATA[caching]]></category>
		<category><![CDATA[Cookies]]></category>
		<category><![CDATA[curl]]></category>
		<category><![CDATA[debugging]]></category>
		<category><![CDATA[Examples]]></category>
		<category><![CDATA[FilesMatch]]></category>
		<category><![CDATA[Fsockopen]]></category>
		<category><![CDATA[GET]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[htaccess guide]]></category>
		<category><![CDATA[htaccess tricks]]></category>
		<category><![CDATA[htaccess tutorial]]></category>
		<category><![CDATA[Htpasswd]]></category>
		<category><![CDATA[HTTP Headers]]></category>
		<category><![CDATA[httpd]]></category>
		<category><![CDATA[HTTPS SSL]]></category>
		<category><![CDATA[If-Modified-Since]]></category>
		<category><![CDATA[Mod_Rewrite examples]]></category>
		<category><![CDATA[Mod_Security]]></category>
		<category><![CDATA[Mod_Setenvif]]></category>
		<category><![CDATA[Nice]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Port]]></category>
		<category><![CDATA[post]]></category>
		<category><![CDATA[Redirect]]></category>
		<category><![CDATA[Rewrite Tricks]]></category>
		<category><![CDATA[rewritecond]]></category>
		<category><![CDATA[rewriterule]]></category>
		<category><![CDATA[Robot]]></category>
		<category><![CDATA[robots]]></category>
		<category><![CDATA[robots.txt]]></category>
		<category><![CDATA[Scripts]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[server config]]></category>
		<category><![CDATA[SetEnvIf]]></category>
		<category><![CDATA[Shell]]></category>
		<category><![CDATA[shell script]]></category>
		<category><![CDATA[SPEED]]></category>
		<category><![CDATA[SSI]]></category>
		<category><![CDATA[stat]]></category>
		<category><![CDATA[trick]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[Wget]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.askapache.com/htaccess/setenvif.html</guid>
		<description><![CDATA[<p>SetEnv, SetEnvIf, and SetEnvIfNoCase directives conditionally set environment variables accessible by scripts and apache based on HTTP Headers, Variables, and Request information.</p>
<ul class="TOCC">
	<li><a href="http://www.askapache.com/htaccess/setenvif.html#setenvif-variables" title="Unique mod_setenvif Variables">Unique mod_setenvif Variables</a></li>
	<li><a href="http://www.askapache.com/htaccess/setenvif.html#http-headers" title="Populates HTTP_MY_ Variables with mod_setenvif variable values">Populates HTTP_MY_ Variables with mod_setenvif variable values</a></li>
	<li><a href="http://www.askapache.com/htaccess/setenvif.html#remote-host" title="Set REMOTE_HOST to Server_Name">Set REMOTE_HOST to HTTP_HOST</a></li>
	<li><a href="http://www.askapache.com/htaccess/setenvif.html#allow-host" title="Allows only if HOST Header is present in request">Allows only if HOST Header is present in request</a></li>
	<li><a href="http://www.askapache.com/htaccess/setenvif.html#header-copy" title="Add values from HTTP Headers">Add values from HTTP Headers</a></li>
	<li><a href="http://www.askapache.com/htaccess/setenvif.html#redirect-status" title="Set the REDIRECT_STATUS for Interpreter Security">Set the REDIRECT_STATUS for Interpreter Security</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p><strong>SetEnvIf</strong> and <strong>SetEnvIfNoCase</strong> are really useful directives supplied by the <a href="http://httpd.apache.org/docs/2.2/mod/mod_setenvif.html" rel="nofollow" >mod_setenvif module</a> that allow you to conditionally set environment variables accessible by scripts and apache based on the value of HTTP Headers, Other Variables, and Request information.</p>
<p class="anote">For debugging, you may want to use my <a href="http://www.askapache.com/shellscript/apache-printenv-improvement.html">server environment variable debugging script</a></p>
<ul class="TOCC">
<li><a href="http://www.askapache.com/htaccess/setenvif.html#setenvif-variables" title="Unique mod_setenvif Variables">Unique mod_setenvif Variables</a></li>
<li><a href="http://www.askapache.com/htaccess/setenvif.html#http-headers" title="Populates HTTP_MY_ Variables with mod_setenvif variable values">Populates HTTP_MY_ Variables with mod_setenvif variable values</a></li>
<li><a href="http://www.askapache.com/htaccess/setenvif.html#remote-host" title="Set REMOTE_HOST to Server_Name">Set REMOTE_HOST to HTTP_HOST</a></li>
<li><a href="http://www.askapache.com/htaccess/setenvif.html#allow-host" title="Allows only if HOST Header is present in request">Allows only if HOST Header is present in request</a></li>
<li><a href="http://www.askapache.com/htaccess/setenvif.html#header-copy" title="Add values from HTTP Headers">Add values from HTTP Headers</a></li>
<li><a href="http://www.askapache.com/htaccess/setenvif.html#redirect-status" title="Set the REDIRECT_STATUS for Interpreter Security">Set the REDIRECT_STATUS for Interpreter Security</a></li>
</ul>
<h2><a href="#setenvif-variables" rel="nofollow"  id="setenvif-variables" title="Unique mod_setenvif Variables">Unique mod_setenvif Variables</a></h2>
<p>These can be used for <code>attribute</code>.</p>
<dl>
<dt>Remote_Host</dt>
<dd>the hostname (if available) of the client making the request &#8211; <code>crawl-66-249-70-24.googlebot.com</code></dd>
<dt>Remote_Addr</dt>
<dd>IP address of the client making the request &#8211; <code>66.249.70.24</code></dd>
<dt>Server_Addr</dt>
<dd>IP address of the server on which the request was received &#8211; <code>208.113.183.103</code></dd>
<dt>Request_Method</dt>
<dd>name of the method being used &#8211; <code>GET</code></dd>
<dt>Request_Protocol</dt>
<dd>name and version of the protocol with which the request was made &#8211; <code>HTTP/1.1</code></dd>
<dt>Request_URI</dt>
<dd>the resource requested on the HTTP request line &#8212; generally the portion of the URL following the scheme and host portion without the query string &#8211; <code>/robots.txt</code></dd>
</dl>
<blockquote cite="http://httpd.apache.org/docs/2.2/mod/mod_setenvif.html"><p>Syntax: </p>
<pre>SetEnvIf attribute regex [!]env-variable[=value] [[!]env-variable[=value]] &#46;..</pre>
</blockquote>
<h2><a href="#http-headers" rel="nofollow"  id="http-headers" title="Populates HTTP_MY_ Variables with mod_setenvif variable values">Populates HTTP_MY_ Variables with mod_setenvif variable values</a></h2>
<pre>SetEnvIfNoCase Remote_Host &quot;(.*)&quot; HTTP_MY_REMOTE_HOST=$1
SetEnvIfNoCase Remote_Addr &quot;(.*)&quot; HTTP_MY_REMOTE_ADDR=$1
SetEnvIfNoCase Server_Addr &quot;(.*)&quot; HTTP_MY_SERVER_ADDR=$1
SetEnvIfNoCase Request_Method &quot;(.*)&quot; HTTP_MY_REQUEST_METHOD=$1
SetEnvIfNoCase Request_Protocol &quot;(.*)&quot; HTTP_MY_REQUEST_PROTOCOL=$1
SetEnvIfNoCase Request_URI &quot;(.*)&quot; HTTP_MY_REQUEST_URI=$1</pre>
<h2><a href="#remote-host" rel="nofollow"  id="remote-host" title="Set REMOTE_HOST to HTTP_HOST">Set REMOTE_HOST to HTTP_HOST</a></h2>
<p>Sets REMOTE_HOST to www.askapache.com if Remote_Addr=208.113.183.103.  This can be useful if your server doesn&#8217;t automatically do a reverse lookup on a remote address, so this way you can tell if the request was internal/from your server.</p>
<pre>SetEnvIf Remote_Addr 208\.113\.183\.103 REMOTE_HOST=www.askapache.com</pre>
<h2><a href="#allow-host" rel="nofollow"  id="allow-host" title="Allows only if HOST Header is present in request">Allows only if HOST Header is present in request</a></h2>
<pre>SetEnvIfNoCase ^HOST$ .+ HTTP_MY_HAS_HOST
Order Deny,Allow
Deny from All
Allow from env=HTTP_MY_HAS_HOST</pre>
<p>or</p>
<pre>SetEnvIfNoCase Host .+ HTTP_MY_HAS_HOST
Order Deny,Allow
Deny from All
Allow from env=HTTP_MY_HAS_HOST</pre>
<h2><a href="#header-copy" rel="nofollow"  id="header-copy" title="Add values from HTTP Headers">Add values from HTTP Headers</a></h2>
<pre>SetEnvIfNoCase ^If-Modified-Since$ &quot;(.+)&quot; HTTP_IF_MODIFIED_SINCE=$1
SetEnvIfNoCase ^If-None-Match$ &quot;(.+)&quot; HTTP_IF_NONE_MATCH=$1
SetEnvIfNoCase ^Cache-Control$ &quot;(.+)&quot; HTTP_CACHE_CONTROL=$1
SetEnvIfNoCase ^Connection$ &quot;(.+)&quot; HTTP_CONNECTION=$1
SetEnvIfNoCase ^Keep-Alive$ &quot;(.+)&quot; HTTP_KEEP_ALIVE=$1
SetEnvIfNoCase ^Authorization$ &quot;(.+)&quot; HTTP_AUTHORIZATION=$1
SetEnvIfNoCase ^Cookie$ &quot;(.+)&quot; HTTP_MY_COOKIE=$1</pre>
<h2><a href="#redirect-status" rel="nofollow"  id="redirect-status" title="Set the REDIRECT_STATUS for Interpreter Security">Set the REDIRECT_STATUS for Interpreter Security</a></h2>
<p>This is useful in disallowing direct access to interpreters like shell scripts, cgi scripts, and other interpreters.  Only works this way if you have a static IP for your server.  So the only way to access these files is by instructing the server itself to request the file, using an Action directive or by requesting the file through a .php or other script using curl or wget, or something like fsockopen.</p>
<pre>&lt;FilesMatch &quot;\.(cgi|sh|pl)$&quot;&gt;
SetEnvIfNoCase Remote_Addr 208\.113\.183\.103 REDIRECT_STATUS
&nbsp;
Order Deny,Allow
Deny from All
Allow from env=REDIRECT_STATUS
&lt;/FilesMatch&gt;</pre>
<h2>Block Bad Bots</h2>
<p>Can be useful if your site is getting hammered by spambots. Some nice examples from around the net are at <a href="http://www.askapache.com/htaccess/fight-blog-spam-with-apache.html">Fight Blog Spam With Apache</a>&#8230;  Keep in mind the HTTP_USER_AGENT is directly from the client, so its easy to spoof / change.  Instead use <a href="http://www.askapache.com/htaccess/mod_security-htaccess-tricks.html">mod_security</a> for a much better solution.</p>
<pre>SetEnvIfNoCase User-Agent &quot;^Bandit&quot; bad_bot
SetEnvIfNoCase User-Agent &quot;^Baiduspider&quot; bad_bot
SetEnvIfNoCase User-Agent &quot;^BatchFTP&quot; bad_bot
SetEnvIfNoCase User-Agent &quot;^Bigfoot&quot; bad_bot
SetEnvIfNoCase User-Agent &quot;^Black.Hole&quot; bad_bot
&nbsp;
Order Allow,Deny
Allow from All
Deny from env=bad_bot</pre>
<h2>Allow Search robots</h2>
<p>This does the opposite of above, allowing ONLY these web robots access.  Other than rogue robots, configuring your <a href="http://www.askapache.com/seo/updated-robotstxt-for-wordpress.html">robots.txt file</a> correctly will keep most robots where you want them.</p>
<pre>SetEnvIfNoCase User-Agent .*google.* search_robot
SetEnvIfNoCase User-Agent .*yahoo.* search_robot
SetEnvIfNoCase User-Agent .*bot.* search_robot
SetEnvIfNoCase User-Agent .*ask.* search_robot
&nbsp;
Order Deny,Allow
Deny from All
Allow from env=search_robot</pre>
<h2>SetEnvIf Directive</a></h2>
<table>
<tbody>
<tr>
<th><a href="#setenvif-description" rel="nofollow" >Description:</a></th>
<td>Sets environment variables based on attributes of the request </td>
</tr>
<tr>
<th><a href="#setenvif-syntax" rel="nofollow" >Syntax:</a></th>
<td><code>SetEnvIf attribute regex [!]env-variable[=value] [[!]env-variable[=value]] ...</code></td>
</tr>
<tr>
<th><a href="#setenvif-context" rel="nofollow" >Context:</a></th>
<td>server config, virtual host, directory, .htaccess</td>
</tr>
<tr>
<th><a href="#setenvif-override" rel="nofollow" >Override:</a></th>
<td>FileInfo</td>
</tr>
<tr>
<th><a href="#setenvif-status" rel="nofollow" >Status:</a></th>
<td>Base</td>
</tr>
<tr>
<th><a href="#setenvif-module" rel="nofollow" >Module:</a></th>
<td>mod_setenvif</td>
</tr>
</tbody>
</table>
<p>The <code>SetEnvIf</code> directive defines environment variables based on attributes of the request. The attribute specified in the first argument can be one of three things:</p>
<ol>
<li>An HTTP request header field (see <a href="http://www.rfc-editor.org/rfc/rfc2616.txt" rel="nofollow" >RFC2616</a> for more information about these); for example: <code>Host</code>, <code>User-Agent</code>, <code>Referer</code>, and <code>Accept-Language</code>.  A regular expression may be used to specify a set of request headers.</li>
<li>One of the following aspects of the request:
<ul>
<li><code>Remote_Host</code> &#8211; the hostname (if available) of the client making the request</li>
<li><code>Remote_Addr</code> &#8211; the IP address of the client making the request</li>
<li><code>Server_Addr</code> &#8211; the IP address of the server on which the request was received (only with versions later than 2.0.43)</li>
<li><code>Request_Method</code> &#8211; the name of the method being used (<code>GET</code>, <code>POST</code>, et cetera)</li>
<li><code>Request_Protocol</code> &#8211; the name and version of the protocol with which the request was made (e.g., &#8220;HTTP/0.9&#8243;, &#8220;HTTP/1.1&#8243;, etc.)</li>
<li><code>Request_URI</code> &#8211; the resource requested on the HTTP  request line &#8212; generally the portion of the URL following the scheme and host portion without the query string. See the <code>RewriteCond</code> directive of <code>mod_rewrite</code> for extra information on how to match your query string.</li>
</ul>
</li>
<li>The name of an environment variable in the list of those associated with the request. This allows <code>SetEnvIf</code> directives to test against the result of prior matches. Only those environment variables defined by earlier <code>SetEnvIf[NoCase]</code> directives are available for testing in this manner. &#8216;Earlier&#8217; means that they were defined at a broader scope (such as server-wide) or previously in the current directive&#8217;s scope. Environment variables will be considered only if there was no match among request characteristics and a regular expression was not used for the attribute.</li>
</ol>
<p>The second argument (regex) is a regular expression.  If the regex matches against the attribute, then the remainder of the arguments are evaluated.</p>
<p>The rest of the arguments give the names of variables to set, and optionally values to which they should be set. These take the form of</p>
<ol>
<li><code>varname</code></li>
<li><code>!varname</code></li>
<li><code>varname=value</code></li>
</ol>
<p>In the first form, the value will be set to &#8220;1&#8243;. The second will remove the given variable if already defined, and the third will set the variable to the literal value given by <code>value</code>. <em>Since version 2.0.51</em> Apache will recognize occurrences of <code>$1</code>..<code>$9</code> within <var>value</var> and replace them by parenthesized subexpressions of <var>regex</var>.</p>
<h4>SetEnvIf Example:</h4>
<pre>SetEnvIf Request_URI &quot;\.gif$&quot; object_is_image=gif
SetEnvIf Request_URI &quot;\.jpg$&quot; object_is_image=jpg
SetEnvIf Request_URI &quot;\.xbm$&quot; object_is_image=xbm
SetEnvIf Referer www\.askapache\.com intra_site_referral
SetEnvIf object_is_image xbm XBIT_PROCESSING=1
SetEnvIf ^SETENVIF*  ^[a-z].*  HAS_SETENVIF</pre>
<p>The first three will set the environment variable <code>object_is_image</code> if the request was for an image file, and the fourth sets <code>intra_site_referral</code> if the referring page was somewhere on the <code>www.askapache.com</code> Web site.</p>
<p>The last example will set environment variable <code>HAS_SETENVIF</code> if the request contains any headers that begin with &#8220;SETENVIF&#8221; whose values begins with any character in the set [a-z].</p>
<hr class="HR0" />
<h2>htaccess Guide Sections</h2>
<ul class="ou">
<li><a href="http://www.askapache.com/htaccess/htaccess-for-webmasters.html"rel="chapter bookmark"  title="Apache HTTP Web Server htaccess tips and tricks">htaccess tricks for Webmasters</a></li>
<li><a href="http://www.askapache.com/htaccess/using-http-headers-with-htaccess.html"rel="chapter bookmark"  title="Creating and using HTTP Headers with htaccess">HTTP Header control with htaccess</a></li>
<li><a href="http://www.askapache.com/htaccess/php-htaccess-tips-and-tricks.html"rel="chapter bookmark"  title="mod_php or php as a cgi with htaccess tips, htaccess php tricks">PHP on Apache tips and tricks</a></li>
<li><a href="http://www.askapache.com/htaccess/seo-search-engine-friendly-redirects-without-mod_rewrite.html"rel="chapter bookmark"  title="SEO-Friendly 301 Redirects without mod_rewrite">SEO Redirects without mod_rewrite</a></li>
<li><a href="http://www.askapache.com/htaccess/mod_rewrite-tips-and-tricks.html"rel="chapter bookmark"  title="mod_rewrite tips and tricks with RewriteEngine, RewriteBase, RewriteRule, and RewriteCond">mod_rewrite examples, tips, and tricks</a></li>
<li><a href="http://www.askapache.com/htaccess/speed-up-your-site-with-caching-and-cache-control.html"rel="chapter bookmark"  title="Caching, cache-control, cache, expires, and optimizing htaccess">HTTP Caching and Site Speedups</a></li>
<li><a href="http://www.askapache.com/htaccess/apache-authentication-in-htaccess.html"rel="chapter bookmark"  title="htaccess and Apache authentication with htpasswd, 401, and 403">Authentication on Apache</a></li>
<li><a href="http://www.askapache.com/htaccess/security-with-htaccess.html"rel="chapter bookmark"  title="Security, hacking, and anti-hacking tips and tricks for htaccess">htaccess Security Tricks and Tips</a></li>
<li><a href="http://www.askapache.com/htaccess/ssl-example-usage-in-htaccess.html"rel="chapter bookmark"  title="Apache SSL examples">SSL tips and examples</a></li>
<li><a href="http://www.askapache.com/htaccess/apache-variable-fun-in-htaccess.html"rel="chapter bookmark"  title="Apache variables info, tricks, and tips">Variable Fun (mod_env) Section</a></li>
<li><a href="http://www.askapache.com/htaccess/mod_security-htaccess-tricks.html"rel="chapter bookmark"  title="mod_security Guide and sample mod_Security diretive usage in .htaccess">.htaccess Security with MOD_SECURITY</a></li>
<li><a href="http://www.askapache.com/htaccess/setenvif.html"rel="chapter bookmark"  title="SetEnvIf and SetEnvIfNoCase Examples for conditionally setting variables in Apache .htaccess">SetEnvIf and SetEnvIfNoCase Examples</a></li>
</ul>
<hr class="HR0" />
<p class="ment"><a href="http://www.askapache.com/htaccess/mod_security-htaccess-tricks.html"rel="prev"  title="mod_security Guide and sample mod_Security directive usage in .htaccess">&laquo;  .htaccess Security with MOD_SECURITY</a> | <a href="http://www.askapache.com/htaccess/htaccess.html" class="acd1" rel="Contents Index Start" title=".htaccess tutorial">.htaccess Tutorial Index</a></p>
<p><a href="http://www.askapache.com/htaccess/setenvif.html"></a><a href="http://www.askapache.com/htaccess/setenvif.html">Htaccess SetEnvIf and SetEnvIfNoCase Examples</a> originally appeared on <cite>AskApache.com</cite> </p>]]></content:encoded>
			<wfw:commentRss>http://www.askapache.com/htaccess/setenvif.html/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
