⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rewriteguide.html

📁 这个是我在web培训时老师提供的手册
💻 HTML
📖 第 1 页 / 共 5 页
字号:

          <p>第一条规则是针对遗漏后缀斜杠的请求的!第二条规则才是真正实现功能的。接着,就是放在针对目录的配置文件/e/netsw/.www/.wwwacl中的杀手级的配置了:</p>

<div class="example">
  <pre>
Options       ExecCGI FollowSymLinks Includes MultiViews

RewriteEngine on

# 我们通过"/net.sw/"前缀到达
RewriteBase   /net.sw/

# 首先重写根目录到cgi处理脚本
RewriteRule   ^$                       netsw-home.cgi     [L]
RewriteRule   ^index\.html$            netsw-home.cgi     [L]

#  当浏览器请求perdir页面时剥去子目录
RewriteRule   ^.+/(netsw-[^/]+/.+)$    $1                 [L]

# 现在打断本地文件的重写
RewriteRule   ^netsw-home\.cgi.*       -                  [L]
RewriteRule   ^netsw-changes\.cgi.*    -                  [L]
RewriteRule   ^netsw-search\.cgi.*     -                  [L]
RewriteRule   ^netsw-tree\.cgi$        -                  [L]
RewriteRule   ^netsw-about\.html$      -                  [L]
RewriteRule   ^netsw-img/.*$           -                  [L]

# 任何别的东西都是一个由另一个cgi脚本处理的子目录
RewriteRule   !^netsw-lsdir\.cgi.*     -                  [C]
RewriteRule   (.*)                     netsw-lsdir.cgi/$1
</pre>
</div>

          <p>阅读提示:</p>

          <ol>
            <li>注意前半部分中的标志L(最后),和无对应项(&quot;-&quot;)</li>

            <li>注意后半部分中的符号!(非),和标志C(链)</li>

            <li>注意最后一条规则的全匹配模式</li>
          </ol>
        </dd>
      </dl>

    

    <h3>NCSA图像映射和<code>mod_imap</code></h3>

      

      <dl>
        <dt>说明:</dt>

        <dd>
          <p>许多人都希望在从NCSA web服务器向较现代的Apache web服务器转移中实现平滑过渡,即希望老的NCSA图像映射程序能在Apache的较现代的<code class="module"><a href="../mod/mod_imap.html">mod_imap</a></code>支持下正常运作。但问题在于,到处都是通过/cgi-bin/imagemap/path/to/page.map引用imagemap程序的连接,而在Apache下,应该写成/path/to/page.map</p>
        </dd>

        <dt>方案:</dt>

        <dd>
          <p>使用全局规则在传输过程中去除所有这些请求的前缀:</p>

<div class="example"><pre>
RewriteEngine  on
RewriteRule    ^/cgi-bin/imagemap(.*)  $1  [PT]
</pre></div>
        </dd>
      </dl>

    

    <h3>在多个目录中搜索页面</h3>

      

      <dl>
        <dt>说明:</dt>

        <dd>
          <p>有时会有必要使web服务器在多个目录中搜索页面,对此,MultiViews或者其他技术无能为力。</p>
        </dd>

        <dt>方案:</dt>

        <dd>
          <p>编制一个明确的规则集以搜索目录中的文件。</p>

<div class="example"><pre>
RewriteEngine on

# 首先尝试在 custom/...中寻找
RewriteCond         /your/docroot/<strong>dir1</strong>/%{REQUEST_FILENAME}  -f
RewriteRule  ^(.+)  /your/docroot/<strong>dir1</strong>/$1  [L]

# 然后尝试在 pub/...中寻找
RewriteCond         /your/docroot/<strong>dir2</strong>/%{REQUEST_FILENAME}  -f
RewriteRule  ^(.+)  /your/docroot/<strong>dir2</strong>/$1  [L]

# 再找不到就继续寻找其他的Alias 或 ScriptAlias 目录...
RewriteRule   ^(.+)  -  [PT]
</pre></div>
        </dd>
      </dl>

    

    <h3>按照URL的片段设置环境变量</h3>

      

      <dl>
        <dt>说明:</dt>

        <dd>
          <p>如果希望保持请求之间的状态信息,又不希望使用CGI来包装所有页面,而是只通过分离URL中的有用信息来编码。</p>
        </dd>

        <dt>方案:</dt>

        <dd>
          <p>可以用一个规则集来分离出状态信息,并设置环境变量以备此后用于XSSI或CGI 。这样,一个&quot;/foo/S=java/bar/&quot;的URL会被解析为/foo/bar/ ,而环境变量STATUS则被设置为&quot;java&quot;。</p>

			<div class="example"><pre>
