[feature request] X-Sendfile
Igor Sysoev
is at rambler-co.ru
Mon Apr 24 17:30:03 MSD 2006
On Mon, 24 Apr 2006, Sergey Serov wrote:
> On Monday 24 April 2006 05:37, Igor Sysoev wrote:
>> On Sun, 23 Apr 2006, Sergey Serov wrote:
>>> В Apache (ч/з mod_xsendfile) и в lighttpd есть такая замечательная штука
>>> как обработка заголовка ответа X-Sendfile через sendfile(2).
>>> Полезно, если напр. сервер отдающий большие файлы находится далеко от
>>> fastcgi сервера. Да и даже если близко, то нет способа для fastcgi
>>> скрипта авторизовать юзера перед передачей большого файла без
>>> использования редиректов.
>>> В nginx по идее есть sendfile, но только во перловом модуле (как и в
>>> mod_perl Апача). Т.е. обработать ответ от upstream я не могу.
>>> Было бы замечательно, если бы и подобная функциональность была бы и у
>>> nginx.
>>>
>>> P.S. С помощью sendfile можно реализовать много чего, напр. у меня
>>> кешируется динамический контент (примерно так, как у Apache2
>>> mod_disk_cache).
>>
>> nginx поддерживает более общий заголовок "X-Accel-Redirect:
>> /download/file".
>>
>> location /download/ {
>> internal;
>> root ...;
>> }
>>
>> Из ответа бэкенда при этом наследуются заголовки:
>>
>> Set-Cookie
>> Content-Disposition
>> Cache-Control
>> Expires
>> Accept-Ranges
>>
>
> Обнаружил только одну небольшую проблему (или фичу).
> Если напр. конф. такая:
>
> location /download.cgi {
> fastcgi_pass ....
> if ($request_method != "POST") {
> return 405;
> }
> }
> location /download/ {
> internal;
> root ...;
> }
>
> то в /download/ уже оказывается метод != POST и юзер получает 405.
> А на /download.cgi GET'ом долбится бесчисленное множество качалок, хотелось бы
> чтобы они отрубались достаточно просто не доходя до нагруженного fastcgi
> сервера. Как можно надежно проверить в if является ли запрос internal ?
Нужно, чтобы клиент слал только POST, он уходил на FastCGI,
а тот прислылал "X-Accel-Redirect: /download/..." ?
Прилагаемый патч, превращает POST в GET для внтутреннего редиректа и,
кроме того, позволяет вместо
if ($request_method != "POST") {
писать
limit_except POST {
deny all;
}
Игорь Сысоев
http://sysoev.ru
-------------- next part --------------
--- src/http/ngx_http_core_module.c Tue Apr 18 17:51:12 2006
+++ src/http/ngx_http_core_module.c Mon Apr 24 17:26:35 2006
@@ -1328,6 +1328,7 @@
ngx_http_update_location_config(r);
r->internal = 1;
+ r->method = NGX_HTTP_GET;
ngx_http_handler(r);
@@ -2528,6 +2529,7 @@
static ngx_http_method_name_t ngx_methods_names[] = {
{ "GET", (uint32_t) ~NGX_HTTP_GET },
{ "HEAD", (uint32_t) ~NGX_HTTP_HEAD },
+ { "POST", (uint32_t) ~NGX_HTTP_POST },
{ NULL, 0 }
};
More information about the nginx-ru
mailing list