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