Opened 9 years ago
Last modified 9 years ago
#26293 closed Bug
Warnings regarding 404s logged for URLs missing trailing slashes — at Initial Version
Reported by: | JK Laiho | Owned by: | nobody |
---|---|---|---|
Component: | HTTP handling | Version: | 1.9 |
Severity: | Normal | Keywords: | CommonMiddleware 404 logging regression |
Cc: | Emett Speer | Triage Stage: | Accepted |
Has patch: | yes | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | yes | UI/UX: | no |
Description
I recently deployed a project into production using Django 1.9.2 and started getting strange logged warning messages from Sentry for 404's. Looking into it, this occurred in django.core.handers.base.BaseHandler.get_response
and was related to people visiting URLs without trailing slashes.
I compared the behaviour against an earlier, similarly configured project still running Django 1.7.x and this didn't occur there.
Digging deeper, it seems that commit 434d309e to fix 24720 inside CommonMiddleware
was causing this. In lines 56-66 (58-68 in 1.9.2), the path is only checked for a missing slash if the prerequisites for PREPEND_WWW
processing are met, since they are indented beneath it. This doesn't really make sense, since the two settings are not interdependent.
As a result, an Http404
is raised after request middleware processing in BaseHandler.get_response
, at which point a warning is logged—for every single request for a path without a trailing slash.
APPEND_SLASH
still takes effect eventually, but only when CommonMiddleware
is called again, this time for process_response
, whereupon the normal redirect gets done. Thanks to this, everything appears to function normally for the end user, but unnecessary 404 warnings end up getting logged. (Though if APPEND_SLASH
was False
, you'd probably want them logged.)
It seems to me that CommonMiddleware.process_request
needs a bit of reworking to run the checks for PREPEND_WWW
and APPEND_SLASH
independently, and to determine the need for a redirect based on whether at least one of these is necessary, still fulfilling the purpose of 24720. I've provisionally marked the ticket as "easy pickings", as it seems to be that way from my admittedly limited research into this.