📄 rewrite_guide_advanced.html.en
字号:
$bytes = sysread(FP, $buffer, $size); close(FP); return $buffer;}$buffer = &readfile($QS_f);&print_http_headers_multipart_begin;&displayhtml($buffer);sub mystat { local($file) = $_[0]; local($time); ($x, $x, $x, $x, $x, $x, $x, $x, $x, $mtime) = stat($file); return $mtime;}$mtimeL = &mystat($QS_f);$mtime = $mtime;for ($n = 0; $n &lt; $QS_n; $n++) { while (1) { $mtime = &mystat($QS_f); if ($mtime ne $mtimeL) { $mtimeL = $mtime; sleep(2); $buffer = &readfile($QS_f); &print_http_headers_multipart_next; &displayhtml($buffer); sleep(5); $mtimeL = &mystat($QS_f); last; } sleep($QS_s); }}&print_http_headers_multipart_end;exit(0);##EOF##</pre></div> </dd> </dl> <h3>Mass Virtual Hosting</h3> <dl> <dt>Description:</dt> <dd> <p>The <code class="directive"><a href="../mod/core.html#virtualhost"><VirtualHost></a></code> feature of Apache is nice and works great when you just have a few dozens virtual hosts. But when you are an ISP and have hundreds of virtual hosts to provide this feature is not the best choice.</p> </dd> <dt>Solution:</dt> <dd> <p>To provide this feature we map the remote webpage or even the complete remote webarea to our namespace by the use of the <dfn>Proxy Throughput</dfn> feature (flag <code>[P]</code>):</p><div class="example"><pre>#### vhost.map##www.vhost1.dom:80 /path/to/docroot/vhost1www.vhost2.dom:80 /path/to/docroot/vhost2 :www.vhostN.dom:80 /path/to/docroot/vhostN</pre></div><div class="example"><pre>#### httpd.conf## :# use the canonical hostname on redirects, etc.UseCanonicalName on :# add the virtual host in front of the CLF-formatCustomLog /path/to/access_log "%{VHOST}e %h %l %u %t \"%r\" %>s %b" :# enable the rewriting engine in the main serverRewriteEngine on# define two maps: one for fixing the URL and one which defines# the available virtual hosts with their corresponding# DocumentRoot.RewriteMap lowercase int:tolowerRewriteMap vhost txt:/path/to/vhost.map# Now do the actual virtual host mapping# via a huge and complicated single rule:## 1. make sure we don't map for common locationsRewriteCond %{REQUEST_URI} !^/commonurl1/.*RewriteCond %{REQUEST_URI} !^/commonurl2/.* :RewriteCond %{REQUEST_URI} !^/commonurlN/.*## 2. make sure we have a Host header, because# currently our approach only supports# virtual hosting through this headerRewriteCond %{HTTP_HOST} !^$## 3. lowercase the hostnameRewriteCond ${lowercase:%{HTTP_HOST}|NONE} ^(.+)$## 4. lookup this hostname in vhost.map and# remember it only when it is a path# (and not "NONE" from above)RewriteCond ${vhost:%1} ^(/.*)$## 5. finally we can map the URL to its docroot location# and remember the virtual host for logging puposesRewriteRule ^/(.*)$ %1/$1 [E=VHOST:${lowercase:%{HTTP_HOST}}] :</pre></div> </dd> </dl> </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div><div class="section"><h2><a name="access" id="access">Access Restriction</a></h2> <h3>Host Deny</h3> <dl> <dt>Description:</dt> <dd> <p>How can we forbid a list of externally configured hosts from using our server?</p> </dd> <dt>Solution:</dt> <dd> <p>For Apache >= 1.3b6:</p><div class="example"><pre>RewriteEngine onRewriteMap hosts-deny txt:/path/to/hosts.denyRewriteCond ${hosts-deny:%{REMOTE_HOST}|NOT-FOUND} !=NOT-FOUND [OR]RewriteCond ${hosts-deny:%{REMOTE_ADDR}|NOT-FOUND} !=NOT-FOUNDRewriteRule ^/.* - [F]</pre></div> <p>For Apache <= 1.3b6:</p><div class="example"><pre>RewriteEngine onRewriteMap hosts-deny txt:/path/to/hosts.denyRewriteRule ^/(.*)$ ${hosts-deny:%{REMOTE_HOST}|NOT-FOUND}/$1RewriteRule !^NOT-FOUND/.* - [F]RewriteRule ^NOT-FOUND/(.*)$ ${hosts-deny:%{REMOTE_ADDR}|NOT-FOUND}/$1RewriteRule !^NOT-FOUND/.* - [F]RewriteRule ^NOT-FOUND/(.*)$ /$1</pre></div><div class="example"><pre>#### hosts.deny#### ATTENTION! This is a map, not a list, even when we treat it as such.## mod_rewrite parses it for key/value pairs, so at least a## dummy value "-" must be present for each entry.##193.102.180.41 -bsdti1.sdm.de -192.76.162.40 -</pre></div> </dd> </dl> <h3>Proxy Deny</h3> <dl> <dt>Description:</dt> <dd> <p>How can we forbid a certain host or even a user of a special host from using the Apache proxy?</p> </dd> <dt>Solution:</dt> <dd> <p>We first have to make sure <code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code> is below(!) <code class="module"><a href="../mod/mod_proxy.html">mod_proxy</a></code> in the Configuration file when compiling the Apache webserver. This way it gets called <em>before</em> <code class="module"><a href="../mod/mod_proxy.html">mod_proxy</a></code>. Then we configure the following for a host-dependent deny...</p><div class="example"><pre>RewriteCond %{REMOTE_HOST} <strong>^badhost\.mydomain\.com$</strong>RewriteRule !^http://[^/.]\.mydomain.com.* - [F]</pre></div> <p>...and this one for a user@host-dependent deny:</p><div class="example"><pre>RewriteCond %{REMOTE_IDENT}@%{REMOTE_HOST} <strong>^badguy@badhost\.mydomain\.com$</strong>RewriteRule !^http://[^/.]\.mydomain.com.* - [F]</pre></div> </dd> </dl> <h3>Special Authentication Variant</h3> <dl> <dt>Description:</dt> <dd> <p>Sometimes a very special authentication is needed, for instance a authentication which checks for a set of explicitly configured users. Only these should receive access and without explicit prompting (which would occur when using the Basic Auth via <code class="module"><a href="../mod/mod_auth.html">mod_auth</a></code>).</p> </dd> <dt>Solution:</dt> <dd> <p>We use a list of rewrite conditions to exclude all except our friends:</p><div class="example"><pre>RewriteCond %{REMOTE_IDENT}@%{REMOTE_HOST} <strong>!^friend1@client1.quux-corp\.com$</strong>RewriteCond %{REMOTE_IDENT}@%{REMOTE_HOST} <strong>!^friend2</strong>@client2.quux-corp\.com$RewriteCond %{REMOTE_IDENT}@%{REMOTE_HOST} <strong>!^friend3</strong>@client3.quux-corp\.com$RewriteRule ^/~quux/only-for-friends/ - [F]</pre></div> </dd> </dl> <h3>Referer-based Deflector</h3> <dl> <dt>Description:</dt> <dd> <p>How can we program a flexible URL Deflector which acts on the "Referer" HTTP header and can be configured with as many referring pages as we like?</p> </dd> <dt>Solution:</dt> <dd> <p>Use the following really tricky ruleset...</p><div class="example"><pre>RewriteMap deflector txt:/path/to/deflector.mapRewriteCond %{HTTP_REFERER} !=""RewriteCond ${deflector:%{HTTP_REFERER}} ^-$RewriteRule ^.* %{HTTP_REFERER} [R,L]RewriteCond %{HTTP_REFERER} !=""RewriteCond ${deflector:%{HTTP_REFERER}|NOT-FOUND} !=NOT-FOUNDRewriteRule ^.* ${deflector:%{HTTP_REFERER}} [R,L]</pre></div> <p>... in conjunction with a corresponding rewrite map:</p><div class="example"><pre>#### deflector.map##http://www.badguys.com/bad/index.html -http://www.badguys.com/bad/index2.html -http://www.badguys.com/bad/index3.html http://somewhere.com/</pre></div> <p>This automatically redirects the request back to the referring page (when "<code>-</code>" is used as the value in the map) or to a specific URL (when an URL is specified in the map as the second argument).</p> </dd> </dl> </div></div><div class="bottomlang"><p><span>Available Languages: </span><a href="../en/rewrite/rewrite_guide_advanced.html" title="English"> en </a></p></div><div id="footer"><p class="apache">Copyright 2007 The Apache Software Foundation.<br />Licensed under the <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p><p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/directives.html">Directives</a> | <a href="../faq/">FAQ</a> | <a href="../glossary.html">Glossary</a> | <a href="../sitemap.html">Sitemap</a></p></div></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -