nginx X-Accel-Redirect с внутренним расположением regex вызывает 301
У меня следующая проблема с nginx. Я установил код для обслуживания защищенных файлов. Это код PHP, который перенаправляет запрос:
$file_path = '';
$start = (isSet($_GET['start']) ? '?start='.$_GET['start'] : '');
if(check_url($org_url)){
header("X-Accel-Redirect: /film/".$file_path.$start); die();
}
else {
header("Location: /403.html");
die();
}
и функция check_url:
function check_url($org_url){
global $file_path;
...
$file_path = $_GET['file'];
...
$hash = md5(...);
if($url_time_to > time() && $hash === $url_hash){ return true; }
else return false;
}
Тогда у меня есть такой конфиг nginx:
location /file/ {
rewrite . /file.php last;
}
location /file.php {
internal;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location /film {
alias /var/www/filmy;
mp4;
flv;
internal;
}
и все это работает. Но я попытался лучше (для меня) конфигурации, где я могу установить отдельные каталоги внутри конфигурации для разных типов файлов:
location /file/ {
rewrite . /file.php last;
}
location /file.php {
internal;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /film/.*\.flv$ {
internal;
alias /var/www/filmy;
flv;
}
location ~ /film/.*\.mp4$ {
internal;
alias /var/www/filmy;
mp4;
Запрос http://unexisting.com/file/....../54agda0g8.flv перенаправляет меня на http://unexisting.com/film/54agda0g8.flv/
Боже, почему? Если вам нужен живой пример, дайте мне знать.
1 ответ
Документация Nginx гласит:
Если псевдоним используется внутри местоположения, определенного с помощью регулярного выражения, то такое регулярное выражение должно содержать захваты, а псевдоним должен ссылаться на эти захваты (0.7.40)
Так что вам нужно иметь захваты в регулярном выражении, например так:
location ~ ^/film/(.+\.flv)$ {
internal;
alias /var/www/filmy/$1;
flv;
}
Кстати, почему вы хотите разделить этот конфиг?