diff --git a/django/conf/__init__.py b/django/conf/__init__.py index 23fee7d5b7..28302440c7 100644 --- a/django/conf/__init__.py +++ b/django/conf/__init__.py @@ -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 @@ -132,14 +131,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) diff --git a/docs/releases/3.1.5.txt b/docs/releases/3.1.5.txt index eea060d112..82dc1f0254 100644 --- a/docs/releases/3.1.5.txt +++ b/docs/releases/3.1.5.txt @@ -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`). diff --git a/tests/settings_tests/tests.py b/tests/settings_tests/tests.py index 1368b2ae18..f9f8bdb5ab 100644 --- a/tests/settings_tests/tests.py +++ b/tests/settings_tests/tests.py @@ -573,10 +573,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'):