NGINX是否下载带有URL名称的静态文件内容?

时间:2019-10-14 15:57:57

标签: nginx

我有一个系统,该系统允许用户上传文件,也可以通过链接下载文件,以前,如果有人知道文件名,他们可以通过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服务而不是下载?

1 个答案:

答案 0 :(得分:0)

您可以这样做:

rewrite ^/uploads/(.*) /uploadsController.php?file=$1 last;

然后在您的PHP中,您可以使用:

$file = $_GET['file'];