advanced.html.en revision 3f08db06526d6901aa08c110b5bc7dde6bc39905
b630661b71a5495a95831a05a6a2299fb1c7c771rbowen<?xml version="1.0" encoding="ISO-8859-1"?>
b630661b71a5495a95831a05a6a2299fb1c7c771rbowen<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
b630661b71a5495a95831a05a6a2299fb1c7c771rbowen<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head><!--
b630661b71a5495a95831a05a6a2299fb1c7c771rbowen XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
b630661b71a5495a95831a05a6a2299fb1c7c771rbowen This file is generated from xml source: DO NOT EDIT
b630661b71a5495a95831a05a6a2299fb1c7c771rbowen XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
b630661b71a5495a95831a05a6a2299fb1c7c771rbowen -->
149dc5253eef0f0289fad126961eec1c9e1407a2rbowen<title>Advanced Techniques with mod_rewrite - Apache HTTP Server</title>
b630661b71a5495a95831a05a6a2299fb1c7c771rbowen<link href="/style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
b630661b71a5495a95831a05a6a2299fb1c7c771rbowen<link href="/style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
b630661b71a5495a95831a05a6a2299fb1c7c771rbowen<link href="/style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" />
b630661b71a5495a95831a05a6a2299fb1c7c771rbowen<link href="/images/favicon.ico" rel="shortcut icon" /></head>
b630661b71a5495a95831a05a6a2299fb1c7c771rbowen<body id="manual-page"><div id="page-header">
b630661b71a5495a95831a05a6a2299fb1c7c771rbowen<p class="menu"><a href="/mod/">Modules</a> | <a href="/mod/directives.html">Directives</a> | <a href="/faq/">FAQ</a> | <a href="/glossary.html">Glossary</a> | <a href="/sitemap.html">Sitemap</a></p>
3f08db06526d6901aa08c110b5bc7dde6bc39905nd<p class="apache">Apache HTTP Server Version 2.5</p>
b630661b71a5495a95831a05a6a2299fb1c7c771rbowen<img alt="" src="/images/feather.gif" /></div>
b630661b71a5495a95831a05a6a2299fb1c7c771rbowen<div class="up"><a href="./"><img title="&lt;-" alt="&lt;-" src="/images/left.gif" /></a></div>
b630661b71a5495a95831a05a6a2299fb1c7c771rbowen<div id="path">
3f08db06526d6901aa08c110b5bc7dde6bc39905nd<a href="http://www.apache.org/">Apache</a> &gt; <a href="http://httpd.apache.org/">HTTP Server</a> &gt; <a href="http://httpd.apache.org/docs/">Documentation</a> &gt; <a href="../">Version 2.5</a> &gt; <a href="./">Rewrite</a></div><div id="page-content"><div id="preamble"><h1>Advanced Techniques with mod_rewrite</h1>
b630661b71a5495a95831a05a6a2299fb1c7c771rbowen<div class="toplang">
f086b4b402fa9a2fefc7dda85de2a3cc1cd0a654rjung<p><span>Available Languages: </span><a href="/en/rewrite/avoid.html" title="English">&nbsp;en&nbsp;</a></p>
b630661b71a5495a95831a05a6a2299fb1c7c771rbowen</div>
b630661b71a5495a95831a05a6a2299fb1c7c771rbowen
b630661b71a5495a95831a05a6a2299fb1c7c771rbowen
9a58dc6a2b26ec128b1270cf48810e705f1a90dbsf<p>This document supplements the <code class="module"><a href="/mod/mod_rewrite.html">mod_rewrite</a></code>
9a58dc6a2b26ec128b1270cf48810e705f1a90dbsf<a href="/mod/mod_rewrite.html">reference documentation</a>. It provides
53abc235688d883cfa15cdfec354ba03128f357arbowena few advanced techniques using mod_rewrite.</p>
b630661b71a5495a95831a05a6a2299fb1c7c771rbowen
b630661b71a5495a95831a05a6a2299fb1c7c771rbowen<div class="warning">Note that many of these examples won't work unchanged in your
b630661b71a5495a95831a05a6a2299fb1c7c771rbowenparticular server configuration, so it's important that you understand
b630661b71a5495a95831a05a6a2299fb1c7c771rbowenthem, rather than merely cutting and pasting the examples into your
b630661b71a5495a95831a05a6a2299fb1c7c771rbowenconfiguration.</div>
b630661b71a5495a95831a05a6a2299fb1c7c771rbowen
b630661b71a5495a95831a05a6a2299fb1c7c771rbowen</div>
b0306ceedec510a7b4ebe3a1b70c366bf5f2727crbowen<div id="quickview"><ul id="toc"><li><img alt="" src="/images/down.gif" /> <a href="#sharding">URL-based sharding accross multiple backends</a></li>
b0306ceedec510a7b4ebe3a1b70c366bf5f2727crbowen<li><img alt="" src="/images/down.gif" /> <a href="#on-the-fly-content">On-the-fly Content-Regeneration</a></li>
ed84b2ae96180924248fbbc86b68d86ae8d88cb3rbowen<li><img alt="" src="/images/down.gif" /> <a href="#load-balancing">Load Balancing</a></li>
0f6366523dec7face01fcad3eadcc1378e34e663rbowen<li><img alt="" src="/images/down.gif" /> <a href="#autorefresh">Document With Autorefresh</a></li>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen<li><img alt="" src="/images/down.gif" /> <a href="#structuredhomedirs">Structured Userdirs</a></li>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen<li><img alt="" src="/images/down.gif" /> <a href="#redirectanchors">Redirecting Anchors</a></li>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen<li><img alt="" src="/images/down.gif" /> <a href="#time-dependent">Time-Dependent Rewriting</a></li>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen<li><img alt="" src="/images/down.gif" /> <a href="#setenvvars">Set Environment Variables Based On URL Parts</a></li>
3723c5ef4beec0403b4daa6c64fc0a8f53541018rbowen</ul><h3>See also</h3><ul class="seealso"><li><a href="/mod/mod_rewrite.html">Module documentation</a></li><li><a href="intro.html">mod_rewrite introduction</a></li><li><a href="remapping.html">Redirection and remapping</a></li><li><a href="access.html">Controlling access</a></li><li><a href="vhosts.html">Virtual hosts</a></li><li><a href="proxy.html">Proxying</a></li><li><a href="rewritemap.html">Using RewriteMap</a></li><li><a href="avoid.html">When not to use mod_rewrite</a></li></ul></div>
1525d3506d73644ae695624f16b15cc73cc1c7acrbowen<div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
1525d3506d73644ae695624f16b15cc73cc1c7acrbowen<div class="section">
1525d3506d73644ae695624f16b15cc73cc1c7acrbowen<h2><a name="sharding" id="sharding">URL-based sharding accross multiple backends</a></h2>
1525d3506d73644ae695624f16b15cc73cc1c7acrbowen
1525d3506d73644ae695624f16b15cc73cc1c7acrbowen
1525d3506d73644ae695624f16b15cc73cc1c7acrbowen
1525d3506d73644ae695624f16b15cc73cc1c7acrbowen <dl>
1525d3506d73644ae695624f16b15cc73cc1c7acrbowen <dt>Description:</dt>
1525d3506d73644ae695624f16b15cc73cc1c7acrbowen
1525d3506d73644ae695624f16b15cc73cc1c7acrbowen <dd>
9a58dc6a2b26ec128b1270cf48810e705f1a90dbsf <p>A common technique for distributing the burden of
9a58dc6a2b26ec128b1270cf48810e705f1a90dbsf server load or storage space is called "sharding".
1525d3506d73644ae695624f16b15cc73cc1c7acrbowen When using this method, a front-end server will use the
1525d3506d73644ae695624f16b15cc73cc1c7acrbowen url to consistently "shard" users or objects to separate
1525d3506d73644ae695624f16b15cc73cc1c7acrbowen backend servers.</p>
1525d3506d73644ae695624f16b15cc73cc1c7acrbowen </dd>
1525d3506d73644ae695624f16b15cc73cc1c7acrbowen
1525d3506d73644ae695624f16b15cc73cc1c7acrbowen <dt>Solution:</dt>
1525d3506d73644ae695624f16b15cc73cc1c7acrbowen
1525d3506d73644ae695624f16b15cc73cc1c7acrbowen <dd>
1525d3506d73644ae695624f16b15cc73cc1c7acrbowen <p>A mapping is maintained, from users to target servers, in
1525d3506d73644ae695624f16b15cc73cc1c7acrbowen external map files. They look like:</p>
1525d3506d73644ae695624f16b15cc73cc1c7acrbowen
353e838f5716b394f2f9bf38549e1550a5e73570rbowen<div class="example"><p><code>
353e838f5716b394f2f9bf38549e1550a5e73570rbowenuser1 physical_host_of_user1<br />
353e838f5716b394f2f9bf38549e1550a5e73570rbowenuser2 physical_host_of_user2<br />
1525d3506d73644ae695624f16b15cc73cc1c7acrbowen: :
353e838f5716b394f2f9bf38549e1550a5e73570rbowen</code></p></div>
1525d3506d73644ae695624f16b15cc73cc1c7acrbowen
1525d3506d73644ae695624f16b15cc73cc1c7acrbowen <p>We put this into a <code>map.users-to-hosts</code> file. The
1525d3506d73644ae695624f16b15cc73cc1c7acrbowen aim is to map;</p>
1525d3506d73644ae695624f16b15cc73cc1c7acrbowen
353e838f5716b394f2f9bf38549e1550a5e73570rbowen<div class="example"><p><code>
1525d3506d73644ae695624f16b15cc73cc1c7acrbowen/u/user1/anypath
353e838f5716b394f2f9bf38549e1550a5e73570rbowen</code></p></div>
1525d3506d73644ae695624f16b15cc73cc1c7acrbowen
1525d3506d73644ae695624f16b15cc73cc1c7acrbowen <p>to</p>
1525d3506d73644ae695624f16b15cc73cc1c7acrbowen
353e838f5716b394f2f9bf38549e1550a5e73570rbowen<div class="example"><p><code>
1525d3506d73644ae695624f16b15cc73cc1c7acrbowenhttp://physical_host_of_user1/u/user/anypath
353e838f5716b394f2f9bf38549e1550a5e73570rbowen</code></p></div>
1525d3506d73644ae695624f16b15cc73cc1c7acrbowen
1525d3506d73644ae695624f16b15cc73cc1c7acrbowen <p>thus every URL path need not be valid on every backend physical
1525d3506d73644ae695624f16b15cc73cc1c7acrbowen host. The following ruleset does this for us with the help of the map
1525d3506d73644ae695624f16b15cc73cc1c7acrbowen files assuming that server0 is a default server which will be used if
c2a88a7ef740c408aba42af38ddfb9ab8a7398d9nd a user has no entry in the map:</p>
1525d3506d73644ae695624f16b15cc73cc1c7acrbowen
353e838f5716b394f2f9bf38549e1550a5e73570rbowen<div class="example"><p><code>
353e838f5716b394f2f9bf38549e1550a5e73570rbowenRewriteEngine on<br />
353e838f5716b394f2f9bf38549e1550a5e73570rbowen<br />
353e838f5716b394f2f9bf38549e1550a5e73570rbowenRewriteMap users-to-hosts txt:/path/to/map.users-to-hosts<br />
353e838f5716b394f2f9bf38549e1550a5e73570rbowen<br />
1525d3506d73644ae695624f16b15cc73cc1c7acrbowenRewriteRule ^/u/<strong>([^/]+)</strong>/?(.*) http://<strong>${users-to-hosts:$1|server0}</strong>/u/$1/$2
353e838f5716b394f2f9bf38549e1550a5e73570rbowen</code></p></div>
1525d3506d73644ae695624f16b15cc73cc1c7acrbowen </dd>
1525d3506d73644ae695624f16b15cc73cc1c7acrbowen </dl>
1525d3506d73644ae695624f16b15cc73cc1c7acrbowen
53abc235688d883cfa15cdfec354ba03128f357arbowen <p>See the <code class="directive"><a href="/mod/mod_rewrite.html#rewritemap">RewriteMap</a></code>
53abc235688d883cfa15cdfec354ba03128f357arbowen documentation for more discussion of the syntax of this directive.</p>
53abc235688d883cfa15cdfec354ba03128f357arbowen
b0306ceedec510a7b4ebe3a1b70c366bf5f2727crbowen</div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
b0306ceedec510a7b4ebe3a1b70c366bf5f2727crbowen<div class="section">
b0306ceedec510a7b4ebe3a1b70c366bf5f2727crbowen<h2><a name="on-the-fly-content" id="on-the-fly-content">On-the-fly Content-Regeneration</a></h2>
b0306ceedec510a7b4ebe3a1b70c366bf5f2727crbowen
b0306ceedec510a7b4ebe3a1b70c366bf5f2727crbowen
b0306ceedec510a7b4ebe3a1b70c366bf5f2727crbowen
b0306ceedec510a7b4ebe3a1b70c366bf5f2727crbowen <dl>
b0306ceedec510a7b4ebe3a1b70c366bf5f2727crbowen <dt>Description:</dt>
b0306ceedec510a7b4ebe3a1b70c366bf5f2727crbowen
b0306ceedec510a7b4ebe3a1b70c366bf5f2727crbowen <dd>
b0306ceedec510a7b4ebe3a1b70c366bf5f2727crbowen <p>We wish to dynamically generate content, but store it
b0306ceedec510a7b4ebe3a1b70c366bf5f2727crbowen statically once it is generated. This rule will check for the
b0306ceedec510a7b4ebe3a1b70c366bf5f2727crbowen existence of the static file, and if it's not there, generate
b0306ceedec510a7b4ebe3a1b70c366bf5f2727crbowen it. The static files can be removed periodically, if desired (say,
b0306ceedec510a7b4ebe3a1b70c366bf5f2727crbowen via cron) and will be regenerated on demand.</p>
b0306ceedec510a7b4ebe3a1b70c366bf5f2727crbowen </dd>
b0306ceedec510a7b4ebe3a1b70c366bf5f2727crbowen
b0306ceedec510a7b4ebe3a1b70c366bf5f2727crbowen <dt>Solution:</dt>
b0306ceedec510a7b4ebe3a1b70c366bf5f2727crbowen
b0306ceedec510a7b4ebe3a1b70c366bf5f2727crbowen <dd>
b0306ceedec510a7b4ebe3a1b70c366bf5f2727crbowen This is done via the following ruleset:
b0306ceedec510a7b4ebe3a1b70c366bf5f2727crbowen
353e838f5716b394f2f9bf38549e1550a5e73570rbowen<div class="example"><p><code>
353e838f5716b394f2f9bf38549e1550a5e73570rbowen# This example is valid in per-directory context only<br />
53abc235688d883cfa15cdfec354ba03128f357arbowenRewriteCond %{REQUEST_URI} <strong>!-U</strong><br />
53abc235688d883cfa15cdfec354ba03128f357arbowenRewriteRule ^(.+)\.html$ /regenerate_page.cgi [PT,L]
353e838f5716b394f2f9bf38549e1550a5e73570rbowen</code></p></div>
b0306ceedec510a7b4ebe3a1b70c366bf5f2727crbowen
53abc235688d883cfa15cdfec354ba03128f357arbowen <p>The <code>-U</code> operator determines whether the test string
53abc235688d883cfa15cdfec354ba03128f357arbowen (in this case, <code>REQUEST_URI</code>) is a valid URL. It does
53abc235688d883cfa15cdfec354ba03128f357arbowen this via a subrequest. In the event that this subrequest fails -
53abc235688d883cfa15cdfec354ba03128f357arbowen that is, the requested resource doesn't exist - this rule invokes
53abc235688d883cfa15cdfec354ba03128f357arbowen the CGI program <code>/regenerate_page.cgi</code>, which generates
53abc235688d883cfa15cdfec354ba03128f357arbowen the requested resource and saves it into the document directory, so
53abc235688d883cfa15cdfec354ba03128f357arbowen that the next time it is requested, a static copy can be served.</p>
9a58dc6a2b26ec128b1270cf48810e705f1a90dbsf
53abc235688d883cfa15cdfec354ba03128f357arbowen <p>In this way, documents that are infrequently updated can be served in
53abc235688d883cfa15cdfec354ba03128f357arbowen static form. if documents need to be refreshed, they can be deleted
53abc235688d883cfa15cdfec354ba03128f357arbowen from the document directory, and they will then be regenerated the
53abc235688d883cfa15cdfec354ba03128f357arbowen next time they are requested.</p>
b0306ceedec510a7b4ebe3a1b70c366bf5f2727crbowen </dd>
b0306ceedec510a7b4ebe3a1b70c366bf5f2727crbowen </dl>
b0306ceedec510a7b4ebe3a1b70c366bf5f2727crbowen
ed84b2ae96180924248fbbc86b68d86ae8d88cb3rbowen</div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
ed84b2ae96180924248fbbc86b68d86ae8d88cb3rbowen<div class="section">
ed84b2ae96180924248fbbc86b68d86ae8d88cb3rbowen<h2><a name="load-balancing" id="load-balancing">Load Balancing</a></h2>
ed84b2ae96180924248fbbc86b68d86ae8d88cb3rbowen
ed84b2ae96180924248fbbc86b68d86ae8d88cb3rbowen
ed84b2ae96180924248fbbc86b68d86ae8d88cb3rbowen
ed84b2ae96180924248fbbc86b68d86ae8d88cb3rbowen <dl>
ed84b2ae96180924248fbbc86b68d86ae8d88cb3rbowen <dt>Description:</dt>
ed84b2ae96180924248fbbc86b68d86ae8d88cb3rbowen
ed84b2ae96180924248fbbc86b68d86ae8d88cb3rbowen <dd>
ed84b2ae96180924248fbbc86b68d86ae8d88cb3rbowen <p>We wish to randomly distribute load across several servers
ed84b2ae96180924248fbbc86b68d86ae8d88cb3rbowen using mod_rewrite.</p>
ed84b2ae96180924248fbbc86b68d86ae8d88cb3rbowen </dd>
ed84b2ae96180924248fbbc86b68d86ae8d88cb3rbowen
ed84b2ae96180924248fbbc86b68d86ae8d88cb3rbowen <dt>Solution:</dt>
ed84b2ae96180924248fbbc86b68d86ae8d88cb3rbowen
ed84b2ae96180924248fbbc86b68d86ae8d88cb3rbowen <dd>
ed84b2ae96180924248fbbc86b68d86ae8d88cb3rbowen <p>We'll use <code class="directive"><a href="/mod/mod_rewrite.html#rewritemap">RewriteMap</a></code> and a list of servers
ed84b2ae96180924248fbbc86b68d86ae8d88cb3rbowen to accomplish this.</p>
ed84b2ae96180924248fbbc86b68d86ae8d88cb3rbowen
353e838f5716b394f2f9bf38549e1550a5e73570rbowen<div class="example"><p><code>
353e838f5716b394f2f9bf38549e1550a5e73570rbowenRewriteEngine on<br />
353e838f5716b394f2f9bf38549e1550a5e73570rbowenRewriteMap lb rnd:/path/to/serverlist.txt<br />
353e838f5716b394f2f9bf38549e1550a5e73570rbowen<br />
ed84b2ae96180924248fbbc86b68d86ae8d88cb3rbowenRewriteRule ^/(.*) http://${lb:servers}/$1 [P,L]
353e838f5716b394f2f9bf38549e1550a5e73570rbowen</code></p></div>
ed84b2ae96180924248fbbc86b68d86ae8d88cb3rbowen
ed84b2ae96180924248fbbc86b68d86ae8d88cb3rbowen<p><code>serverlist.txt</code> will contain a list of the servers:</p>
ed84b2ae96180924248fbbc86b68d86ae8d88cb3rbowen
353e838f5716b394f2f9bf38549e1550a5e73570rbowen<div class="example"><p><code>
353e838f5716b394f2f9bf38549e1550a5e73570rbowen## serverlist.txt<br />
353e838f5716b394f2f9bf38549e1550a5e73570rbowen<br />
353e838f5716b394f2f9bf38549e1550a5e73570rbowenservers one.example.com|two.example.com|three.example.com<br />
353e838f5716b394f2f9bf38549e1550a5e73570rbowen</code></p></div>
ed84b2ae96180924248fbbc86b68d86ae8d88cb3rbowen
ed84b2ae96180924248fbbc86b68d86ae8d88cb3rbowen<p>If you want one particular server to get more of the load than the
ed84b2ae96180924248fbbc86b68d86ae8d88cb3rbowenothers, add it more times to the list.</p>
ed84b2ae96180924248fbbc86b68d86ae8d88cb3rbowen
ed84b2ae96180924248fbbc86b68d86ae8d88cb3rbowen </dd>
ed84b2ae96180924248fbbc86b68d86ae8d88cb3rbowen
ed84b2ae96180924248fbbc86b68d86ae8d88cb3rbowen <dt>Discussion</dt>
ed84b2ae96180924248fbbc86b68d86ae8d88cb3rbowen <dd>
ed84b2ae96180924248fbbc86b68d86ae8d88cb3rbowen<p>Apache comes with a load-balancing module -
ed84b2ae96180924248fbbc86b68d86ae8d88cb3rbowen<code class="module"><a href="/mod/mod_proxy_balancer.html">mod_proxy_balancer</a></code> - which is far more flexible and
ed84b2ae96180924248fbbc86b68d86ae8d88cb3rbowenfeatureful than anything you can cobble together using mod_rewrite.</p>
ed84b2ae96180924248fbbc86b68d86ae8d88cb3rbowen </dd>
ed84b2ae96180924248fbbc86b68d86ae8d88cb3rbowen </dl>
ed84b2ae96180924248fbbc86b68d86ae8d88cb3rbowen
0f6366523dec7face01fcad3eadcc1378e34e663rbowen</div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
0f6366523dec7face01fcad3eadcc1378e34e663rbowen<div class="section">
0f6366523dec7face01fcad3eadcc1378e34e663rbowen<h2><a name="autorefresh" id="autorefresh">Document With Autorefresh</a></h2>
0f6366523dec7face01fcad3eadcc1378e34e663rbowen
0f6366523dec7face01fcad3eadcc1378e34e663rbowen
0f6366523dec7face01fcad3eadcc1378e34e663rbowen
53abc235688d883cfa15cdfec354ba03128f357arbowen
53abc235688d883cfa15cdfec354ba03128f357arbowen
0f6366523dec7face01fcad3eadcc1378e34e663rbowen <dl>
0f6366523dec7face01fcad3eadcc1378e34e663rbowen <dt>Description:</dt>
0f6366523dec7face01fcad3eadcc1378e34e663rbowen
0f6366523dec7face01fcad3eadcc1378e34e663rbowen <dd>
0f6366523dec7face01fcad3eadcc1378e34e663rbowen <p>Wouldn't it be nice, while creating a complex web page, if
0f6366523dec7face01fcad3eadcc1378e34e663rbowen the web browser would automatically refresh the page every
0f6366523dec7face01fcad3eadcc1378e34e663rbowen time we save a new version from within our editor?
0f6366523dec7face01fcad3eadcc1378e34e663rbowen Impossible?</p>
0f6366523dec7face01fcad3eadcc1378e34e663rbowen </dd>
0f6366523dec7face01fcad3eadcc1378e34e663rbowen
0f6366523dec7face01fcad3eadcc1378e34e663rbowen <dt>Solution:</dt>
0f6366523dec7face01fcad3eadcc1378e34e663rbowen
0f6366523dec7face01fcad3eadcc1378e34e663rbowen <dd>
0f6366523dec7face01fcad3eadcc1378e34e663rbowen <p>No! We just combine the MIME multipart feature, the
0f6366523dec7face01fcad3eadcc1378e34e663rbowen web server NPH feature, and the URL manipulation power of
0f6366523dec7face01fcad3eadcc1378e34e663rbowen <code class="module"><a href="/mod/mod_rewrite.html">mod_rewrite</a></code>. First, we establish a new
0f6366523dec7face01fcad3eadcc1378e34e663rbowen URL feature: Adding just <code>:refresh</code> to any
0f6366523dec7face01fcad3eadcc1378e34e663rbowen URL causes the 'page' to be refreshed every time it is
0f6366523dec7face01fcad3eadcc1378e34e663rbowen updated on the filesystem.</p>
0f6366523dec7face01fcad3eadcc1378e34e663rbowen
353e838f5716b394f2f9bf38549e1550a5e73570rbowen<div class="example"><p><code>
0f6366523dec7face01fcad3eadcc1378e34e663rbowenRewriteRule ^(/[uge]/[^/]+/?.*):refresh /internal/cgi/apache/nph-refresh?f=$1
353e838f5716b394f2f9bf38549e1550a5e73570rbowen</code></p></div>
0f6366523dec7face01fcad3eadcc1378e34e663rbowen
0f6366523dec7face01fcad3eadcc1378e34e663rbowen <p>Now when we reference the URL</p>
0f6366523dec7face01fcad3eadcc1378e34e663rbowen
353e838f5716b394f2f9bf38549e1550a5e73570rbowen<div class="example"><p><code>
0f6366523dec7face01fcad3eadcc1378e34e663rbowen/u/foo/bar/page.html:refresh
353e838f5716b394f2f9bf38549e1550a5e73570rbowen</code></p></div>
0f6366523dec7face01fcad3eadcc1378e34e663rbowen
0f6366523dec7face01fcad3eadcc1378e34e663rbowen <p>this leads to the internal invocation of the URL</p>
0f6366523dec7face01fcad3eadcc1378e34e663rbowen
353e838f5716b394f2f9bf38549e1550a5e73570rbowen<div class="example"><p><code>
0f6366523dec7face01fcad3eadcc1378e34e663rbowen/internal/cgi/apache/nph-refresh?f=/u/foo/bar/page.html
353e838f5716b394f2f9bf38549e1550a5e73570rbowen</code></p></div>
0f6366523dec7face01fcad3eadcc1378e34e663rbowen
0f6366523dec7face01fcad3eadcc1378e34e663rbowen <p>The only missing part is the NPH-CGI script. Although
0f6366523dec7face01fcad3eadcc1378e34e663rbowen one would usually say "left as an exercise to the reader"
0f6366523dec7face01fcad3eadcc1378e34e663rbowen ;-) I will provide this, too.</p>
0f6366523dec7face01fcad3eadcc1378e34e663rbowen
0f6366523dec7face01fcad3eadcc1378e34e663rbowen<div class="example"><pre>
0f6366523dec7face01fcad3eadcc1378e34e663rbowen#!/sw/bin/perl
0f6366523dec7face01fcad3eadcc1378e34e663rbowen##
0f6366523dec7face01fcad3eadcc1378e34e663rbowen## nph-refresh -- NPH/CGI script for auto refreshing pages
0f6366523dec7face01fcad3eadcc1378e34e663rbowen## Copyright (c) 1997 Ralf S. Engelschall, All Rights Reserved.
0f6366523dec7face01fcad3eadcc1378e34e663rbowen##
0f6366523dec7face01fcad3eadcc1378e34e663rbowen$| = 1;
0f6366523dec7face01fcad3eadcc1378e34e663rbowen
0f6366523dec7face01fcad3eadcc1378e34e663rbowen# split the QUERY_STRING variable
0f6366523dec7face01fcad3eadcc1378e34e663rbowen@pairs = split(/&amp;/, $ENV{'QUERY_STRING'});
0f6366523dec7face01fcad3eadcc1378e34e663rbowenforeach $pair (@pairs) {
0f6366523dec7face01fcad3eadcc1378e34e663rbowen($name, $value) = split(/=/, $pair);
0f6366523dec7face01fcad3eadcc1378e34e663rbowen$name =~ tr/A-Z/a-z/;
0f6366523dec7face01fcad3eadcc1378e34e663rbowen$name = 'QS_' . $name;
0f6366523dec7face01fcad3eadcc1378e34e663rbowen$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
0f6366523dec7face01fcad3eadcc1378e34e663rboweneval "\$$name = \"$value\"";
0f6366523dec7face01fcad3eadcc1378e34e663rbowen}
0f6366523dec7face01fcad3eadcc1378e34e663rbowen$QS_s = 1 if ($QS_s eq '');
0f6366523dec7face01fcad3eadcc1378e34e663rbowen$QS_n = 3600 if ($QS_n eq '');
0f6366523dec7face01fcad3eadcc1378e34e663rbowenif ($QS_f eq '') {
0f6366523dec7face01fcad3eadcc1378e34e663rbowenprint "HTTP/1.0 200 OK\n";
0f6366523dec7face01fcad3eadcc1378e34e663rbowenprint "Content-type: text/html\n\n";
0f6366523dec7face01fcad3eadcc1378e34e663rbowenprint "&amp;lt;b&amp;gt;ERROR&amp;lt;/b&amp;gt;: No file given\n";
0f6366523dec7face01fcad3eadcc1378e34e663rbowenexit(0);
0f6366523dec7face01fcad3eadcc1378e34e663rbowen}
0f6366523dec7face01fcad3eadcc1378e34e663rbowenif (! -f $QS_f) {
0f6366523dec7face01fcad3eadcc1378e34e663rbowenprint "HTTP/1.0 200 OK\n";
0f6366523dec7face01fcad3eadcc1378e34e663rbowenprint "Content-type: text/html\n\n";
0f6366523dec7face01fcad3eadcc1378e34e663rbowenprint "&amp;lt;b&amp;gt;ERROR&amp;lt;/b&amp;gt;: File $QS_f not found\n";
0f6366523dec7face01fcad3eadcc1378e34e663rbowenexit(0);
0f6366523dec7face01fcad3eadcc1378e34e663rbowen}
0f6366523dec7face01fcad3eadcc1378e34e663rbowen
0f6366523dec7face01fcad3eadcc1378e34e663rbowensub print_http_headers_multipart_begin {
0f6366523dec7face01fcad3eadcc1378e34e663rbowenprint "HTTP/1.0 200 OK\n";
0f6366523dec7face01fcad3eadcc1378e34e663rbowen$bound = "ThisRandomString12345";
0f6366523dec7face01fcad3eadcc1378e34e663rbowenprint "Content-type: multipart/x-mixed-replace;boundary=$bound\n";
0f6366523dec7face01fcad3eadcc1378e34e663rbowen&amp;print_http_headers_multipart_next;
0f6366523dec7face01fcad3eadcc1378e34e663rbowen}
0f6366523dec7face01fcad3eadcc1378e34e663rbowen
0f6366523dec7face01fcad3eadcc1378e34e663rbowensub print_http_headers_multipart_next {
0f6366523dec7face01fcad3eadcc1378e34e663rbowenprint "\n--$bound\n";
0f6366523dec7face01fcad3eadcc1378e34e663rbowen}
0f6366523dec7face01fcad3eadcc1378e34e663rbowen
0f6366523dec7face01fcad3eadcc1378e34e663rbowensub print_http_headers_multipart_end {
0f6366523dec7face01fcad3eadcc1378e34e663rbowenprint "\n--$bound--\n";
0f6366523dec7face01fcad3eadcc1378e34e663rbowen}
0f6366523dec7face01fcad3eadcc1378e34e663rbowen
0f6366523dec7face01fcad3eadcc1378e34e663rbowensub displayhtml {
0f6366523dec7face01fcad3eadcc1378e34e663rbowenlocal($buffer) = @_;
0f6366523dec7face01fcad3eadcc1378e34e663rbowen$len = length($buffer);
0f6366523dec7face01fcad3eadcc1378e34e663rbowenprint "Content-type: text/html\n";
0f6366523dec7face01fcad3eadcc1378e34e663rbowenprint "Content-length: $len\n\n";
0f6366523dec7face01fcad3eadcc1378e34e663rbowenprint $buffer;
0f6366523dec7face01fcad3eadcc1378e34e663rbowen}
0f6366523dec7face01fcad3eadcc1378e34e663rbowen
0f6366523dec7face01fcad3eadcc1378e34e663rbowensub readfile {
0f6366523dec7face01fcad3eadcc1378e34e663rbowenlocal($file) = @_;
0f6366523dec7face01fcad3eadcc1378e34e663rbowenlocal(*FP, $size, $buffer, $bytes);
0f6366523dec7face01fcad3eadcc1378e34e663rbowen($x, $x, $x, $x, $x, $x, $x, $size) = stat($file);
0f6366523dec7face01fcad3eadcc1378e34e663rbowen$size = sprintf("%d", $size);
0f6366523dec7face01fcad3eadcc1378e34e663rbowenopen(FP, "&amp;lt;$file");
0f6366523dec7face01fcad3eadcc1378e34e663rbowen$bytes = sysread(FP, $buffer, $size);
0f6366523dec7face01fcad3eadcc1378e34e663rbowenclose(FP);
0f6366523dec7face01fcad3eadcc1378e34e663rbowenreturn $buffer;
0f6366523dec7face01fcad3eadcc1378e34e663rbowen}
0f6366523dec7face01fcad3eadcc1378e34e663rbowen
0f6366523dec7face01fcad3eadcc1378e34e663rbowen$buffer = &amp;readfile($QS_f);
0f6366523dec7face01fcad3eadcc1378e34e663rbowen&amp;print_http_headers_multipart_begin;
0f6366523dec7face01fcad3eadcc1378e34e663rbowen&amp;displayhtml($buffer);
0f6366523dec7face01fcad3eadcc1378e34e663rbowen
0f6366523dec7face01fcad3eadcc1378e34e663rbowensub mystat {
0f6366523dec7face01fcad3eadcc1378e34e663rbowenlocal($file) = $_[0];
0f6366523dec7face01fcad3eadcc1378e34e663rbowenlocal($time);
0f6366523dec7face01fcad3eadcc1378e34e663rbowen
0f6366523dec7face01fcad3eadcc1378e34e663rbowen($x, $x, $x, $x, $x, $x, $x, $x, $x, $mtime) = stat($file);
0f6366523dec7face01fcad3eadcc1378e34e663rbowenreturn $mtime;
0f6366523dec7face01fcad3eadcc1378e34e663rbowen}
0f6366523dec7face01fcad3eadcc1378e34e663rbowen
0f6366523dec7face01fcad3eadcc1378e34e663rbowen$mtimeL = &amp;mystat($QS_f);
0f6366523dec7face01fcad3eadcc1378e34e663rbowen$mtime = $mtime;
0f6366523dec7face01fcad3eadcc1378e34e663rbowenfor ($n = 0; $n &amp;lt; $QS_n; $n++) {
0f6366523dec7face01fcad3eadcc1378e34e663rbowenwhile (1) {
0f6366523dec7face01fcad3eadcc1378e34e663rbowen $mtime = &amp;mystat($QS_f);
0f6366523dec7face01fcad3eadcc1378e34e663rbowen if ($mtime ne $mtimeL) {
0f6366523dec7face01fcad3eadcc1378e34e663rbowen $mtimeL = $mtime;
0f6366523dec7face01fcad3eadcc1378e34e663rbowen sleep(2);
0f6366523dec7face01fcad3eadcc1378e34e663rbowen $buffer = &amp;readfile($QS_f);
0f6366523dec7face01fcad3eadcc1378e34e663rbowen &amp;print_http_headers_multipart_next;
0f6366523dec7face01fcad3eadcc1378e34e663rbowen &amp;displayhtml($buffer);
0f6366523dec7face01fcad3eadcc1378e34e663rbowen sleep(5);
0f6366523dec7face01fcad3eadcc1378e34e663rbowen $mtimeL = &amp;mystat($QS_f);
0f6366523dec7face01fcad3eadcc1378e34e663rbowen last;
0f6366523dec7face01fcad3eadcc1378e34e663rbowen }
0f6366523dec7face01fcad3eadcc1378e34e663rbowen sleep($QS_s);
0f6366523dec7face01fcad3eadcc1378e34e663rbowen}
0f6366523dec7face01fcad3eadcc1378e34e663rbowen}
0f6366523dec7face01fcad3eadcc1378e34e663rbowen
0f6366523dec7face01fcad3eadcc1378e34e663rbowen&amp;print_http_headers_multipart_end;
0f6366523dec7face01fcad3eadcc1378e34e663rbowen
0f6366523dec7face01fcad3eadcc1378e34e663rbowenexit(0);
0f6366523dec7face01fcad3eadcc1378e34e663rbowen
0f6366523dec7face01fcad3eadcc1378e34e663rbowen##EOF##
0f6366523dec7face01fcad3eadcc1378e34e663rbowen</pre></div>
0f6366523dec7face01fcad3eadcc1378e34e663rbowen </dd>
0f6366523dec7face01fcad3eadcc1378e34e663rbowen </dl>
0f6366523dec7face01fcad3eadcc1378e34e663rbowen
43289eb78809cbdec92c7d90433a8852233f0b2brbowen</div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen<div class="section">
43289eb78809cbdec92c7d90433a8852233f0b2brbowen<h2><a name="structuredhomedirs" id="structuredhomedirs">Structured Userdirs</a></h2>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen
43289eb78809cbdec92c7d90433a8852233f0b2brbowen
43289eb78809cbdec92c7d90433a8852233f0b2brbowen
43289eb78809cbdec92c7d90433a8852233f0b2brbowen <dl>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen <dt>Description:</dt>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen
43289eb78809cbdec92c7d90433a8852233f0b2brbowen <dd>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen <p>Some sites with thousands of users use a
43289eb78809cbdec92c7d90433a8852233f0b2brbowen structured homedir layout, <em>i.e.</em> each homedir is in a
43289eb78809cbdec92c7d90433a8852233f0b2brbowen subdirectory which begins (for instance) with the first
43289eb78809cbdec92c7d90433a8852233f0b2brbowen character of the username. So, <code>/~larry/anypath</code>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen is <code>/home/<strong>l</strong>/larry/public_html/anypath</code>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen while <code>/~waldo/anypath</code> is
43289eb78809cbdec92c7d90433a8852233f0b2brbowen <code>/home/<strong>w</strong>/waldo/public_html/anypath</code>.</p>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen </dd>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen
43289eb78809cbdec92c7d90433a8852233f0b2brbowen <dt>Solution:</dt>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen
43289eb78809cbdec92c7d90433a8852233f0b2brbowen <dd>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen <p>We use the following ruleset to expand the tilde URLs
43289eb78809cbdec92c7d90433a8852233f0b2brbowen into the above layout.</p>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen
353e838f5716b394f2f9bf38549e1550a5e73570rbowen<div class="example"><p><code>
353e838f5716b394f2f9bf38549e1550a5e73570rbowenRewriteEngine on<br />
43289eb78809cbdec92c7d90433a8852233f0b2brbowenRewriteRule ^/~(<strong>([a-z])</strong>[a-z0-9]+)(.*) /home/<strong>$2</strong>/$1/public_html$3
353e838f5716b394f2f9bf38549e1550a5e73570rbowen</code></p></div>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen </dd>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen </dl>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen
43289eb78809cbdec92c7d90433a8852233f0b2brbowen</div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen<div class="section">
43289eb78809cbdec92c7d90433a8852233f0b2brbowen<h2><a name="redirectanchors" id="redirectanchors">Redirecting Anchors</a></h2>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen
43289eb78809cbdec92c7d90433a8852233f0b2brbowen
43289eb78809cbdec92c7d90433a8852233f0b2brbowen
43289eb78809cbdec92c7d90433a8852233f0b2brbowen <dl>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen <dt>Description:</dt>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen
43289eb78809cbdec92c7d90433a8852233f0b2brbowen <dd>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen <p>By default, redirecting to an HTML anchor doesn't work,
43289eb78809cbdec92c7d90433a8852233f0b2brbowen because mod_rewrite escapes the <code>#</code> character,
43289eb78809cbdec92c7d90433a8852233f0b2brbowen turning it into <code>%23</code>. This, in turn, breaks the
43289eb78809cbdec92c7d90433a8852233f0b2brbowen redirection.</p>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen </dd>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen
43289eb78809cbdec92c7d90433a8852233f0b2brbowen <dt>Solution:</dt>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen
43289eb78809cbdec92c7d90433a8852233f0b2brbowen <dd>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen <p>Use the <code>[NE]</code> flag on the
43289eb78809cbdec92c7d90433a8852233f0b2brbowen <code>RewriteRule</code>. NE stands for No Escape.
43289eb78809cbdec92c7d90433a8852233f0b2brbowen </p>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen </dd>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen
43289eb78809cbdec92c7d90433a8852233f0b2brbowen <dt>Discussion:</dt>
9a58dc6a2b26ec128b1270cf48810e705f1a90dbsf <dd>This technique will of course also work with other
43289eb78809cbdec92c7d90433a8852233f0b2brbowen special characters that mod_rewrite, by default, URL-encodes.</dd>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen </dl>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen
43289eb78809cbdec92c7d90433a8852233f0b2brbowen</div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen<div class="section">
43289eb78809cbdec92c7d90433a8852233f0b2brbowen<h2><a name="time-dependent" id="time-dependent">Time-Dependent Rewriting</a></h2>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen
43289eb78809cbdec92c7d90433a8852233f0b2brbowen
43289eb78809cbdec92c7d90433a8852233f0b2brbowen
43289eb78809cbdec92c7d90433a8852233f0b2brbowen <dl>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen <dt>Description:</dt>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen
43289eb78809cbdec92c7d90433a8852233f0b2brbowen <dd>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen <p>We wish to use mod_rewrite to serve different content based on
43289eb78809cbdec92c7d90433a8852233f0b2brbowen the time of day.</p>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen </dd>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen
43289eb78809cbdec92c7d90433a8852233f0b2brbowen <dt>Solution:</dt>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen
43289eb78809cbdec92c7d90433a8852233f0b2brbowen <dd>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen <p>There are a lot of variables named <code>TIME_xxx</code>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen for rewrite conditions. In conjunction with the special
43289eb78809cbdec92c7d90433a8852233f0b2brbowen lexicographic comparison patterns <code>&lt;STRING</code>,
43289eb78809cbdec92c7d90433a8852233f0b2brbowen <code>&gt;STRING</code> and <code>=STRING</code> we can
43289eb78809cbdec92c7d90433a8852233f0b2brbowen do time-dependent redirects:</p>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen
353e838f5716b394f2f9bf38549e1550a5e73570rbowen<div class="example"><p><code>
353e838f5716b394f2f9bf38549e1550a5e73570rbowenRewriteEngine on<br />
353e838f5716b394f2f9bf38549e1550a5e73570rbowenRewriteCond %{TIME_HOUR}%{TIME_MIN} &gt;0700<br />
353e838f5716b394f2f9bf38549e1550a5e73570rbowenRewriteCond %{TIME_HOUR}%{TIME_MIN} &lt;1900<br />
353e838f5716b394f2f9bf38549e1550a5e73570rbowenRewriteRule ^foo\.html$ foo.day.html [L]<br />
43289eb78809cbdec92c7d90433a8852233f0b2brbowenRewriteRule ^foo\.html$ foo.night.html
353e838f5716b394f2f9bf38549e1550a5e73570rbowen</code></p></div>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen
43289eb78809cbdec92c7d90433a8852233f0b2brbowen <p>This provides the content of <code>foo.day.html</code>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen under the URL <code>foo.html</code> from
43289eb78809cbdec92c7d90433a8852233f0b2brbowen <code>07:01-18:59</code> and at the remaining time the
43289eb78809cbdec92c7d90433a8852233f0b2brbowen contents of <code>foo.night.html</code>.</p>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen
43289eb78809cbdec92c7d90433a8852233f0b2brbowen <div class="warning"><code class="module"><a href="/mod/mod_cache.html">mod_cache</a></code>, intermediate proxies
43289eb78809cbdec92c7d90433a8852233f0b2brbowen and browsers may each cache responses and cause the either page to be
43289eb78809cbdec92c7d90433a8852233f0b2brbowen shown outside of the time-window configured.
43289eb78809cbdec92c7d90433a8852233f0b2brbowen <code class="module"><a href="/mod/mod_expires.html">mod_expires</a></code> may be used to control this
43289eb78809cbdec92c7d90433a8852233f0b2brbowen effect. You are, of course, much better off simply serving the
43289eb78809cbdec92c7d90433a8852233f0b2brbowen content dynamically, and customizing it based on the time of day.</div>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen
43289eb78809cbdec92c7d90433a8852233f0b2brbowen </dd>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen </dl>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen
43289eb78809cbdec92c7d90433a8852233f0b2brbowen</div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen<div class="section">
43289eb78809cbdec92c7d90433a8852233f0b2brbowen<h2><a name="setenvvars" id="setenvvars">Set Environment Variables Based On URL Parts</a></h2>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen
43289eb78809cbdec92c7d90433a8852233f0b2brbowen
43289eb78809cbdec92c7d90433a8852233f0b2brbowen
43289eb78809cbdec92c7d90433a8852233f0b2brbowen <dl>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen <dt>Description:</dt>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen
43289eb78809cbdec92c7d90433a8852233f0b2brbowen <dd>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen <p>At time, we want to maintain some kind of status when we
43289eb78809cbdec92c7d90433a8852233f0b2brbowen perform a rewrite. For example, you want to make a note that
43289eb78809cbdec92c7d90433a8852233f0b2brbowen you've done that rewrite, so that you can check later to see if a
43289eb78809cbdec92c7d90433a8852233f0b2brbowen request can via that rewrite. One way to do this is by setting an
43289eb78809cbdec92c7d90433a8852233f0b2brbowen environment variable.</p>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen </dd>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen
43289eb78809cbdec92c7d90433a8852233f0b2brbowen <dt>Solution:</dt>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen
43289eb78809cbdec92c7d90433a8852233f0b2brbowen <dd>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen <p>Use the [E] flag to set an environment variable.</p>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen
353e838f5716b394f2f9bf38549e1550a5e73570rbowen<div class="example"><p><code>
353e838f5716b394f2f9bf38549e1550a5e73570rbowenRewriteEngine on<br />
43289eb78809cbdec92c7d90433a8852233f0b2brbowenRewriteRule ^/horse/(.*) /pony/$1 [E=<strong>rewritten:1</strong>]
353e838f5716b394f2f9bf38549e1550a5e73570rbowen</code></p></div>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen
43289eb78809cbdec92c7d90433a8852233f0b2brbowen <p>Later in your ruleset you might check for this environment
43289eb78809cbdec92c7d90433a8852233f0b2brbowen variable using a RewriteCond:</p>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen
353e838f5716b394f2f9bf38549e1550a5e73570rbowen<div class="example"><p><code>
43289eb78809cbdec92c7d90433a8852233f0b2brbowenRewriteCond %{ENV:rewritten} =1
353e838f5716b394f2f9bf38549e1550a5e73570rbowen</code></p></div>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen
53abc235688d883cfa15cdfec354ba03128f357arbowen <p>Note that environment variables do not survive an external
53abc235688d883cfa15cdfec354ba03128f357arbowen redirect. You might consider using the [CO] flag to set a
53abc235688d883cfa15cdfec354ba03128f357arbowen cookie.</p>
53abc235688d883cfa15cdfec354ba03128f357arbowen
43289eb78809cbdec92c7d90433a8852233f0b2brbowen </dd>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen </dl>
43289eb78809cbdec92c7d90433a8852233f0b2brbowen
1525d3506d73644ae695624f16b15cc73cc1c7acrbowen</div></div>
b630661b71a5495a95831a05a6a2299fb1c7c771rbowen<div class="bottomlang">
f086b4b402fa9a2fefc7dda85de2a3cc1cd0a654rjung<p><span>Available Languages: </span><a href="/en/rewrite/avoid.html" title="English">&nbsp;en&nbsp;</a></p>
b630661b71a5495a95831a05a6a2299fb1c7c771rbowen</div><div id="footer">
9c1260efa52c82c2a58e5b5f20cd6902563d95f5rbowen<p class="apache">Copyright 2011 The Apache Software Foundation.<br />Licensed under the <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p>
b630661b71a5495a95831a05a6a2299fb1c7c771rbowen<p class="menu"><a href="/mod/">Modules</a> | <a href="/mod/directives.html">Directives</a> | <a href="/faq/">FAQ</a> | <a href="/glossary.html">Glossary</a> | <a href="/sitemap.html">Sitemap</a></p></div>
b630661b71a5495a95831a05a6a2299fb1c7c771rbowen</body></html>