> OK, I can't figure this out.. help me out here. I want to deal with my
> virtual hosts on the heavyweight server. The frontend server should just
> be a simple thing that I never have to touch.
Matt, you might want to check out this patch to mod_proxy posted to
new-httpd by Sam Tregar:
"ProxyRewriteHostHeader option to mod_proxy. This configuration directive
controls wether mod_proxy will rewrite the Host header or pass it through
unchanged. The default is to rewrite, which is the current behavior.
This mirrors a setting available in Squid - redirect_rewrites_host_header."
I guess this would let you have your virtual host setup only on the backend
server.
The patch is against the 1.3 CVS tree.
--
Eric
Index: src/modules/proxy/mod_proxy.c
===================================================================
RCS file: /cvs/apache/apache-1.3/src/modules/proxy/mod_proxy.c,v
retrieving revision 1.69
diff -u -r1.69 mod_proxy.c
--- mod_proxy.c 2000/03/01 09:13:38 1.69
+++ mod_proxy.c 2000/05/01 01:48:52
@@ -418,6 +418,8 @@
ps->domain = NULL;
ps->viaopt = via_off; /* initially backward compatible with 1.3.1 */
ps->viaopt_set = 0; /* 0 means default */
+ ps->rewrite_host_header_opt = 1; /* normally always rewrite */
+ ps->rewrite_host_header_opt_set = 0;
ps->req = 0;
ps->req_set = 0;
ps->recv_buffer_size = 0; /* this default was left unset for some reason */
@@ -463,6 +465,7 @@
ps->domain = (overrides->domain == NULL) ? base->domain : overrides->domain;
ps->viaopt = (overrides->viaopt_set == 0) ? base->viaopt : overrides->viaopt;
+ ps->rewrite_host_header_opt = (overrides->rewrite_host_header_opt_set == 0) ?
+base->rewrite_host_header_opt : overrides->rewrite_host_header_opt;
ps->req = (overrides->req_set == 0) ? base->req : overrides->req;
ps->recv_buffer_size = (overrides->recv_buffer_size_set == 0) ?
base->recv_buffer_size : overrides->recv_buffer_size;
@@ -882,6 +885,26 @@
return NULL;
}
+static const char*
+ set_rewrite_host_header_opt(cmd_parms *parms, void *dummy, char *arg)
+{
+ proxy_server_conf *psf =
+ ap_get_module_config(parms->server->module_config, &proxy_module);
+
+ if (!strcasecmp(arg, "Off"))
+ psf->rewrite_host_header_opt = 0;
+ else if (!strcasecmp(arg, "On"))
+ psf->rewrite_host_header_opt = 1;
+ else {
+ return "ProxyRewriteHostHeader must be one of:"
+ "off | on";
+ }
+
+ psf->rewrite_host_header_opt_set = 1;
+ return NULL;
+}
+
+
static const handler_rec proxy_handlers[] =
{
{"proxy-server", proxy_handler},
@@ -930,6 +953,8 @@
"Force a http cache completion after this percentage is loaded"},
{"ProxyVia", set_via_opt, NULL, RSRC_CONF, TAKE1,
"Configure Via: proxy header header to one of: on | off | block | full"},
+ {"ProxyRewriteHostHeader", set_rewrite_host_header_opt, NULL, RSRC_CONF, TAKE1,
+ "Configure handling of Host header. When off the Host header is passed through,
+when on the Host header is rewritten based on destination address and pot"},
{NULL}
};
Index: src/modules/proxy/mod_proxy.h
===================================================================
RCS file: /cvs/apache/apache-1.3/src/modules/proxy/mod_proxy.h,v
retrieving revision 1.46
diff -u -r1.46 mod_proxy.h
--- mod_proxy.h 2000/01/11 14:13:44 1.46
+++ mod_proxy.h 2000/05/01 01:48:52
@@ -222,6 +222,8 @@
via_full
} viaopt; /* how to deal with proxy Via: headers */
char viaopt_set;
+ char rewrite_host_header_opt; /* wether to rewrite the Host: header */
+ char rewrite_host_header_opt_set;
size_t recv_buffer_size;
char recv_buffer_size_set;
} proxy_server_conf;
Index: src/modules/proxy/proxy_http.c
===================================================================
RCS file: /cvs/apache/apache-1.3/src/modules/proxy/proxy_http.c,v
retrieving revision 1.67
diff -u -r1.67 proxy_http.c
--- proxy_http.c 2000/02/29 14:24:27 1.67
+++ proxy_http.c 2000/05/01 01:48:52
@@ -172,7 +172,7 @@
const char *strp;
char *strp2;
const char *err, *desthost;
- int i, j, sock, len, backasswards;
+ int i, j, sock, len, backasswards, sent_host;
array_header *reqhdrs_arr;
table *resp_hdrs;
table_entry *reqhdrs;
@@ -307,11 +307,31 @@
ap_hard_timeout("proxy send", r);
ap_bvputs(f, r->method, " ", proxyhost ? url : urlptr, " HTTP/1.0" CRLF,
- NULL);
- if (destportstr != NULL && destport != DEFAULT_HTTP_PORT)
- ap_bvputs(f, "Host: ", desthost, ":", destportstr, CRLF, NULL);
- else
- ap_bvputs(f, "Host: ", desthost, CRLF, NULL);
+ NULL);
+
+ /* if ProxyRewriteHostHeader is off, look for the incoming Host
+ header and send it along unchanged */
+ sent_host = 0;
+ if (conf->rewrite_host_header_opt_set && !conf->rewrite_host_header_opt) {
+ reqhdrs_arr = ap_table_elts(r->headers_in);
+ reqhdrs = (table_entry *) reqhdrs_arr->elts;
+ for (i = 0; i < reqhdrs_arr->nelts; i++) {
+ if (reqhdrs[i].key != NULL && reqhdrs[i].val != NULL &&
+ !strcasecmp(reqhdrs[i].key, "Host")) {
+ ap_bvputs(f, "Host: ", reqhdrs[i].val, CRLF, NULL);
+ sent_host = 1;
+ break;
+ }
+ }
+ }
+
+ /* otherwise, make up a new one based on desthost and destport */
+ if (!sent_host) {
+ if (destportstr != NULL && destport != DEFAULT_HTTP_PORT)
+ ap_bvputs(f, "Host: ", desthost, ":", destportstr, CRLF, NULL);
+ else
+ ap_bvputs(f, "Host: ", desthost, CRLF, NULL);
+ }
if (conf->viaopt == via_block) {
/* Block all outgoing Via: headers */