| From | Sent On | Attachments |
|---|---|---|
| Manlio Perillo | Feb 10, 2008 2:20 am | .patch |
| Subject: | [ANN] use_x_forwared_host.patch | |
|---|---|---|
| From: | Manlio Perillo (manl...@public.gmane.org) | |
| Date: | Feb 10, 2008 2:20:48 am | |
| List: | ru.sysoev.nginx | |
| Attachments: | ||
Hi.
I have written a small patch for nginx that allows the use of the X-Forwarded-Host instead of the Host header.
The rationale is that some hosting companies that use Apache as main web server do not set the correct Host header in the proxied request.
With this patch nginx behind a proxy server is able to properly do virtual hosting.
The patch adds a new configuration directive `use_x_forwarded_host` in the main configuration context. This directive is a flag and its default value is `off`.
I would like to receive a review for this patch.
Thanks Manlio Perillo
diff -r e24850f69497 src/http/ngx_http.c --- a/src/http/ngx_http.c Tue Jan 22 11:49:18 2008 +0100 +++ b/src/http/ngx_http.c Sun Feb 10 11:14:22 2008 +0100 @@ -363,6 +363,22 @@ ngx_http_block(ngx_conf_t *cf, ngx_comma hk->value = header; }
+ if (cmcf->use_x_forwarded_host) {
+ /* Use the X-Forwarded-Host instead of the Host header */
+ ngx_http_header_t *header = ngx_palloc(cf->pool,
sizeof(ngx_http_header_t));
+
+ header->name.data = (u_char *) "X-Forwarded-Host";
+ header->name.len = sizeof("X-Forwarded-Host") - 1;
+ header->offset = offsetof(ngx_http_headers_in_t, host);
+ header->handler = ngx_http_headers_in[0].handler;
+
+ hk = headers_in.elts;
+
+ hk->key = header->name;
+ hk->key_hash = ngx_hash_key_lc(header->name.data, header->name.len);
+ hk->value = header;
+ }
+
hash.hash = &cmcf->headers_in_hash;
hash.key = ngx_hash_key_lc;
hash.max_size = 512;
diff -r e24850f69497 src/http/ngx_http_core_module.c
--- a/src/http/ngx_http_core_module.c Tue Jan 22 11:49:18 2008 +0100
+++ b/src/http/ngx_http_core_module.c Sun Feb 10 11:14:22 2008 +0100
@@ -92,6 +92,13 @@ static ngx_conf_enum_t ngx_http_core_re
static ngx_command_t ngx_http_core_commands[] = {
+ { ngx_string("use_x_forwarded_host"), + NGX_HTTP_MAIN_CONF|NGX_CONF_FLAG, + ngx_conf_set_flag_slot, + NGX_HTTP_MAIN_CONF_OFFSET, + offsetof(ngx_http_core_main_conf_t, use_x_forwarded_host), + NULL }, + { ngx_string("variables_hash_max_size"), NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1, ngx_conf_set_num_slot, @@ -2144,6 +2151,8 @@ ngx_http_core_create_main_conf(ngx_conf_ return NGX_CONF_ERROR; }
+ cmcf->use_x_forwarded_host = NGX_CONF_UNSET; + cmcf->server_names_hash_max_size = NGX_CONF_UNSET_UINT; cmcf->server_names_hash_bucket_size = NGX_CONF_UNSET_UINT;
@@ -2159,6 +2168,10 @@ ngx_http_core_init_main_conf(ngx_conf_t { ngx_http_core_main_conf_t *cmcf = conf;
+ if (cmcf->use_x_forwarded_host == NGX_CONF_UNSET) { + cmcf->use_x_forwarded_host = 0; + } + if (cmcf->server_names_hash_max_size == NGX_CONF_UNSET_UINT) { cmcf->server_names_hash_max_size = 512; } diff -r e24850f69497 src/http/ngx_http_core_module.h --- a/src/http/ngx_http_core_module.h Tue Jan 22 11:49:18 2008 +0100 +++ b/src/http/ngx_http_core_module.h Sun Feb 10 11:14:22 2008 +0100 @@ -99,6 +99,7 @@ typedef struct {
ngx_array_t variables; /* ngx_http_variable_t */
+ ngx_flag_t use_x_forwarded_host; ngx_uint_t server_names_hash_max_size; ngx_uint_t server_names_hash_bucket_size;






.patch