summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
Diffstat (limited to 'django')
-rw-r--r--django/contrib/staticfiles/storage.py15
1 files changed, 10 insertions, 5 deletions
diff --git a/django/contrib/staticfiles/storage.py b/django/contrib/staticfiles/storage.py
index b3c53b7232..d6911c9fd7 100644
--- a/django/contrib/staticfiles/storage.py
+++ b/django/contrib/staticfiles/storage.py
@@ -166,12 +166,15 @@ class HashedFilesMixin(object):
name_parts = name.split(os.sep)
# Using posix normpath here to remove duplicates
url = posixpath.normpath(url)
- url_parts = url.split('/')
- parent_level, sub_level = url.count('..'), url.count('/')
- if url.startswith('/'):
+ # Strip off the fragment so that a path-like fragment won't confuse
+ # the lookup.
+ url_path, fragment = urldefrag(url)
+ url_parts = url_path.split('/')
+ parent_level, sub_level = url_path.count('..'), url_path.count('/')
+ if url_path.startswith('/'):
sub_level -= 1
url_parts = url_parts[1:]
- if parent_level or not url.startswith('/'):
+ if parent_level or not url_path.startswith('/'):
start, end = parent_level + 1, parent_level
else:
if sub_level:
@@ -183,7 +186,9 @@ class HashedFilesMixin(object):
joined_result = '/'.join(name_parts[:-start] + url_parts[end:])
hashed_url = self.url(unquote(joined_result), force=True)
file_name = hashed_url.split('/')[-1:]
- relative_url = '/'.join(url.split('/')[:-1] + file_name)
+ relative_url = '/'.join(url_path.split('/')[:-1] + file_name)
+ if fragment:
+ relative_url += '?#%s' % fragment if '?#' in url else '#%s' % fragment
# Return the hashed version to the file
return template % unquote(relative_url)