1

我正在使用 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');
4

1 回答 1

1
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将通过前端控制器。

于 2013-09-11T18:55:39.690 回答