我正在使用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" />
私人或公共上传文件夹中的文件应使用控制器提供,以获取已清理的名称和检查权限。
现在所有请求(对于不存在的文件)都通过前端控制器index.php
:
<IfModule mod_rewrite.c>
Options -MultiViews
RewriteEngine On
RewriteBase /web
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [QSA,L]
</IfModule>
使用app/*
文件拒绝.htaccess
的请求。这是正确和安全的吗?
在我的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');
答案 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
将通过前端控制器。