Opened 10 years ago

Last modified 4 years ago

#12464 closed

Empty PATH_INFO causes blank SCRIPT_NAME — at Initial Version

Reported by: chrisw Owned by: nobody
Component: HTTP handling Version: master
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.

Change History (0)

Note: See TracTickets for help on using tickets.
Back to Top