RewriteEngine on
RewriteRule   ^(.*)/<strong>S=([^/]+)</strong>/(.*)    $1/$3 [E=<strong>STATUS:$2</strong>]
</pre></div>
        </dd>
      </dl>

    

    <h3>虚拟用户主机</h3>

      

      <dl>
        <dt>说明:</dt>

        <dd>
          <p>如果需要为用户<strong>username</strong>支持一个www.<strong>username</strong>.host.domain.com的主页,但不是用在此机器上建虚拟主机的方法,而是用仅在此机器上增加一个DNS记录的方法实现。</p>
        </dd>

        <dt>方案:</dt>

        <dd>
          <p>对HTTP/1.0的请求,这是无法实现的;但是对HTTP/1.1的在HTTP头中包含有主机名的请求,可以用以下规则集来内部地重写http://www.username.host.com/anypath为/home/username/anypath</p>

<div class="example"><pre>
RewriteEngine on
RewriteCond   %{<strong>HTTP_HOST</strong>}                 ^www\.<strong>[^.]+</strong>\.host\.com$
RewriteRule   ^(.+)                        %{HTTP_HOST}$1          [C]
RewriteRule   ^www\.<strong>([^.]+)</strong>\.host\.com(.*) /home/<strong>$1</strong>$2
</pre></div>
        </dd>
      </dl>

    

    <h3>为外来访问者重定向用户主目录</h3>

      

      <dl>
        <dt>说明:</dt>

        <dd>
          <p>对不是来自本地域ourdomain.com的外来访问者的请求,重定向其用户主目录URL到另一个web服务器www.somewhere.com ,有时这种做法也会用在虚拟主机的配置段中。</p>
        </dd>

        <dt>方案:</dt>

        <dd>
          <p>只须一个重写条件:</p>

<div class="example"><pre>
RewriteEngine on
RewriteCond   %{REMOTE_HOST}  <strong>!^.+\.ourdomain\.com$</strong>
RewriteRule   ^(/~.+)         http://www.somewhere.com/$1 [R,L]
</pre></div>
        </dd>
      </dl>

    

    <h3>重定向失败的URL到其他web服务器</h3>

      

      <dl>
        <dt>说明:</dt>

        <dd>
          <p>如何重写URL以重定向对web服务器A的失败请求到服务器B,是一个常见的问题。一般,可以用Perl写的CGI脚本通过<code class="directive"><a href="../mod/core.html#errordocument">ErrorDocument</a></code>来解决,此外,还有<code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code>方案。但是须注意,这种方法的执行效率不如用<code class="directive"><a href="../mod/core.html#errordocument">ErrorDocument</a></code>的CGI脚本!</p>
        </dd>

        <dt>方案:</dt>

        <dd>
          <p>第一种方案,有最好的性能而灵活性欠佳,出错概率小所以安全:</p>

<div class="example"><pre>
RewriteEngine on
RewriteCond   /your/docroot/%{REQUEST_FILENAME} <strong>!-f</strong>
RewriteRule   ^(.+)                             http://<strong>webserverB</strong>.dom/$1
</pre></div>

          <p>但是其问题在于,它只对位于<code class="directive"><a href="../mod/core.html#documentroot">DocumentRoot</a></code>中的页面有效。虽然可以增加更多的条件(比如同时还处理用户主目录,等等),但是还有一个更好的方法:</p>

<div class="example"><pre>
RewriteEngine on
RewriteCond   %{REQUEST_URI} <strong>!-U</strong>
RewriteRule   ^(.+)          http://<strong>webserverB</strong>.dom/$1
</pre></div>

          <p>这种方法使用了<code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code>提供的&quot;向前参照&quot;(look-ahead)的功能,是一种对所有URL类型都有效而且安全的方法。但是,对web服务器的性能会有影响,所以如果web服务器有一个强大的CPU,那就用这个方法。而在慢速机器上,可以用第一种方法,或者用性能更好的<code class="directive"><a href="../mod/core.html#errordocument">ErrorDocument</a></code>CGI脚本。</p>
        </dd>
      </dl>

    

    <h3>扩展的重定向</h3>

      

      <dl>
        <dt>说明:</dt>

        <dd>
          <p>有时候,我们会需要更多的对重定向URL的(有关字符转义机制方面的)控制。通常,Apache内核中的URL转义函数uri_escape()同时还会对锚(anchor)转义,即类似&quot;url#anchor&quot;的URL,因此,你不能用<code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code>对此类URL直接重定向。那么如何实现呢?</p>
        </dd>

        <dt>方案:</dt>

        <dd>
          <p>必须用NPH-CGI脚本使它自己重定向,因为对NPH(无须解析的HTTP头)不会发生转义操作。首先,在针对服务器的配置中(应该位于所有重写规则的最后),引入一种新的URL类型&quot;xredirect:&quot;:</p>

