我认为解释这些部分如何协同工作将有助于消除混乱。
一个请求进来(来自用户的网络浏览器)。您的 Web 服务器(在本例中为 Apache)接收此信息。首先,它检查<Location>
权限。然后它查看配置的其余部分,并最终将请求 URI 映射到文件系统。现在,最后,它可以检查<Directory>
权限以及.htaccess
.
如果这些权限检查中的任何一个失败(例如,deny from all
),Apache 将停止处理请求,并返回一个错误(或在 HTTP 基本身份验证的情况下请求用户名和密码)。
一旦所有权限检查通过,Apache 就会查看该文件,并注意到它是一个.php
文件。在您(或您的网络主机)的 Apache 配置中,有一个AddHandler
指令告诉 Apache 将此请求传递给 PHP 引擎(可以是 mod_php,或通过快速 cgi)。(对于大多数文件,它会将文件的内容发送到浏览器。但脚本文件是特殊的,因此AddHandler
。)
现在,PHP 读取您的脚本文件。然后它还直接读取您的包含文件。这不会通过 Apache 返回,因此.htaccess
不适用。这也意味着您的 PHP 包含不需要在您的文档根目录中。它们可以是 PHP 进程可以访问的任何地方(基于 UNIX 权限和 PHP 配置)。在 php.ini 中设置 include_dir 可以很容易地将它们放在任何地方。
客户端 JavaScript 由用户的浏览器运行。它不是在服务器端解释的(就像 PHP 一样)。所以用户必须能够访问它,就像用户必须能够访问您的 .html 文件一样。
所以,简而言之:
- 您可以在 PHP 包含目录中放置一个
.htaccess
with Deny from all
。PHP 的include
指令不通过 Apache,所以它不会在意。理想情况下,您甚至根本不将 PHP 包含目录放在文档根目录下。
- 您不能对 JavaScript 执行此操作,因为 JavaScript 访问通过 Apache(就像 .html、.png 等访问一样)。