diff --git a/modules/proxy/mod_proxy.c b/modules/proxy/mod_proxy.c index 46d3b071454..ce03bb48424 100644 --- a/modules/proxy/mod_proxy.c +++ b/modules/proxy/mod_proxy.c @@ -368,6 +368,20 @@ static const char *set_worker_param(apr_pool_t *p, return "multipathtcp is not supported on your platform"; #endif } + else if (!strcasecmp(key, "override_http_host")) { + if (strlen(val) >= sizeof(worker->s->override_http_host)) + return apr_psprintf(p, "Override HTTP Host header length must be < %d characters", + (int)sizeof(worker->s->override_http_host)); + PROXY_STRNCPY(worker->s->override_http_host, val); + worker->s->override_http_host_set = 1; + } + else if (!strcasecmp(key, "override_ssl_sni")) { + if (strlen(val) >= sizeof(worker->s->override_ssl_sni)) + return apr_psprintf(p, "Override SSL SNI length must be < %d characters", + (int)sizeof(worker->s->override_ssl_sni)); + PROXY_STRNCPY(worker->s->override_ssl_sni, val); + worker->s->override_ssl_sni_set = 1; + } else { if (set_worker_hc_param_f) { return set_worker_hc_param_f(p, s, worker, key, val, NULL); diff --git a/modules/proxy/mod_proxy.h b/modules/proxy/mod_proxy.h index d51510fc02f..0cb2ac8a3e7 100644 --- a/modules/proxy/mod_proxy.h +++ b/modules/proxy/mod_proxy.h @@ -498,6 +498,10 @@ typedef struct { apr_int32_t address_ttl; /* backend address' TTL (seconds) */ apr_uint32_t address_expiry; /* backend address' next expiry time */ int sock_proto; /* The protocol to use to create the socket */ + unsigned int override_http_host_set:1; + unsigned int override_ssl_sni_set:1; + char override_http_host[PROXY_RFC1035_HOSTNAME_SIZE]; + char override_ssl_sni[PROXY_RFC1035_HOSTNAME_SIZE]; } proxy_worker_shared; #define ALIGNED_PROXY_WORKER_SHARED_SIZE (APR_ALIGN_DEFAULT(sizeof(proxy_worker_shared))) diff --git a/modules/proxy/proxy_util.c b/modules/proxy/proxy_util.c index 546398da144..753f79e8066 100644 --- a/modules/proxy/proxy_util.c +++ b/modules/proxy/proxy_util.c @@ -3441,7 +3441,10 @@ ap_proxy_determine_connection(apr_pool_t *p, request_rec *r, * backend request URI. */ dconf = ap_get_module_config(r->per_dir_config, &proxy_module); - if (dconf->preserve_host) { + if (worker->s->override_ssl_sni_set) { + ssl_hostname = worker->s->override_ssl_sni; + } + else if (dconf->preserve_host) { ssl_hostname = r->hostname; } else if (conn->forward @@ -4675,7 +4678,11 @@ PROXY_DECLARE(int) ap_proxy_create_hdrbrgd(apr_pool_t *p, apr_table_unset(r->headers_in, "Trailer"); /* Compute Host header */ - if (dconf->preserve_host == 0) { + if (worker->s->override_http_host_set) { + host = worker->s->override_http_host; + apr_table_setn(r->headers_in, "Host", host); + } + else if (dconf->preserve_host == 0) { if (!uri->hostname) { rc = HTTP_BAD_REQUEST; goto cleanup;