[Web-SIG] Relationship between SCRIPT_NAME and PATH_INFO.
Graham Dumpleton
grahamd at dscpl.com.au
Sat Jan 27 03:17:47 CET 2007
In the PEP it says:
SCRIPT_NAME
The initial portion of the request URL's "path" that corresponds
to the application object, so that the application knows its virtual
"location". This may be an empty string, if the application
corresponds to the "root" of the server.
PATH_INFO
The remainder of the request URL's "path", designating the virtual
"location" of the request's target within the application. This may
be an empty string, if the request URL targets the application root
and does not have a trailing slash.
Seeking further clarification on what happens in certain circumstances,
paste.lint says:
- That SCRIPT_NAME and PATH_INFO are empty or start with /
- That at least one of SCRIPT_NAME or PATH_INFO are set.
- That SCRIPT_NAME is not '/' (it should be '', and PATH_INFO should
be '/').
As illustration of what this appears to all mean:
Mount Point: /application
Request URL: /application/something
yields:
SCRIPT_NAME: /application
PATH_INFO: /something
and:
Request URL: /application
yields:
SCRIPT_NAME: /application
with PATH_INFO not needing to actually be defined as it will be empty.
Further:
Request URL: /application/
yields:
SCRIPT_NAME: /application
PATH_INFO: /
For application mounted at the root of the web server:
Mount Point:
Request URI: /something
yields:
SCRIPT_NAME:
PATH_INFO: /something
Where SCRIPT_NAME doesn't really need to be defined given that it is
empty.
All okay so far.
Now my questions revolve around where an application is mounted
at a URL which itself has a trailing slash. For example, in Apache
one can
say:
<Location /application/>
...
</Location>
If a request arrives which is for '/application', it will not
actually be directed
to the application because it doesn't have the required trailing
slash and
so will not match the path in the directive.
In effect the mount point of the application is '/application/'. One
cannot treat
the mount point as being '/application' as if that is then used by
user code
to reference back to the root of the application for a link or
redirect it will not
actually work as the trailing slash is missing.
Thus, this would suggest that for this case that one would have:
SCRIPT_NAME: /application/
This though doesn't seem to marry up with WSGI very well. This is
because
reconstruction of URLs indicates that all that is required is to join
SCRIPT_NAME
and PATH_INFO back together. Ie.,
from urllib import quote
url = environ['wsgi.url_scheme']+'://'
if environ.get('HTTP_HOST'):
url += environ['HTTP_HOST']
else:
url += environ['SERVER_NAME']
if environ['wsgi.url_scheme'] == 'https':
if environ['SERVER_PORT'] != '443':
url += ':' + environ['SERVER_PORT']
else:
if environ['SERVER_PORT'] != '80':
url += ':' + environ['SERVER_PORT']
url += quote(environ.get('SCRIPT_NAME',''))
url += quote(environ.get('PATH_INFO',''))
if environ.get('QUERY_STRING'):
url += '?' + environ['QUERY_STRING']
If that is seen as being the case, then we would need to have:
Mount Point: /application/
Request URL: /application/something
yields:
SCRIPT_NAME: /application/
PATH_INFO: something
This though violates what paste.lint says is correct:
- That SCRIPT_NAME and PATH_INFO are empty or start with /
Ie., can't have PATH_INFO not start without a slash. But to put one
in and still
have SCRIPT_NAME valid as far as what the mount point is, you would
need:
SCRIPT_NAME: /application/
PATH_INFO: /something
In URL reconstruction though this would yield:
/application//something
Ie., introduce a double slash.
It also sort of violates the definition of PATH_INFO in the PEP as well.
It therefore seems that the idea of the mount point for an
application having a
trailing slash may be incompatible with WSGI. Can this be considered
to be the
case or is there some other way one is meant to deal with this?
Should a WSGI adapter for a web server which allows a mount point to
have a
trailing slash specifically flag as a configuration error an attempt
to use such a
mount point given that it appears to be incompatible with WSGI?
Thanks in advance for any feedback.
Graham
More information about the Web-SIG
mailing list