繁体   English   中英

带有正则表达式内部位置的Nginx X-Accel-Redirect导致301

[英]nginx X-Accel-Redirect with regex internal location causes 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;
}

而且一切正常。 但是我尝试了更好的配置(对我来说),在其中我可以为不同的文件类型在config中设置单独的目录:

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/

天哪,为什么? 如果您需要现场示例,请告诉我。

Nginx 文档说:

如果在用正则表达式定义的位置内使用别名,则此类正则表达式应包含捕获,而别名应引用这些捕获(0.7.40)

因此,您需要在regexp中进行捕获,如下所示:

location ~ ^/film/(.+\.flv)$ {
    internal;
    alias /var/www/filmy/$1;
    flv;
}

顺便说一句,为什么要拆分此配置?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM