django - 使用 Django 为静态文件自定义 HTTP header

标签 django http nginx

我正在用 Django 编写一个图像库,我想添加一个按钮来获取图像的高分辨率版本(低分辨率显示在详细信息页面中)。如果我只放一个 <a>链接,浏览器将打开图像而不是下载它。添加 HTTP header ,例如:

Content-Disposition: attachment; filename="beach008.jpg"

有效,但由于它是一个静态文件,我不想用 Django 处理请求。目前,我正在使用 NGINX 来提供静态文件,动态页面通过 FastCGI 重定向到 Django 进程。我正在考虑使用 NGINX add-header命令,但它可以设置 filename="xx"部分?。或者也许有一些方法可以在 Django 中处理请求,但让 NGINX 提供内容?

最佳答案

如果您的 django 应用程序由 nginx 代理,您可以使用 x-accell-redirect .您需要在响应中传递一个特殊的 header ,nginx 将拦截它并开始提供文件,您也可以在同一响应中传递 Content-Disposition 以强制下载。

如果您想控制哪些用户可以访问这些文件,那么该解决方案很好。

你也可以使用这样的配置:

    #files which need to be forced downloads
    location /static/high_res/ {
        root /project_root;

        #don't ever send $request_filename in your response, it will expose your dir struct, use a quick regex hack to find just the filename
        if ($request_filename ~* ^.*?/([^/]*?)$) {
            set $filename $1;
        }

        #match images
        if ($filename ~* ^.*?\.((jpg)|(png)|(gif))$) {
            add_header Content-Disposition "attachment; filename=$filename";
        }
    }

    location /static {
        root /project_root;
    }

这将强制下载某些 high_res 文件夹 (MEDIAROOT/high_rest) 中的所有图像。对于其他静态文件,它的行为与正常情况一样。请注意,这是对我有用的经过修改的快速技巧。它可能具有安全隐患,因此请谨慎使用。

关于django - 使用 Django 为静态文件自定义 HTTP header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/263122/

相关文章:

python - 向 Django 模型方法添加请求?

django - 如何格式化具有特定位数的数字?

python - 删除具有 South 依赖性的 Django 应用程序

python - 如何在使用带有 request.post 方法的文件参数上传文件时应用压缩

java - Java HttpClient 的响应流不正确

python - Tastypie 使用自定义 detail_uri_name,类型不匹配错误

c++ - 在 Windows 上使用 C++ 在本地发送 POST 请求

amazon-web-services - Elastic Beanstalk Worker 的 SQS 守护进程在 1 分钟后获得 504 网关超时

node.js - 在特定端口上为 Nodejs 配置 NGINX (Engintron) HTTPS 到 HTTP

nginx - 如何从Nginx上游转发到上游服务器