当存在 url 模式时,Django 的 APPEND_SLASH 添加斜杠,但前提是 URL 中没有西里尔字母

发布于 2024-12-11 05:50:57 字数 948 浏览 4 评论 0原文

我在网站上编写了一个应用程序,用于上传和提供媒体文件(向注册用户)。 实际上,文件由 nginx 使用 x-accel-redirect 标头提供服务。

当浏览器尝试下载例如 http://127.0.0.1:8000/mediacontent/files/abc .pdf 它获取 HTTP301 到“abc.pdf/”,但如果文件包含西里尔字母,例如“/файл.pdf”,一切正常,浏览器获取文件!

为什么 ADD_SLASHES 将 / 添加到纯 ASCII URL,而它匹配模式?

网站也基于 django-cms,如果有区别的话。

urls.py:

(r'^mediacontent/', include('mediacontent.urls')),

媒体内容/urls.py:

url(r'^files/(?P<path>.*)$', login_required(serve_mediacontent), name="serve"),

视图.py:

def serve_mediacontent(request, path):
    webserver = getattr(settings, 'WEBSERVER', 'nginx')
    if webserver == 'nginx':
        response = HttpResponse()
        response['Content-Type'] = ""
        response['X-Accel-Redirect'] = "/media/files/" + path.encode("utf-8")
        return response

I wrote an app on site, to upload and serve mediafiles (to registered users).
Actually, files are served by nginx, using x-accel-redirect header.

When browser try to download e.g. http://127.0.0.1:8000/mediacontent/files/abc.pdf
it gets HTTP301 to "abc.pdf/", but if file contains cyrillic letters, e.g. "/файл.pdf", everything is ok, browser gets file!

Why ADD_SLASHES adds / to plain ASCII URL, while it's matches pattern?

Site also based on django-cms, if it makes difference.

urls.py:

(r'^mediacontent/', include('mediacontent.urls')),

mediacontent/urls.py:

url(r'^files/(?P<path>.*)

views.py:

def serve_mediacontent(request, path):
    webserver = getattr(settings, 'WEBSERVER', 'nginx')
    if webserver == 'nginx':
        response = HttpResponse()
        response['Content-Type'] = ""
        response['X-Accel-Redirect'] = "/media/files/" + path.encode("utf-8")
        return response
, login_required(serve_mediacontent), name="serve"),

views.py:

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文