You are viewing a plain text version of this content. The canonical link for it is here.
Posted to modules-dev@httpd.apache.org by John Zhang <jo...@yahoo.com> on 2008/04/17 02:46:27 UTC
perform a redirect in output filter
I am using apache 2.0/2.2, in my output filter, I
would like to have the ability to redirect. Some
tests indicated that I can redirect to a page on the
same site, but not to an external site.
Here is my code for redirect:
char* location =
apr_table_get(r->headers_out, "Location");
//Note this Location is set by my filter during the
process, so I know I need to do a redirect.
if(location && location[0])
{
//r->status = 301;
r->method = apr_pstrdup(r->pool, "GET");
r->method_number = M_GET;
apr_table_unset(r->headers_in, "Content-Length");
ap_remove_output_filter(my_filter);
ap_internal_redirect_handler(location, r);
return APR_SUCCESS;
}
//tests: (if my site is http://localhost/foo)
and when http://localhost/foo/bar.html (my test
page)is loaded I want to redirect it to
a) /foo/foo2/existing.html (works)
b) http://localhost/foo/foo2/existing.html (works)
c) http://www.google.com (does not work), instead I
get http://localhost/foo displayed on the browser.
Is there anything I did is incorrect? I noticed the
method is called "*internal_redirect*", but did not
know another one for "external redirect".
Thanks,
John
Re: perform a redirect in output filter
Posted by John Zhang <jo...@yahoo.com>.
--- On Thu, 4/17/08, Joe Lewis <jo...@joe-lewis.com> wrote:
> From: Joe Lewis <jo...@joe-lewis.com>
> Subject: Re: perform a redirect in output filter
> To: modules-dev@httpd.apache.org
> Date: Thursday, April 17, 2008, 6:05 AM
> John Zhang wrote:
> > I am using apache 2.0/2.2, in my output filter, I
> > would like to have the ability to redirect. Some
> > tests indicated that I can redirect to a page on the
> > same site, but not to an external site.
> >
> > Here is my code for redirect:
> > char* location =
> > apr_table_get(r->headers_out,
> "Location");
> > //Note this Location is set by my filter during the
> > process, so I know I need to do a redirect.
> > if(location && location[0])
> > {
> > //r->status = 301;
> > r->method = apr_pstrdup(r->pool,
> "GET");
> > r->method_number = M_GET;
> > apr_table_unset(r->headers_in,
> "Content-Length");
> > ap_remove_output_filter(my_filter);
> > ap_internal_redirect_handler(location, r);
> > return APR_SUCCESS;
> > }
> >
> > //tests: (if my site is http://localhost/foo)
> > and when http://localhost/foo/bar.html (my test
> > page)is loaded I want to redirect it to
> > a) /foo/foo2/existing.html (works)
> > b) http://localhost/foo/foo2/existing.html (works)
> > c) http://www.google.com (does not work), instead I
> > get http://localhost/foo displayed on the browser.
> >
> > Is there anything I did is incorrect? I noticed the
> > method is called "*internal_redirect*", but
> did not
> > know another one for "external redirect".
> >
>
> An internal redirect should only work with internal
> redirects, and I do
> not know of an external.
>
> I expect that you will have to set the f->r->status
> to 302, and maybe
> return a small page saying that the doc moved. Have you
> uncommented the
> r->status line and commented out the internal_redirect
> line? How did
> that work? (Note: an output filter, probably shouldn't
> be calling a
> handler. You may want to destroy the bucket brigade, and
> then create a
> new bucket brigade with the error message.)
>
Thanks Joe,
It worked if I do not use the internal redirect API.
Re: perform a redirect in output filter
Posted by Joe Lewis <jo...@joe-lewis.com>.
John Zhang wrote:
> I am using apache 2.0/2.2, in my output filter, I
> would like to have the ability to redirect. Some
> tests indicated that I can redirect to a page on the
> same site, but not to an external site.
>
> Here is my code for redirect:
> char* location =
> apr_table_get(r->headers_out, "Location");
> //Note this Location is set by my filter during the
> process, so I know I need to do a redirect.
> if(location && location[0])
> {
> //r->status = 301;
> r->method = apr_pstrdup(r->pool, "GET");
> r->method_number = M_GET;
> apr_table_unset(r->headers_in, "Content-Length");
> ap_remove_output_filter(my_filter);
> ap_internal_redirect_handler(location, r);
> return APR_SUCCESS;
> }
>
> //tests: (if my site is http://localhost/foo)
> and when http://localhost/foo/bar.html (my test
> page)is loaded I want to redirect it to
> a) /foo/foo2/existing.html (works)
> b) http://localhost/foo/foo2/existing.html (works)
> c) http://www.google.com (does not work), instead I
> get http://localhost/foo displayed on the browser.
>
> Is there anything I did is incorrect? I noticed the
> method is called "*internal_redirect*", but did not
> know another one for "external redirect".
>
An internal redirect should only work with internal redirects, and I do
not know of an external.
I expect that you will have to set the f->r->status to 302, and maybe
return a small page saying that the doc moved. Have you uncommented the
r->status line and commented out the internal_redirect line? How did
that work? (Note: an output filter, probably shouldn't be calling a
handler. You may want to destroy the bucket brigade, and then create a
new bucket brigade with the error message.)
Joe
--
Joseph Lewis <http://sharktooth.org/>