我有一个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相关的问题?
问题
在 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")