拒绝所有请求,除非请求实际上是一个子请求

Deny from all except when the request is actually a sub-request

我正在使用 PHP 的 virtual() function to perform a sub-request to Apache, in order initiate a file download (the files can be heavy, so I can't use readfile())。有问题的文件存储在非 public 目录中,因为在允许下载之前需要检查用户的权限。

我的项目结构如下:

project/
    .htaccess     -----> rewrite everything to index.php
    index.php     -----> framework + application logic + permissions check
    private/
        .htaccess -----> deny from all
        ...       -----> private files

我遇到的第一个问题是 virtual() 生成的子请求被第一个 .htaccess 重写,所以下载一直没有开始。这很容易修复,因为有一个 [NS] (no sub-request) 重写标志允许在这种情况下不重写 URL:

...
RewriteRule ^ index.php [NS]
...

但我仍然无法让它工作,因为另一个 .htaccess(拒绝所有),它只是拒绝所有请求和子请求。

问题:有什么方法可以配置 .htaccess 以拒绝所有人的访问,除非请求实际上是来自服务器本身的子请求?

首先,一个很有意思的问题。必须深入挖掘才能弄明白。

您可以在这里使用apache_setenv函数。

virtual 调用之前有此 PHP 代码:

apache_setenv('internal', '1');  // sets an Apache var with name internal
virtual ( "/private/file.txt" ); // example sub request
exit;

现在 /private/.htaccess 里面有这个片段:

Order deny,allow
Deny from  all
Allow from env=internal

这将拒绝 所有请求,除非 env 变量 internal 设置为 1。该内部变量仅在您的 PHP 代码中设置,因此仅允许子请求,所有其他请求都将被拒绝。