如何使用PHP 5.4 Web Server允许公共或私人下载静态文件?

时间:2013-09-08 13:31:02

标签: php apache symfony silex php-5.4

我正在使用Silex / Symfony 2框架。用户可以上传私有(web/assets/uploads/*.*)和公共文档(app/uploads/*.*),上传的文件将移动到具有已清理名称的右侧文件夹,并在upload表中创建新记录

+-app/
| +-.htaccess                 <-- Deny from all
| +-uploads/                  <-- private upload folder
|   +-private_upload.pdf      <-- private document
+-web/
  +-index.php                 <-- front controller
  +-assets/
  | +-img/
  | +-css/
  | +-js/
  | +-uploads/                <-- public upload folder
        +-public_document.pdf <-- public document

像图像和css上传这样的资产应该照常提供,即直接链接到文件名:

<img src="/web/assets/img/logo.png" />

Apache配置构想(生产环境)

私人或公共上传文件夹中的文件应使用控制器提供,以获取已清理的名称和检查权限。

现在所有请求(对于不存在的文件)都通过前端控制器index.php

<IfModule mod_rewrite.c>
    Options -MultiViews

    RewriteEngine On
    RewriteBase /web
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [QSA,L]
</IfModule>

使用app/*文件拒绝.htaccess的请求。这是正确和安全的吗?

PHP 5.4 Web服务器问题(开发环境)

在我的index.php我有以下代码:

$filename = __DIR__.preg_replace('#(\?.*)$#', '', $_SERVER['REQUEST_URI']);

if (php_sapi_name() === 'cli-server' && is_file($filename)) {
    return false;
}

如果请求是针对文件名并且(文件实际存在)index.php返回false,则允许PHP 5.4 Web服务器静态地提供文件。

问题是这些行不允许我捕获/files/private_document.pdf之类的路由,使用我的FilesController类进行管理:

$controllers->get('/files/{file}', 'file_controller:serveAction')
    ->assert('file', '.*')
    ->bind('file_serve');

1 个答案:

答案 0 :(得分:0)

if(php_sapi_name() === 'cli-server') {
    if(is_file(__DIR__.preg_replace('#(\?.*)$#', '', $_SERVER['REQUEST_URI']))) {
        return false;
    }
}

PHP 5.4 Web服务器的解决方案,以及启动服务器本身:

php -S localhost: 80 -t /path/to/web /path/to/web/index.php

这样,如果存在/css/style.css,则会以静态方式提供,但/files/dynamic.css将通过前端控制器。