.htaccess CakePHP:如何允许公众访问/webroot以外目录中的文件

.htaccess CakePHP:如何允许公众访问/webroot以外目录中的文件,.htaccess,cakephp,cakephp-2.0,.htaccess,Cakephp,Cakephp 2.0,我希望能够通过apache像这样打开位于/app/somefile/file.pdf文件夹中的pdfhttp://mysite/app/somefile.file.pdf。我已尝试在CakePHP的.htaccess文件中添加RewriteCond: RewriteCond %{REQUEST_URI} !^/app/somefolder/ - [L] 但只要得到一个500的错误。我做错了什么?您可以使用Apache公开访问该目录的内容: Alias /app/somefile /app/we

我希望能够通过apache像这样打开位于
/app/somefile/file.pdf
文件夹中的pdfhttp://mysite/app/somefile.file.pdf。我已尝试在CakePHP的.htaccess文件中添加RewriteCond:

RewriteCond %{REQUEST_URI} !^/app/somefolder/ - [L]
但只要得到一个500的错误。我做错了什么?

您可以使用Apache公开访问该目录的内容:

Alias /app/somefile /app/webroot/somefile
将上述代码放在服务器/虚拟主机配置文件中,而不是.htaccess


确保web服务器用户具有该目录的读取权限。

尽管您的apache配置可能被允许或不被允许遵循该目录,但您只需将其添加到根目录中的.htaccess文件中即可

RewriteCond%{REQUEST\u URI}^/app/somefolder/

(我的原始版本有一个不正确的
[L]
,这就是它不起作用的原因。)


以防有人还不知道:这通常不是一件安全的事情。我这样做有非常具体的原因。

在您的控制器中使用此选项,并使用路由以您想要的方式访问它,为世界打开其他文件夹不是一个好主意

发送文件

有时,您希望发送文件作为对请求的响应。在版本2.3之前,您可以使用来实现这一点。从2.3开始,MediaView已被弃用,您可以使用
CakerResponse::file()
将文件作为响应发送:

public function sendFile($id) {
    $file = $this->Attachment->getFile($id);
    $this->response->file($file['path']);
    //Return reponse object to prevent controller from trying to render a view
    return $this->response;
`enter code here`}
如上面的示例所示,您必须将文件路径传递给该方法。如果是CakeReponse:$\u mimeTypes中列出的已知文件类型,CakePHP将发送正确的内容类型头。通过使用
CakeResponse::type()
方法,可以在调用
CakeResponse::file()
之前添加新类型

如果需要,还可以通过指定以下选项强制下载文件,而不是在浏览器中显示:

$this->response->file($file['path'], array('download' => true, 'name' => 'foo'));

来源:

允许公众访问webroot以外的目录不是一个好主意。它不安全。您可以使用控制器操作从任何位置下载文件。