📄 sections.html
字号:
</FilesMatch>
</code></p></div>
<h3><a name="whichwhen" id="whichwhen">什么情况下用什么</a></h3>
<p>选择使用文件系统容器还是使用网络空间容器其实很简单。当指令应该作用于文件系统时,总是用<code class="directive"><a href="./mod/core.html#directory"><Directory></a></code>或<code class="directive"><a href="./mod/core.html#files"><Files></a></code>;而当指令作用于不存在于文件系统的对象时,就用<code class="directive"><a href="./mod/core.html#location"><Location></a></code>,比如一个由数据库生成的网页。</p>
<p>绝对不要试图用<code class="directive"><a href="./mod/core.html#location"><Location></a></code>去限制对文件系统中的对象的访问,因为许多不同的网络空间路径可能会映射到同一个文件系统目录,从而导致你的访问限制被突破。比如:</p>
<div class="example"><p><code>
<Location /dir/><br />
Order allow,deny<br />
Deny from all<br />
</Location>
</code></p></div>
<p>上述配置对<code>http://yoursite.example.com/dir/</code> 请求的确起作用。但是设想在一个不区分大小写的文件系统中,这个访问限制会被<code>http://yoursite.example.com/DIR/</code> 请求轻易突破。而<code class="directive"><a href="./mod/core.html#directory"><Directory></a></code>指令才会真正作用于对这个位置的任何形式的请求。但是有一个例外,就是Unix文件系统中的符号连接(软连接),符号连接可以使同一个目录出现在文件系统中的多个位置。<code class="directive"><a href="./mod/core.html#directory"><Directory></a></code>指令将不重设路径名而直接追踪符号连接,因此,对于安全要求最高的,应该用<code class="directive"><a href="./mod/core.html#options">Options</a></code>指令禁止对符号连接的追踪。</p>
<p>不要认为使用大小写敏感的文件系统就无所谓了,因为有很多方法可以将不同的网络空间路径映射到同一个文件系统路径,所以,应当尽可能使用文件系统容器。但是也有一个例外,就是把访问限制放在<code><Location /></code>配置段中可以很安全地作用于除了某些特定URL以外的所有URL。</p>
</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
<div class="section">
<h2><a name="virtualhost" id="virtualhost">虚拟主机</a></h2>
<p><code class="directive"><a href="./mod/core.html#virtualhost"><VirtualHost></a></code>容器作用于特定的虚拟主机,为同一个机器上具有不同配置的多个主机提供支持。详见<a href="vhosts/index.html">虚拟主机文档</a>。</p>
</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
<div class="section">
<h2><a name="proxy" id="proxy">代理</a></h2>
<p><code class="directive"><a href="./mod/mod_proxy.html#proxy"><Proxy></a></code>和<code class="directive"><a href="./mod/mod_proxy.html#proxymatch"><ProxyMatch></a></code>容器中的指令仅作用于通过<code class="module"><a href="./mod/mod_proxy.html">mod_proxy</a></code>代理服务器访问的、与指定URL匹配的站点。下例中的配置会拒绝通过代理服务器访问<code>cnn.com</code>站点。</p>
<div class="example"><p><code>
<Proxy http://cnn.com/*><br />
Order allow,deny<br />
Deny from all<br />
</Proxy>
</code></p></div>
</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
<div class="section">
<h2><a name="whatwhere" id="whatwhere">允许使用哪些指令?</a></h2>
<p>查阅指令的<a href="mod/directive-dict.html#Context">作用域</a>,就可以知道哪些指令可以出现在哪些配置段中。从语法上看,允许在<code class="directive"><a href="./mod/core.html#directory"><Directory></a></code>段中使用的指令当然也可以在<code class="directive"><a href="./mod/core.html#directorymatch"><DirectoryMatch></a></code>、<code class="directive"><a href="./mod/core.html#files"><Files></a></code>、<code class="directive"><a href="./mod/core.html#filesmatch"><FilesMatch></a></code>、<code class="directive"><a href="./mod/core.html#location"><Location></a></code>、<code class="directive"><a href="./mod/core.html#locationmatch"><LocationMatch></a></code>、<code class="directive"><a href="./mod/mod_proxy.html#proxy"><Proxy></a></code>、<code class="directive"><a href="./mod/mod_proxy.html#proxymatch"><ProxyMatch></a></code>段中使用,但也有例外:</p>
<ul>
<li><code class="directive"><a href="./mod/core.html#allowoverride">AllowOverride</a></code>指令只能出现在<code class="directive"><a href="./mod/core.html#directory"><Directory></a></code>段中。</li>
<li><code class="directive"><a href="./mod/core.html#options">Options</a></code>中的<code>FollowSymLinks</code>和<code>SymLinksIfOwnerMatch</code>只能出现在<code class="directive"><a href="./mod/core.html#directory"><Directory></a></code> 段或者<code>.htaccess</code>文件中。</li>
<li><code class="directive"><a href="./mod/core.html#options">Options</a></code>指令不能用于<code class="directive"><a href="./mod/core.html#files"><Files></a></code>和<code class="directive"><a href="./mod/core.html#filesmatch"><FilesMatch></a></code>段。</li>
</ul>
</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
<div class="section">
<h2><a name="mergin" id="mergin">配置段的合并</a></h2>
<p>配置段会按非常特别的顺序依次生效,由于这会对配置指令的处理结果产生重大影响,因此理解它的流程非常重要。</p>
<p>合并的顺序是:</p>
<ol>
<li><code class="directive"><a href="./mod/core.html#directory"><Directory></a></code>(除了正则表达式)和<code>.htaccess</code>同时处理;(如果允许的话,<code>.htaccess</code>的设置会覆盖<code class="directive"><a href="./mod/core.html#directory"><Directory></a></code>的设置)</li>
<li><code class="directive"><a href="./mod/core.html#directorymatch"><DirectoryMatch></a></code>(和<code><Directory ~></code>)</li>
<li><code class="directive"><a href="./mod/core.html#files"><Files></a></code>和<code class="directive"><a href="./mod/core.html#filesmatch"><FilesMatch></a></code>同时处理</li>
<li><code class="directive"><a href="./mod/core.html#location"><Location></a></code>和<code class="directive"><a href="./mod/core.html#locationmatch"><LocationMatch></a></code>同时处理</li>
</ol>
<p>除了<code class="directive"><a href="./mod/core.html#directory"><Directory></a></code>,每个组都按它们在配置文件中出现的顺序被依次处理,而<code class="directive"><a href="./mod/core.html#directory"><Directory></a></code>(上面的第1组),会按字典顺序由短到长被依次处理。例如:<code><Directory /var/web/dir></code>会先于<code><Directory /var/web/dir/subdir></code>被处理。如果有多个指向同一个目录的<code class="directive"><a href="./mod/core.html#directory"><Directory></a></code>段,则按它们在配置文件中的顺序被依次处理。用<code class="directive"><a href="./mod/core.html#include">Include</a></code>指令包含进来的配置被视为按原样插入到<code class="directive"><a href="./mod/core.html#include">Include</a></code>指令的位置。</p>
<p>位于<code class="directive"><a href="./mod/core.html#virtualhost"><VirtualHost></a></code>容器中的配置段在外部对应的段处理完毕<em>以后</em>再处理,这样就允许虚拟主机覆盖主服务器的设置。</p>
<p>当请求是由<code class="module"><a href="./mod/mod_proxy.html">mod_proxy</a></code>处理的时候,<code class="directive"><a href="./mod/mod_proxy.html#proxy"><Proxy></a></code>容器将会在处理顺序中取代<code class="directive"><a href="./mod/core.html#directory"><Directory></a></code>容器的位置。</p>
<p>后面的段覆盖前面的相应的段。</p>
<div class="note"><h3>技术说明</h3>
其实,在名称翻译阶段(即用<code>Aliases</code>和<code>DocumentRoots</code>来映射URL到文件系统)之前,会有一个<code><Location></code>/<code><LocationMatch></code>的序列被处理,而在名称翻译结束后,这个序列的处理结果则被完全抛弃。
</div>
<h3><a name="merge-examples" id="merge-examples">一些例子</a></h3>
<p>这是一个演示合并顺序的例子。如果这些指令都起作用,则会按 A > B > C > D >E 的顺序依次生效。</p>
<div class="example"><p><code>
<Location /><br />
E<br />
</Location><br />
<br />
<Files f.html><br />
D<br />
</Files><br />
<br />
<VirtualHost *><br />
<Directory /a/b><br />
B<br />
</Directory><br />
</VirtualHost><br />
<br />
<DirectoryMatch "^.*b$"><br />
C<br />
</DirectoryMatch><br />
<br />
<Directory /a/b><br />
A<br />
</Directory><br />
<br />
</code></p></div>
<p>在下面这个更具体的例子中,无论在<code class="directive"><a href="./mod/core.html#directory"><Directory></a></code>段中加了多少访问限制,由于<code class="directive"><a href="./mod/core.html#location"><Location></a></code>段将会被最后处理,从而会允许不加限制的对服务器的访问,可见合并的顺序是很重要的,千万小心!</p>
<div class="example"><p><code>
<Location /><br />
Order deny,allow<br />
Allow from all<br />
</Location><br />
<br />
# 这个<Directory>段将不会实际生效<br />
<Directory /><br />
Order allow,deny<br />
Allow from all<br />
Deny from badguy.example.com<br />
</Directory>
</code></p></div>
</div></div>
<div id="footer">
<p class="apache">本文允许自由使用、分发、转载,但必须保留译者署名;详见:<a href="./translator_announcement.html#announcement">译者声明</a>。</p>
<p class="menu"><a href="./mod/index.html">模块索引</a> | <a href="./mod/directives.html">指令索引</a> | <a href="./faq/index.html">常见问题</a> | <a href="./glossary.html">词汇表</a> | <a href="./sitemap.html">站点导航</a></p></div>
</body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -