> > # location: '/app.cgi'
> > SCRIPT_NAME: ''
> > PATH_INFO: '/app.cgi'
>
> Ugh. I want Apache + app.cgi to provide
> SCRIPT_NAME: '/app.cgi'
> and
> PATH_INFO: ''
> In this case.
That would make a lot more sense.
> If you use:
> ScriptAlias /foo <path-to-app.cgi>
> do you get the same results?
Yes, for the request '/foo' it gives:
SCRIPT_NAME: ''
PATH_INFO: '/foo'
> I think you should not be using SCRIPT_FILENAME at all, since it is not
> part of the CGI 1.1 specification.
My thinking there is that no harm can be done, except that if it is not present
then nothing will change.
> In your case, it looks like this method could be:
>
> def process (self, stdin, env):
> if env.get('PATH_INFO') == '':
> env['PATH_INFO'] = env.get('SCRIPT_NAME')
> env['SCRIPT_NAME'] = ''
> hit = Hit(stdin, env)
> self.process_hit(hit)
> return hit
>
> This hack also frustrates me though. The cgi-caller really should
> provide a SCRIPT_NAME that makes sense.
Hmmn, in my case PATH_INFO is never an empty string, so this will never match.
Or did you mean to switch the 2 vars here? I.e. this works in this root case
(but will clearly not in the general case) :
def process (self, stdin, env):
if env.get('SCRIPT_NAME') == '':
env['SCRIPT_NAME'] = env.get('PATH_INFO')
env['PATH_INFO'] = ''
hit = Hit(stdin, env)
self.process_hit(hit)
return hit
>
> Another idea:
>
> Add this to your root directory:
>
> def _q_lookup(self, component):
> redirect('')
>
> Wouldn't this redirect all unknown paths, like '/app.cgi', to '/'?
I tried this, after removing my overriden publisher.process():
def _q_lookup (self, component):
r = super(MySiteDirectory, self)._q_lookup(component)
if r is not None:
return r
get_publisher().redirect('')
When requesting '/app.cgi' this gives a redirect loop... I guess the redirect
should be:
env = get_publisher().get_hit().get_request().environ
print '%s:%s:%s' % (component, env['SCRIPT_NAME'],
env.get('PATH_INFO'))
get_publisher().redirect(env['PATH_INFO']+'/')
Interestingly, when requesting '/app.cgi' the above prints:
app.cgi::/app.cgi
This must simply be because the result of the PATH_INFO is being screwed here.
In the end I am leaning towards overriding process_inputs() instead... as this
will also redirect correctly. The _q_lookup() trick has the advantage of being
executed only when needed, not on every hit, but i find it more convoluted.
# Handle case when site is deployed under a script, but the requested
# url ends with precisely the SCRIPT_NAME (with nothing trailing it).
# This erroneously (on Apache2) gives an empty string SCRIPT_NAME and
# a PATH_INFO set to the actual script_name -- that will break any
# dynamically calculated relative url paths.
# Assumption here is that if a SCRIPT_FILENAME is set, then it must
# end with the (non-empty) SCRIPT_NAME.
def process_inputs (self):
env = self.get_hit().get_request().environ
if env.get('SCRIPT_FILENAME'):
if not env.get('SCRIPT_NAME') and env.get('PATH_INFO'):
if env['SCRIPT_FILENAME'].endswith(env['PATH_INFO']):
self.redirect(env['PATH_INFO'] + '/')
super(Publisher, self).process_inputs()
Yes, it relies on SCRIPT_FILENAME... but it is a hack a fix servers returning an
incorrect SCRIPT_NAME in this special situation. Maybe servers that do not
supply the SCRIPT_FILENAME would anyway return the correct SCRIPT_NAME ?!?
Related question: is the current check in process() still needed? WHich
situations (depoyment scenario, server, os?) trigger it to be executed? The
long comment for it does not seem to indicate that...
mario
_______________________________________________
QP mailing list
[email protected]
http://mail.mems-exchange.org/mailman/listinfo/qp