Разрешение Django URL с множеством конечных слешей - несоответствие между разработкой и производством - PullRequest
2 голосов
/ 10 февраля 2020

У меня есть сайт 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?

...