Работа с хедером X-Accel-Redirect (в if() )

Yury Yakubovsky support at besthosting.com.ua
Thu Jan 25 11:12:40 MSK 2007


> On 1/24/07, Alexey Polyakov <alexey.polyakov at gmail.com> wrote:
>> Вроде нельзя так. if ($http_x_accel_redirect) это по смыслу означает
>> проверку заголовка X-Accel-Redirect в запросе клиента. Ему там
>> неоткуда взяться.
>>
>> А зачем вообще так извращаться? Есть же стандартный способ с internal.
> 
> Да вроде его я и описывал... откуда у человека выстроилась такая
> жуткая схема - не представляю. :-(
> 
Я nginx настраиваю второй раз, в общей сложности четвертый день.
Первый раз коробочного конфига хватило для одного сайта. Сейчас сложнее.
Может потому родился этот шедевр. :)

ТЗ сейчас в общем такое.
Построить бесплатный хостинг.
Спереди нгинкс отдает всю статику.
Пхп кидает на апач.
Хтмл отдается с прилепкой банера через add_after_body
Мп3-шки и прочая статическая лабуда должна пройти как на народе раньше:
Сначала страничка с банером и надписью "Вы хотите скачать файл...."
Потом переброс на файл и позволить его скачать.
Схему с интерналами я смотрел, но так понял что там ей нормально можно 
воспользоваться если точно в какой папке файл и описать под него локейшн 
с интерналом.
А тут задание 1000вирт. хостов и файл может быть где угодно.
Поэтому кроме как по расширению не придумал.
Сейчас весь конфиг выглядит так:

worker_processes  2;

events {
     worker_connections  1024;
     debug_connection ххх.ххх.ххх.ххх ;
}


http {
     include       conf/mime.types;
     default_type  application/octet-stream;

#spisok domenov
map $http_host $domen  {
hostnames ;
include conf/conf_domen/spisok.conf;
}

# spisok klientov
map $http_host $root  {
hostnames ;
include conf/conf_domen/test.com.conf;
}

#spisok subdomenov
map $http_host $sub  {
hostnames ;
include conf/conf_subdomen/test.com.conf;
}

     server {
         listen       80;
         server_name  _ *;

#igratsa s tonkoy nastroykoy posle zapuska. Ne zabit
     client_header_timeout  3m;
     client_body_timeout    3m;
     send_timeout           3m;
     client_header_buffer_size    1k;
     large_client_header_buffers  4 4k;
     gzip on;
     gzip_min_length  1100;
     gzip_buffers     4 8k;
     gzip_types       text/plain;
     output_buffers   1 32k;
     postpone_output  1460;
     sendfile         on;
     tcp_nopush       on;
     tcp_nodelay      on;
#   send_lowat       12000;
     keepalive_timeout  75 20;


# probros na apache
         location ~ \.php$ {
             proxy_pass   http://127.0.0.1:81;
             proxy_set_header   Host             $host;
             proxy_set_header   X-Real-IP        $remote_addr;
             proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
         }

#dla podstanovki bannera dla htmlek
location /footer.html{
	root /usr/local/nginx/html/banner;
		     }

#perehvat i zavorot failov s raswireniem htm na podstanovku banera
location ~* ^.+\.(html|htm)$ {
                 root /home/$domen/$root/www/$sub;
		add_after_body /footer.html;
}


#vse ostalnie faili lovim kotorie v prediduwih ne slovilis
location ~* ^.+\.(.*)$ {

##############################################
#obrabativaem vsyu stati4nuyu labudu
#stavim peremennuyu chtob otpravit na baner
	
	set $t 0;

#esli eto uje ottuda vernulsa s hederom, to otme4aem eto
	if ($http_x_accel_redirect){
		set $t 1;
				   }
#esli net otmetki, to eto noviy i rewraitim ego na script
	if ($t != 1){
#poka dlya testov tolko pod odno raswirenie. Ne zabit popravit
		rewrite  ^(.*)\.(gz)$  /down.php?path=$1.$2 last;
		    }

##############################################
             root   /home/$domen/$root/www/$sub;
             index  index.html index.htm;
	    autoindex on;
         }

#Ne zabit pomenyat format loga. Etot dlya debuga
log_format  main  '$remote_addr - $remote_user $uri [$time_local] 
$status ''"$request" $body_bytes_sent "$http_referer" ' 
                              ' "$http_x_forwarded_for"';


         access_log  logs/access.log main;
         error_log  logs/error.log ;

         error_page   500 502 503 504  /50x.html;

         location = /50x.html {
             root   html;
         }
        # deny access to .htaccess files, if Apache's document root
         # concurs with nginx's one
         #
         location ~ /\.ht {
             deny  all;
		         }
     		}
}

Пока вот такой имею. Реализация mod_vhost конечно кривоватая, можно было 
просто $http_host реврайтом разбирать, но мне нужна возможность 
выборочно блокировать определенные поддомены чтобы они шли на дефаулт 
плюс парковка.
Потому так.
Если кто скажет что и как поправит и оптимизировать, тому большое 
спасибо, но ногами то не пинайте. Недавно я этим занялся, потому детских 
ляпов может быть много

./nginx -V
nginx version: nginx/0.5.7
built by gcc 4.1.1 20061011 (Red Hat 4.1.1-30)
configure arguments: --prefix=/usr/local/nginx 
--with-pcre=./need/pcre-7.0 --with-zlib=./need/zlib-1.2.3 --with-debug 
--with-http_addition_module







More information about the nginx-ru mailing list