On Sun, Dec 14, 2008 at 12:37, Sorin Manolache <sor...@gmail.com> wrote: > On Sun, Dec 14, 2008 at 06:20, Sam Carleton <scarle...@miltonstreet.com> > wrote: >> On Sat, Dec 13, 2008 at 1:04 PM, Sorin Manolache <sor...@gmail.com> wrote: >> >>> 3. Set a request note (apr_table_set(r->notes, "my_note", >>> "should_redirect")) and then in the handler hook you check the request >>> note. If it is set, ap_internal_redirect(your_url). >> >> This is what I want to do, make it 100% transparent to the client. I >> put my hook handler at the first one and look for the note, if there I >> call ap_internal_redirect(), but my client is still getting a status >> code of 500. The page I am trying to redirect to *IS* a PHP page, >> does that matter? > > No, it doesn't. > >> What format should the string in >> ap_internal_redirect() take, relative to the server or should the http >> and the server name be part of the string? I want to redirect to: >> >> /invalidClient.html > > ap_internal_redirect(r, "/invalidClient.html"); > > i.e. without protocol and server name. > > I think the 500 was caused by an infinite loop: > > When you perform an internal redirect, a new request_rec structure is > created and it is linked to the main request through the "prev" and > "next" fields. The newly created request will go through all (or most) > processing stages that its main request goes. Therefore, you risk here > to fall into infinite recursion: > > 1. access_status: sets a note in the main request > 2. handler: checks the note, finds it, redirects the main request > 3. access_status: sets a note in the redirected request > 4. handler: checks the note, finds it, redirects the redirected request > 5. etc. > > Therefore, your handler must DECLINE redirects in order to avoid the > infinite loop: > > if (!ap_is_initial_req(r)) > return DECLINED; > const char *note = apr_table_get(r->notes, "my_note"); > if (note != 0 && strcmp(note, "should_redirect")) > ap_internal_redirect(h, "/invalidClient.html");
r, not h, typo. Sorry.