Opened 15 years ago
Last modified 9 years ago
#12464 closed
Empty PATH_INFO causes blank SCRIPT_NAME — at Initial Version
Reported by: | chrisw | Owned by: | nobody |
---|---|---|---|
Component: | HTTP handling | Version: | dev |
Severity: | Normal | Keywords: | |
Cc: | Graham.Dumpleton@… | Triage Stage: | Accepted |
Has patch: | yes | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | yes |
Easy pickings: | no | UI/UX: | no |
Description
Take the following Apache config snippet:
RewriteEngine On
WSGIScriptAlias /project /django/project/bin/django.wsgi
This results in mod_rewrite setting the SCRIPT_URL environment variable.
The code at http://code.djangoproject.com/browser/django/tags/releases/1.1.1/django/core/handlers/base.py#L204:
script_url = environ.get('SCRIPT_URL', u)
if not script_url:
script_url = environ.get('REDIRECT_URL', u)
if script_url:
return force_unicode(script_url[:-len(environ.get('PATH_INFO', ))])
return force_unicode(environ.get('SCRIPT_NAME', u))
...behaves incorrectly when, in the above example, /project is requested from Apache.
The problem is when PATH_INFO is empty, as it is in this case. Python
has no notion of positive or negative zero (;-)) so we end up returning
script_url[:0]. This results in request.METASCRIPT_NAME being set to , which in turn results in urls being generated incorrectly.
A workaround for this is to add the following rewrite rule before WSGIScriptAlias:
RewriteRule /project$ /project/ [R]
This bug is potentially related to #9435, but this is ticket describes a real world problem that I believe has bitten more people than just me...
A solution for this could well just be to change the section to:
if script_url:
path_info = environ.get('PATH_INFO', )
if path_info:
script_url = script_url[:-len(path_info)]
return force_unicode(script_url)
return force_unicode(environ.get('SCRIPT_NAME', u))
...but I have no idea where to go about writing a test.