Nginx-ru mailing list archive (nginx-ru@sysoev.ru)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Возможно ли удален ие кукисов в запросе перед проксированием на бекенд?
On Wed, May 13, 2009 at 01:10:26PM +0400, Igor Sysoev wrote:
> On Wed, May 13, 2009 at 12:25:27PM +0400, Yura Beznos wrote:
>
> > Не совсем понял.
> >
> > Можете пример привести?
> >
> > В моём случае POST запрос короткий(не более 1000 символов).
>
> Когда появится переменная $request_body (её сейчас нет), то можно будет
> делать так:
>
> client_max_body_size 8k;
> client_body_buffer_size 8k;
>
> proxy_cache_key "$request_method $host$request_uri $request_body";
Патч, добавляющий переменную $request_body. Значение у переменной
появляется в location'ах, передающих запрос проксированному серверу
или fastcgi-серверу. Для минимизации операций копирования лушче увеличивать
размер одного large_client_header_buffers:
server {
large_client_header_buffers 4 4k; # по умолчанию
location / {
client_max_body_size 4k;
proxy_cache_key "$request_method $host$request_uri $request_body";
proxy_pass ...
--
Игорь Сысоев
http://sysoev.ru
Index: src/http/ngx_http_variables.c
===================================================================
--- src/http/ngx_http_variables.c (revision 2160)
+++ src/http/ngx_http_variables.c (working copy)
@@ -62,6 +62,8 @@
ngx_http_variable_value_t *v, uintptr_t data);
static ngx_int_t ngx_http_variable_request_completion(ngx_http_request_t *r,
ngx_http_variable_value_t *v, uintptr_t data);
+static ngx_int_t ngx_http_variable_request_body(ngx_http_request_t *r,
+ ngx_http_variable_value_t *v, uintptr_t data);
static ngx_int_t ngx_http_variable_request_body_file(ngx_http_request_t *r,
ngx_http_variable_value_t *v, uintptr_t data);
@@ -202,6 +204,10 @@
ngx_http_variable_request_completion,
0, 0, 0 },
+ { ngx_string("request_body"), NULL,
+ ngx_http_variable_request_body,
+ 0, 0, 0 },
+
{ ngx_string("request_body_file"), NULL,
ngx_http_variable_request_body_file,
0, 0, 0 },
@@ -1478,6 +1484,56 @@
static ngx_int_t
+ngx_http_variable_request_body(ngx_http_request_t *r,
+ ngx_http_variable_value_t *v, uintptr_t data)
+{
+ u_char *p;
+ size_t len;
+ ngx_buf_t *buf, *next;
+ ngx_chain_t *cl;
+
+ if (r->request_body == NULL || r->request_body->temp_file) {
+ v->not_found = 1;
+
+ return NGX_OK;
+ }
+
+ cl = r->request_body->bufs;
+ buf = cl->buf;
+
+ if (cl->next == NULL) {
+ v->len = buf->last - buf->pos;
+ v->valid = 1;
+ v->no_cacheable = 0;
+ v->not_found = 0;
+ v->data = buf->pos;
+
+ return NGX_OK;
+ }
+
+ next = cl->next->buf;
+ len = (buf->last - buf->pos) + (next->last - next->pos);
+
+ p = ngx_pnalloc(r->pool, len);
+ if (p == NULL) {
+ return NGX_ERROR;
+ }
+
+ v->data = p;
+
+ p = ngx_cpymem(p, buf->pos, buf->last - buf->pos);
+ ngx_memcpy(p, next->pos, next->last - next->pos);
+
+ v->len = len;
+ v->valid = 1;
+ v->no_cacheable = 0;
+ v->not_found = 0;
+
+ return NGX_OK;
+}
+
+
+static ngx_int_t
ngx_http_variable_request_body_file(ngx_http_request_t *r,
ngx_http_variable_value_t *v, uintptr_t data)
{
|