Thanks, Dragan.  That's exactly the code I tried to patch, initially--
and exactly the reason why my patch was no good.  A fix should not
break sub-applications or anything else.

Alex




On Jan 31, 7:51 am, Dragan Espenschied <d...@a-blast.org> wrote:
> Onhttp://webpy.org/cookbook/ctxwe written under "Data Found in ctx":
>
> > homepath The part of the path requested by the user which was trimmed off
> > the current app. That is homepath + path = the path actually requested in
> > HTTP by the user. E.g. /admin This seems to be derived during startup from
> > the environment variable REAL_SCRIPT_NAME. It affects what web.url() will
> > prepend to supplied urls. This in turn affects where web.seeother() will go,
> > which might interact badly with your url rewriting scheme (e.g. mod_rewrite)
>
> "This seems to be derived from environment variable REAL_SCRIPT_NAME."
>
> Seems? :)
>
> All redirecting http resonses are handled via the Redirect class in webapi.py:
>
> class Redirect(HTTPError):
>     """A `301 Moved Permanently` redirect."""
>     def __init__(self, url, status='301 Moved Permanently', absolute=False):
>         """
>         Returns a `status` redirect to the new URL.
>         `url` is joined with the base URL so that things like
>         `redirect("about") will work properly.
>         """
>         newloc = urlparse.urljoin(ctx.path, url)
>
>         if newloc.startswith('/'):
>             if absolute:
>                 home = ctx.realhome
>             else:
>                 home = ctx.home
>             newloc = home + newloc
>
>         headers = {
>             'Content-Type': 'text/html',
>             'Location': newloc
>         }
>         HTTPError.__init__(self, status, headers, "")
>
> Here we have the variable 'realhome' which is assigned in application.py:
>
> ctx.homedomain = ctx.protocol + '://' + env.get('HTTP_HOST', '[unknown]')
> ctx.homepath = os.environ.get('REAL_SCRIPT_NAME', env.get('SCRIPT_NAME', ''))
> ctx.home = ctx.homedomain + ctx.homepath
> #@@ home is changed when the request is handled to a sub-application.
> #@@ but the real home is required for doing absolute redirects.
> ctx.realhome = ctx.home
>
> So probably, changin ctx.realhome would help. I have no experience with
> sub-applications though.
>
> It would be great if anybody knowledgeable could chime in and recommend the 
> best
> technique for setting the redirect base.
>
> Bests,
> Dragan
>
> Am 30.01.2012 20:49, schrieb Alex Quinn:
>
>
>
>
>
>
>
> > Thanks, Dragan.
>
> > That's a novel solution.  I hadn't thought of changing an environment
> > variable, but it sounds like it would work.  As for a web.config.base_url, 
> > in
> > theory the web.homepath is supposed to do exactly that.  As far as I can
> > tell, it's just broken (or at least doesn't work how I expected).
>
> > For now, I'm using the function below.  Instead of calling 
> > web.seeother(url),
> > I call web.seeother(make_url(url)).
>
> > If this is an acknowledged issue and a patch would be welcome, I could
> > probably take another shot at a more general fix that would hopefully not
> > have any unintended consequences.
>
> > I had also been grappling with how to handle links embedded in the 
> > templates,
> > but I just thought of a solution:  Put a <BASE href="http://
> > example.com/myapp/"> tag with the application's base URL in the <HEAD> of 
> > the
> > base template.
>
> > Alex
>
> > ___________________________________________________________________________
> > def make_url(url): """ Fix an apparent incompatibility between how I'm using
> > Apache URL rewriting and the web.seeother (and web.redirect, etc.) commands.
>
> > - If input is full URL (i.e.,http://example.com/blah/), return as is. - If
> > input starts with "/", treat as relative to this application's base. -
> > Otherwise, append it to the current URL, minus any ending filename. """
> > import urlparse, os
>
> > if "://" not in url: url_parts =
> > list(urlparse.urlparse(web.ctx.env["REQUEST_URI"])) old_path = url_parts[2]
>
> > if url.startswith("/"): base = os.path.basename(__file__) home =
> > web.ctx.home if home.endswith(base) and not old_path.endswith(__file__): 
> > home
> > = home[:0-len(base)] url = home.rstrip("/") + url else: new_path =
> > os.path.normpath(os.path.join(old_path, url)) url_parts[2] = new_path url =
> > urlparse.urlunparse(url_parts) return url
> > ___________________________________________________________________________
>
> > On Jan 30, 4:28 am, Dragan Espenschied <d...@a-blast.org> wrote:
> >> This redirecting problem is indeed annoying, I usually "solve" it by
> >> changing an environment variable, for example like this:
>
> >> os.environ['REAL_SCRIPT_NAME'] = '/webpy_bug_report/'
>
> >> This environment is the source for the prefixes of webpy's redirects.
>
> >> I would love if there would be a solution that works across all web servers
> >> and systems, I do not have enough experience with different setups though.
>
> >> Maybe the easiest addition to webpy would be a web.config setting like
> >> "base_url" that would be used in preference over the environment variable.
>
> >> Bests, Dragan
>
> >> Am 29.01.2012 21:26, schrieb Alex Quinn:
>
> >>> Below is a stripped down example that illustrates the problem.  If I go
> >>> tohttp://example.com/webpy_bug_report/itworks fine.  If I go to
> >>>http://example.com/webpy_bug_report/redirect/Iexpect to be redirected
> >>> tohttp://example.com/webpy_bug_report/butinstead I am redirected
> >>> tohttp://example.com/webpy_bug_report/redirect_problem.py/. I've tried
> >>> this under plain CGI as well as FastCGI.
>
> >>> Upon further testing, I realized my current fix doesn't quite work. If
> >>> this is indeed a bug, I'd be happy to take another try at fixing it.
> >>> However, it seems like this would have come up for others before.  I
> >>> couldn't find anything in the list archives or the issue tracker.  If I'm
> >>> doing something wrong or if I missed a solution online somewhere, I'd be
> >>> most grateful if somebody could point me in the right direction.
>
> >>> Thanks, Alex
>
> >>> ___________________________________________________________ # .htaccess
>
> >>> RewriteEngine on RewriteBase /webpy_bug_report/ RewriteCond
> >>> %{REQUEST_URI} !^/webpy_bug_report/favicon.ico$ RewriteCond
> >>> %{REQUEST_URI} !^(/.*)+redirect_problem.py/ RewriteRule ^(.*)$
> >>> redirect_problem.py/$1 [PT]
>
> >>> ___________________________________________________________ #
> >>> redirect_problem.py
>
> >>> import web
>
> >>> urls = ( '/',         'index', '/redirect/','redirect' )
>
> >>> class index: def GET(self): return "This is the index page."
>
> >>> class redirect: def GET(self): raise web.seeother('/')
>
> >>> app = web.application(urls, globals())
>
> >>> if __name__ == '__main__': app.run()
>
> >> --http://noobz.cc/http://digitalfolklore.org/http://contemporary-home-c...
>
> --http://noobz.cc/http://digitalfolklore.org/http://contemporary-home-computing.org/1tb/

-- 
You received this message because you are subscribed to the Google Groups 
"web.py" group.
To post to this group, send email to webpy@googlegroups.com.
To unsubscribe from this group, send email to 
webpy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/webpy?hl=en.

Reply via email to