прокидка запроса вообще без изменения.

Igor Sysoev is at rambler-co.ru
Thu Nov 23 23:25:53 MSK 2006


On Thu, 23 Nov 2006, Ivan B. Serezhkin wrote:

> Igor Sysoev wrote:
>> 
>> http://sysoev.ru/nginx/docs/http/ngx_http_proxy_module.html#proxy_set_header 
>> http://sysoev.ru/nginx/docs/http/ngx_http_proxy_module.html#proxy_pass_header 
> Сделал  proxy_set_header  Host        $http_host;
> Работает с http/1.1 - здорово, спасибо.
>
> однако :
> GET http://gaia.serezhkin.com/ HTTP/1.0

Такие запросы распространённые браузеры шлют только при запросе к прокси.
Обычно их не бывает.

> получает проброс опять же
> GET / HTTP/1.0
>
> Но на этот раз без заголовка Host
>
> попробовал Сделал  proxy_set_header  Host        $host;
>
> Получил заголовок Host: `hostname`
>
> Хотелось бы что бы
> " $host, эта переменная равна строке "Host" в заголовке запроса или имени 
> сервера, на который пришёл запрос, если этой строки нет;"
> Вот это самое имя сервера, которое даже нигде не указано, бралось из запроса.

Имя сервера - это то, что указано в server_name.

> У меня идея заставить нгинкс пробрасывать всё в вообще не изменённом виде на 
> бэкэнд, а некоторые избранные URL+URI обрабатывать самим нгинксом, или кидать 
> на другой бэкэнд. Пытаюсь совместить модперл для себя и mod_php для 
> остальных.
>
> А вообще спасибо.
> У меня на носу слэшдот эфект - я его боюсь, а так хотя бы вменяемыми 
> браузерами всё видно и без напряга.
>
> Завтра попробую воплотить идею с вырезанием имени сервера из URL, имеет смысл 
> слать патчи?

Патч прилагается.


Игорь Сысоев
http://sysoev.ru
-------------- next part --------------
Index: src/http/ngx_http_request.c
===================================================================
--- src/http/ngx_http_request.c	(revision 183)
+++ src/http/ngx_http_request.c	(revision 184)
@@ -1385,9 +1385,16 @@
     ngx_http_core_loc_conf_t  *clcf;
     ngx_http_core_srv_conf_t  *cscf;
 
-    host = r->headers_in.host->value.data;
-    len = r->headers_in.host_name_len;
+    host = r->host_start;
 
+    if (host == NULL) {
+        host = r->headers_in.host->value.data;
+        len = r->headers_in.host_name_len;
+
+    } else {
+        len = r->host_end - host;
+    }
+
     if (vn->hash.buckets) {
         cscf = ngx_hash_find(&vn->hash, hash, host, len);
         if (cscf) {
Index: src/http/ngx_http_variables.c
===================================================================
--- src/http/ngx_http_variables.c	(revision 183)
+++ src/http/ngx_http_variables.c	(revision 184)
@@ -667,13 +667,20 @@
 ngx_http_variable_host(ngx_http_request_t *r, ngx_http_variable_value_t *v,
     uintptr_t data)
 {
-    if (r->headers_in.host) {
-        v->len = r->headers_in.host_name_len;
-        v->data = r->headers_in.host->value.data;
+    if (r->host_start == NULL) {
 
+        if (r->headers_in.host) {
+            v->len = r->headers_in.host_name_len;
+            v->data = r->headers_in.host->value.data;
+
+        } else {
+            v->len = r->server_name.len;
+            v->data = r->server_name.data;
+        }
+
     } else {
-        v->len = r->server_name.len;
-        v->data = r->server_name.data;
+        v->len = r->host_end - r->host_start;
+        v->data = r->host_start;
     }
 
     v->valid = 1;
Index: src/http/ngx_http_parse.c
===================================================================
--- src/http/ngx_http_parse.c	(revision 183)
+++ src/http/ngx_http_parse.c	(revision 184)
@@ -260,7 +260,7 @@
         case sw_schema_slash_slash:
             switch (ch) {
             case '/':
-                r->host_start = p;
+                r->host_start = p + 1;
                 state = sw_host;
                 break;
             default:


More information about the nginx-ru mailing list