Работа с хедером 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