Nginx 每个位置有多个重写规则

Nginx 每个位置有多个重写规则

我已经为某个位置实现了 nginx 重写,但是对于特定的请求,我想将其重写到不同的位置。

location /api {
    if (!-e $request_filename){
        rewrite "^/api/.{2}\.zip" /api/general.zip last; break;
        rewrite ^/api/(.*)$ /api/router.php?rest_data=$1 last; break;
     }
}

因此如果有人请求/api/uk.zip然后就可以正常下载了,但是/api/fr.zip不存在,因此应该重定向至/api/general.zip

我尝试了 2 个位置块,出现了重复位置错误,并且我尝试使用 2 个 if 语句,但第二个语句被忽略了。

如果请求的是其他内容,例如/api/事件那么它应该转发到路由器页面。

答案1

如果是邪恶的,避免使用 if。你是 nginx 的初学者,可能你以前没有见过(检查本指南一个好的开始)。但实际上,避免 if。解决方案通常是try_files反而。

在你的情况下,不能使用唯一标识符try_file,因为如果 zip 文件是两个字符,则需要应用特殊处理。但如果有两个位置,它应该可以工作。类似这样(未经测试):

location ^~ "/api/([0-9a-zA-Z]{2}).zip"  {
    try_files $uri /api/general.zip;
}
location ^~ "/api/(.*)" {
    try_files $uri $uri/ /api/router.php?rest_data=$1;
}

相关内容