У меня есть сайт Python + Django, работающий под управлением uWSGI и NginX.
В производственной среде каждый из приведенных ниже адресов ссылается на статью. Параметр APPEND_SLASH=True
заставляет перенаправить первый URL (не-sla sh) на второй URL-адрес (с одним sla sh) - это та часть, которую я понимаю.
Что делает третий, четвертый и каждый 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 View (ArticleDetail
) и показывают статью без перенаправления (!).
Однако на локальном веб-сервере разработки Django работают только первые две из указанных выше ссылок. Http404
возвращается, если URL имеет более одного sla sh.
Параметр DEBUG
не имеет отношения к этой проблеме, согласно моему исследованию.
Стоит отметить что такое поведение является проблемой, когда я хочу разрешить Django представление из URI, потому что адреса со многими конечными слешами работают правильно (на производстве), но они не разрешаются правильно 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?