It is common practice to set Cookie's to pass along on HTTP redirects for "login" authentication.
When implementing P3P <http://www.w3.org/P3P/> using mod_headers.c the Header directive only sets r->headers_out and does not pass the headers along for non-2XX responses such as error pages and redirects. To provide this functionality we added the ErrorHeader directive which populates r->err_headers_out instead. Below follows a patch for 1.3.X by Michael Radwin. I have some code that attempts to add Directive to 2.0.X, but it seems that output_filters are shortcuted on 3XX responses. While now by setting the Header directive it also passes the headers along at for all non-2XX responses except 3XX responses. Cheers, -- Sander van Zoest +1 (619) 881-3000 Yahoo!, Inc. [EMAIL PROTECTED] <http://www.yahoo.com/> <http://sander.vanzoest.com/> Index: apache-1.3/src/modules/standard/mod_headers.c =================================================================== RCS file: /work/cvs/root/asf/httpd/apache-1.3/src/modules/standard/mod_headers.c,v retrieving revision 1.27 diff -u -p -r1.27 mod_headers.c --- apache-1.3/src/modules/standard/mod_headers.c 13 Mar 2002 21:05:33 -0000 1.27 +++ apache-1.3/src/modules/standard/mod_headers.c 16 May 2002 04:41:08 -0000 @@ -116,6 +116,7 @@ typedef struct { hdr_actions action; char *header; char *value; + int do_err; } header_entry; /* @@ -128,6 +129,9 @@ typedef struct { module MODULE_VAR_EXPORT headers_module; +static char c_err; +#define HDR_ERR &c_err + static void *create_headers_config(pool *p, server_rec *s) { headers_conf *a = @@ -169,6 +173,12 @@ static const char *header_cmd(cmd_parms new = (header_entry *) ap_push_array(serverconf->headers); } + if (cmd->info == HDR_ERR) { + new->do_err = 1; + } else { + new->do_err = 0; + } + if (!strcasecmp(action, "set")) new->action = hdr_set; else if (!strcasecmp(action, "add")) @@ -200,6 +210,8 @@ static const command_rec headers_cmds[] { {"Header", header_cmd, NULL, OR_FILEINFO, TAKE23, "an action, header and value"}, + {"ErrorHeader", header_cmd, HDR_ERR, OR_FILEINFO, TAKE23, + "an action, header and value"}, {NULL} }; @@ -209,18 +221,19 @@ static void do_headers_fixup(request_rec for (i = 0; i < headers->nelts; ++i) { header_entry *hdr = &((header_entry *) (headers->elts))[i]; + table *tbl = (hdr->do_err ? r->err_headers_out : r->headers_out); switch (hdr->action) { case hdr_add: - ap_table_addn(r->headers_out, hdr->header, hdr->value); + ap_table_addn(tbl, hdr->header, hdr->value); break; case hdr_append: - ap_table_mergen(r->headers_out, hdr->header, hdr->value); + ap_table_mergen(tbl, hdr->header, hdr->value); break; case hdr_set: - ap_table_setn(r->headers_out, hdr->header, hdr->value); + ap_table_setn(tbl, hdr->header, hdr->value); break; case hdr_unset: - ap_table_unset(r->headers_out, hdr->header); + ap_table_unset(tbl, hdr->header); break; } } @@ -264,5 +277,7 @@ module MODULE_VAR_EXPORT headers_module NULL, /* child_exit */ NULL /* post read-request */ }; + +