拒绝所有请求,除非请求实际上是一个子请求
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 代码中设置,因此仅允许子请求,所有其他请求都将被拒绝。
我正在使用 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 代码中设置,因此仅允许子请求,所有其他请求都将被拒绝。