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

Yury Yakubovsky support at besthosting.com.ua
Wed Jan 24 23:42:57 MSK 2007


Здравствуйте.

Задача: При попытке скачать gz файлы пропустить запрос через скрипт с 
проверкой прав. (Читал тут: 
http://blog.kovyrin.net/2006/11/01/nginx-x-accel-redirect-php-rails/)


Есть такой конфиг

         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;
         }


location ~* ^.+\.(.*)$ {
set $t 0;
if ($http_x_accel_redirect){
	set $t 1;
			   }
if ($t != 1){
	rewrite  ^(.*)\.(gz)$  /down.php?path=$1.$2 last;
	    }

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

В скрипте down.php пока что просто
<?php
$path = $_GET["path"];
header("X-Accel-Redirect:".$path);
?>

Может невнимательно читал, но по идее.
Пришел запрос на файл с расширением gz;
Хедера $http_x_accel_redirect еще не установлено, поэтому
переменную $t не устанавливаем в 1;
Если $t не установлена в 1, то делаем реврайт на down.php;
Из down.php запрос возвращается на тот же ури, но уже с установленным
$http_x_accel_redirect и посему реврайта не должно быть, а просто 
выдаться файл.

Вопрос: Допускается ли такая конструкция if ($http_x_accel_redirect) и 
что вернет при установленном и не установленном хедере?
И как отрицание в первом ифе сделать чтобы с переменной не танцевать?


По дебаг-логу видно что первый раз проходит по схеме.
После скрипта уже идет с
2007/01/25 06:18:38 [debug] 29263#0: *13 http proxy header: 
"X-Accel-Redirect: /qwert/nginx.tar.gz"

Дальше
2007/01/25 06:18:38 [debug] 29263#0: *13 find location for 
"/qwert/nginx.tar.gz"
2007/01/25 06:18:38 [debug] 29263#0: *13 find location: = "/50x.html"
2007/01/25 06:18:38 [debug] 29263#0: *13 find location: ~ "\.php$"
2007/01/25 06:18:38 [debug] 29263#0: *13 find location: ~ "^.+\.(.*)$"
2007/01/25 06:18:38 [debug] 29263#0: *13 using configuration "^.+\.(.*)$"

2007/01/25 06:18:38 [debug] 29263#0: *13 http script value: "0"
2007/01/25 06:18:38 [debug] 29263#0: *13 http script set var
2007/01/25 06:18:38 [debug] 29263#0: *13 http script var
2007/01/25 06:18:38 [debug] 29263#0: *13 http script if
2007/01/25 06:18:38 [debug] 29263#0: *13 http script if: false
2007/01/25 06:18:38 [debug] 29263#0: *13 http script var
2007/01/25 06:18:38 [debug] 29263#0: *13 http script var: "0"
2007/01/25 06:18:38 [debug] 29263#0: *13 http script value: "1"
2007/01/25 06:18:38 [debug] 29263#0: *13 http script not equal
2007/01/25 06:18:38 [debug] 29263#0: *13 http script if

Вот тут сравнение не проходит и благополучно уходит в зацикловку после 
которой идет на 500 ошибку.








More information about the nginx-ru mailing list