Nginx + Django -当我尝试打开非ASCII字符的文件时,找不到404

tvz2xvvm  于 2023-04-29  发布在  Nginx
关注(0)|答案(1)|浏览(158)

我的应用程序(Django + Gunicorn + Nginx)运行在Docker上有问题。我正在使用X-Accel-Redirect头来为受保护的文件提供服务。服务只有ASCII字符的文件工作正常,但当我试图达到文件一样ksiēka.404.第404章我是你我已经检查了媒体目录和文件ksiąka。pdf存在。
在浏览器开发工具中,我可以看到请求是从/media/ksiąđka转换而来的。pdf到/media/ksi%C4%85%C5%BCka。PDF
nginx.conf

charset utf-8;

      location /protected_media/ {
          alias /var/media/;
          internal;

      }

views.py

@login_required
def protected_serve(request, path):
    response = HttpResponse()
    response['Content-Type']=""
    response['X-Accel-Redirect'] = '/protected_media/' + path 
    return response

有没有人知道如何处理非ASCII字符的文件名?

oug3syen

oug3syen1#

问题出在路径上。解决方案在这里:Convert an IRI path to URI before setting as NGINX header
NGINX不支持头中的非ASCII字符,因此我们需要将IRI路径转换为URI,以便与NGINX期望的头值兼容。
视图的最终代码:

from django.utils.encoding import iri_to_uri

@login_required
def protected_serve(request, path):

  x_accel_redirect = iri_to_uri(path)
  response = HttpResponse()
  response['Content-Type']=""
  response['X-Accel-Redirect'] = '/protected_media/' + x_accel_redirect 
  return response

相关问题