如何将丢失文件的请求重定向到不同的服务器(nginx配置)?

时间:2013-01-27 07:42:04

标签: configuration nginx

如果在服务器上找不到图像,我想将图像请求重定向到github repo。 我犯了什么错误?

    location ~* \.(gif|jpg|jpeg|png)$ {
            try_files $uri /gitpipe =404;
    }

    location ~* /gitpipe$ {
            proxy_pass https://raw.github.com/Org/$arg_repo/master/$uri;
    }

我将配置更改为下一个

location ~* \.(gif|jpg|jpeg|png)$ {
    try_files $uri /gitpipe =404;   
}

location = /gitpipe {
            proxy_pass http://websaints.net/rlog.php?save;
}

但结果仍然相同。 Nginx不会将请求重定向到静态网址http://websaints.net/rlog.php?save; 所以问题不在$ uri。


btw这个配置工作,但它重定向到uri,而不是代理并缓存它

location ~* \.(gif|jpg|jpeg|png)$ {
    try_files $uri @redirect;
}

location @redirect {
            return 301 http://websaints.net/rlog.php?save&req=$request_uri;
}

... hmmmm

1 个答案:

答案 0 :(得分:1)

首先,您可以轻松地将location更改为:

location = /gitpipe { 

因为它与`^ / gitpipe $'相同,但在nginx中具有最高优先级,因此这样的位置将始终作为第一个。

接下来,如果文件存在,则尝试返回文件,所以使用url:

http://your.domain.com/some_dir/another_dir/some_file.gif

通过第一个location阻止您尝试从root指令启动文件:

root_directive/some_dir/another_dir/some_file.gif

如果这个文件不存在,那么你告诉try_files指令它应该在第二个location块中搜索,这里你是代理传递这样的网址:

proxy_pass https://raw.github.com/Org/$arg_repo/master/$uri;

但是对于我们的例子,它将意味着:

proxy_pass https://raw.github.com/Org/$arg_repo/master//root_directive/some_dir/another_dir/some_file.gif

$arg_repo将改变其值。

您对指令的作用的解释是否与您的想法完全相同?

以下是您可以轻松地重定向到您想要的内容:

location ~ \.(jpg|png|gif) {
   try_files $uri /proxy$request_url =404;
}

location ^~ /proxy(.*) {
   proxy_pass https://your.proxy.domain/$1;
}