解决带有许多尾部斜杠的 Django URL - 开发与生产不一致

问题描述 投票:0回答:1

我有一个Python+Django网站,在uWSGI和NginX的控制下工作。

在生产环境中,以下每个地址都指向一篇文章。

APPEND_SLASH=True
设置使第一个URL(非斜杠)重定向到第二个URL(带有一个斜杠) - 这是我理解的部分。

是什么让第三个、第四个以及每个带有任意数量斜杠的 URL 起作用?

1. http://example.com/my-article-slug
2. http://example.com/my-article-slug/
3. http://example.com/my-article-slug//
4. http://example.com/my-article-slug///
5. ...

带有许多斜杠的 URL 只需正确解析 Django 视图 (

ArticleDetail
) 并显示文章,无需重定向 (!)。

但是,在 Django 本地开发 Web 服务器上,只有上述链接的前两个有效。如果 URL 包含多个斜杠,则返回

Http404

根据我的调查,

DEBUG
设置与此问题无关。

值得注意的是,当我想从 URI 解析 Django 视图时,此行为是一个问题,因为带有许多尾部斜杠的地址可以正常工作(在生产中),但

django.urls.resolve
无法正确解析它们:

>>> from django.urls import resolve
>>> resolve('/my-article-slug/')
ResolverMatch(func=articles.views.ArticleDetail, args=(), kwargs={'slug': 'my-article-slug'}...
>>> resolve('/my-article-slug//')
django.urls.exceptions.Resolver404...

Django URL 配置:

# urls.py
from django.urls import include, path

urlpatterns = [
    path('', include('articles.urls')),
]

# articles/urls.py
from django.urls import path
from articles.views import ArticleDetail

urlpatterns = [
    ...
    path('<slug:slug>/', ArticleDetail.as_view(), name='article-detail'),
    ...
]

顺便说一句,我注意到这是很常见的行为,即:

https://www.djangoproject.com/////////////
https://docs.djangoproject.com/en/3.0/////////////
https://www.dropbox.com/////////////
https://www.dropbox.com/individual/////////////
https://www.quora.com/////////////
https://www.quora.com/answer/////////////

也许是NginX相关的问题?

python django nginx django-urls
1个回答
0
投票

问题

在 Django 中,当您返回自定义 404 视图时,Django 期望 HTTP 响应具有 404 状态代码来表示“未找到”。但是,如果您没有在响应中显式设置

status=404
,Django 会将其视为
200 OK
响应,即使您打算将其作为“未找到页面”视图。

误导HTTP响应:如果没有status=404,页面将返回200 OK,这表明请求成功,误导用户和搜索引擎。

如果您使用自定义404模板

from django.shortcuts import render

def custom_404_view(request, exception):
    return render(request, '404.html', status=404)  # Set status=404 here

无模板解决方案

from django.http import HttpResponseNotFound

def custom_404_view(request, exception):
    return HttpResponseNotFound("Custom 404 page not found")
© www.soinside.com 2019 - 2024. All rights reserved.