我有一个系统,该系统允许用户上传文件,也可以通过链接下载文件,以前,如果有人知道文件名,他们可以通过https://example.com/uploads/filename.example
访问它,但是这是非常不安全的,我希望使其更安全。
我创建了文件uploadsController.php
,并将所有现有文件移出/uploads/
,所以uploadsController.php
现在是/uploads/
中的唯一文件
uploadsController.php
正常运行,我已经对其进行了测试(它所做的只是检查用户是否登录,然后将请求的文件提供给他们。我的本地系统正在运行apache,并且有一个htaccess文件可以重写对/uploads/
/uploads/uploadsController.php
请求
但是,我的生产系统在nginx上运行,并且在编写将执行以下操作的规则时遇到了一些麻烦:
/uploads/
文件夹的请求服务到/uploads/uploadsController.php
,无论请求的文件是什么,例如/uploads/file1.txt
我当前的重写规则如下:
location ~* (.*/uploads/.*){
root /var/www/html/tests_manager/webroot/uploads;
try_files /uploadsController.php /uploadsController.php;
rewrite ^$uri$ /uploadsController.php;
index uploadsController.php
fastcgi_pass unix:/run/php/php7.3-fpm.sock;
}
但这不起作用,实际上发生的是将uploadsController.php
的内容放入file1.txt
内(或所请求的任何文件名)然后下载。
如何更改重写规则以始终为uploadsController.php
服务而不是下载?
答案 0 :(得分:0)
您可以这样做:
rewrite ^/uploads/(.*) /uploadsController.php?file=$1 last;
然后在您的PHP中,您可以使用:
$file = $_GET['file'];