[3.1.x] Fixed #32304 -- Fixed prefixing STATIC_URL and MEDIA_URL by SCRIPT_NAME for absolute URLs with no domain.
Thanks Adam Hooper for the report. Regression inc574bec092
. Backport ofe13b71403b
from master
This commit is contained in:
parent
6b4b7da740
commit
5fdc81d893
|
@ -15,8 +15,7 @@ from pathlib import Path
|
|||
|
||||
import django
|
||||
from django.conf import global_settings
|
||||
from django.core.exceptions import ImproperlyConfigured, ValidationError
|
||||
from django.core.validators import URLValidator
|
||||
from django.core.exceptions import ImproperlyConfigured
|
||||
from django.utils.deprecation import RemovedInDjango40Warning
|
||||
from django.utils.functional import LazyObject, empty
|
||||
|
||||
|
@ -124,14 +123,8 @@ class LazySettings(LazyObject):
|
|||
Useful when the app is being served at a subpath and manually prefixing
|
||||
subpath to STATIC_URL and MEDIA_URL in settings is inconvenient.
|
||||
"""
|
||||
# Don't apply prefix to valid URLs.
|
||||
try:
|
||||
URLValidator()(value)
|
||||
return value
|
||||
except (ValidationError, AttributeError):
|
||||
pass
|
||||
# Don't apply prefix to absolute paths.
|
||||
if value.startswith('/'):
|
||||
# Don't apply prefix to absolute paths and URLs.
|
||||
if value.startswith(('http://', 'https://', '/')):
|
||||
return value
|
||||
from django.urls import get_script_prefix
|
||||
return '%s%s' % (get_script_prefix(), value)
|
||||
|
|
|
@ -16,3 +16,9 @@ Bugfixes
|
|||
* Fixed a bug in Django 3.1 that caused a crash when processing middlewares in
|
||||
an async context with a middleware that raises a ``MiddlewareNotUsed``
|
||||
exception (:ticket:`32299`).
|
||||
|
||||
* Fixed a regression in Django 3.1 that caused the incorrect prefixing of
|
||||
``STATIC_URL`` and ``MEDIA_URL`` settings, by the server-provided value of
|
||||
``SCRIPT_NAME`` (or ``/`` if not set), when set to a URL specifying the
|
||||
protocol but without a top-level domain, e.g. ``http://myhost/``
|
||||
(:ticket:`32304`).
|
||||
|
|
|
@ -577,10 +577,12 @@ class MediaURLStaticURLPrefixTest(SimpleTestCase):
|
|||
set_script_prefix(val)
|
||||
|
||||
def test_not_prefixed(self):
|
||||
# Don't add SCRIPT_NAME prefix to valid URLs, absolute paths or None.
|
||||
# Don't add SCRIPT_NAME prefix to absolute paths, URLs, or None.
|
||||
tests = (
|
||||
'/path/',
|
||||
'http://myhost.com/path/',
|
||||
'http://myhost/path/',
|
||||
'https://myhost/path/',
|
||||
None,
|
||||
)
|
||||
for setting in ('MEDIA_URL', 'STATIC_URL'):
|
||||
|
|
Loading…
Reference in New Issue