<div class="example"><pre>
RewriteRule ^xredirect:(.+) /path/to/nph-xredirect.cgi/$1 \
            [T=application/x-httpd-cgi,L]
</pre></div>

          <p>以强制所有带&quot;xredirect:&quot;前缀的URL被传送到如下的nph-xredirect.cgi程序:</p>

<div class="example"><pre>
#!/path/to/perl
##
##  nph-xredirect.cgi -- NPH/CGI script for extended redirects

##

$| = 1;
$url = $ENV{'PATH_INFO'};

print "HTTP/1.0 302 Moved Temporarily\n";
print "Server: $ENV{'SERVER_SOFTWARE'}\n";
print "Location: $url\n";
print "Content-type: text/html\n";
print "\n";
print "&lt;html&gt;\n";
print "&lt;head&gt;\n";
print "&lt;title&gt;302 Moved Temporarily (EXTENDED)&lt;/title&gt;\n";
print "&lt;/head&gt;\n";
print "&lt;body&gt;\n";
print "&lt;h1&gt;Moved Temporarily (EXTENDED)&lt;/h1&gt;\n";
print "The document has moved &lt;a HREF=\"$url\"&gt;here&lt;/a&gt;.&lt;p&gt;\n";
print "&lt;/body&gt;\n";
print "&lt;/html&gt;\n";

##EOF##
</pre></div>

          <p>这是一种可以重定向所有URL类型的方法,包括不被<code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code>直接支持的类型。所以,还可以这样重定向&quot;news:newsgroup&quot;:</p>

<div class="example"><pre>
RewriteRule ^anyurl  xredirect:news:newsgroup
</pre></div>

          <div class="note">注意:无须对上述规则加[R]或[R,L],因为&quot;xredirect:&quot;需要在稍后被其特殊的&quot;管道传送&quot;规则扩展。</div>
        </dd>
      </dl>

    

    <h3>文档访问的多路复用</h3>

      

      <dl>
        <dt>说明:</dt>

        <dd>
          <p>你知道<a href="http://www.perl.com/CPAN">http://www.perl.com/CPAN</a>的CPAN(综合Perl存档网络)?它实现了一个重定向以提供全世界的CPAN镜像中离访问者最近的一个FTP站点,也可以称之为FTP访问多路复用服务。CPAN是通过CGI脚本实现的,那么用<code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code>如何实现呢?</p>
        </dd>

        <dt>方案:</dt>

        <dd>
          <p>首先,我们注意到<code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code>从3.0.0版本开始,还可以重写&quot;ftp:&quot;类型。其次,对客户端顶级域名的路径最近的求取可以用<code class="directive"><a href="../mod/mod_rewrite.html#rewritemap">RewriteMap</a></code>实现。利用链式规则集,并用顶级域名作为查找多路复用地图的键,可以这样做:</p>

<div class="example"><pre>
RewriteEngine on
RewriteMap    multiplex                txt:/path/to/map.cxan
RewriteRule   ^/CxAN/(.*)              %{REMOTE_HOST}::$1                 [C]
RewriteRule   ^.+\.<strong>([a-zA-Z]+)</strong>::(.*)$  ${multiplex:<strong>$1</strong>|ftp.default.dom}$2  [R,L]
</pre></div>

<div class="example"><pre>
##
##  map.cxan -- Multiplexing Map for CxAN
##

de        ftp://ftp.cxan.de/CxAN/
uk        ftp://ftp.cxan.uk/CxAN/
com       ftp://ftp.cxan.com/CxAN/
 :
##EOF##
</pre></div>
        </dd>
      </dl>

    

    <h3>依赖于时间的重写</h3>

      

      <dl>
        <dt>说明:</dt>

        <dd>
          <p>在页面内容按时间不同而变化的场合,比如重定向特定页面,许多网管仍然采用CGI脚本的方法,如何用<code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code>来实现呢?</p>
        </dd>

        <dt>方案:</dt>

        <dd>
          <p>有许多类似TIME_xxx的变量可以用在重写条件中,利用&quot;&lt;STRING&quot;, &quot; &gt;STRING&quot;和&quot;=STRING&quot;的类型比较,并加以连接,就可以实现依赖于时间的重写:</p>

			<div class="example"><pre>
RewriteEngine on
RewriteCond   %{TIME_HOUR}%{TIME_MIN} &gt;0700
RewriteCond   %{TIME_HOUR}%{TIME_MIN} &lt;1900

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -