访问nginx判断文件是否存在并跳转。
nginx的这个功能呢,通常用于文件服务器或者下载服务器。
如果文件不存在,则跳转到其他端口或者其他服务器上。
方法也超级简单:
用rewrite(地址重定向)来实现。
先给个rewrite官方链接:
http://nginx.org/en/docs/http/ngx_http_rewrite_module.html
nginx中代码实现示例:
server{
listen 80;
servername www.test.com;
access_log /var/log/nginx/80.access.log;
error_log /var/log/nginx/80.error.log;
location /group0/M00{
root /data/fdfs/storage;
ngx_fastdfs_module;
if ( !-e $request_filename ){
rewrite ^/group0/M00(.*)$ http://192.168.100.30:8089/group0/M00$1 permanent;
}
}
}
注意,主要就是这一段代码:
if ( !-e $request_filename ){
rewrite ^/group0/M00(.*)$ http://192.168.100.30:8089/group0/M00$1 permanent;
}
在这里简单说明一下这部分的意思:
!-e 是不为真的意思,
意思就是如果$request_filename这个变量不存在,则会把以/group0/M00开头的所有链接rewrite到http://192.168.100.30:8089/group0/M00 这个地址中。
后面有个permanent,这里是永久重定向。返回状态码301
访问效果就是我在浏览器中输入:
http://www.test.com/group0/M00/test.jpg
如果这个文件在/data/fdfs/storage这个目录中不存在,则会自动跳转到:
http://192.168.100.30:8089/group0/M00/test.jpg
再补充一点,nginx有重试机制,可以通过proxy_next_upstream,指定请求传递到下一个服务器。默认404状态码是不会被传递的。所以需要指定:
proxy_next_upstream error timeout http_404;
这样如果访问一个后端服务器返回404,会传递到下一个服务器上。
nginx 默认不转发post请求,所以如果是post请求还需要加一个参数non_idempotent:
proxy_next_upstream error timeout http_404 non_idempotent;
代码示例:
upstream app {
server 192.168.0.81:8001;
server 192.168.0.82:8002;
}
server
{
server_name www.test.com;
listen 80;
location ~* /\.(html|htm|jsp|php|js)$ {
deny all;
}
location / {
proxy_buffering off;
proxy_pass http://app;
proxy_next_upstream error timeout http_404 non_idempotent; #这里
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
error_log /var/log/nginx/webtest.error.log;
access_log /var/log/nginx/webtest.access.log;
}