Nginx:X-Accel-Redirect无法在具有MIME扩展名的文件中工作

时间:2014-06-03 15:21:02

标签: php nginx mime-types x-sendfile x-accel-redirect

我正在开发一个webapp,而X-Accel-Redirect标头只能在没有扩展名的文件中正常工作。出于某种原因,如果我在文件名中添加扩展名,则X-Accel-Redirect不起作用。

工作示例:

X-Accel-Redirect: /protected_files/myfile01.z

非工作示例:

X-Accel-Redirect: /protected_files/myfile01.zip

我使用的是nginx 1.7.1。

最初,奇怪的部分是,如果我更改扩展部分(在这种情况下" .zip")与mime.types文件中未注册的内容,它工作正常(显然我重命名文件相应的),但扩展指向一个知道的mime类型(类似" zip"," jpg"," html")将生成一个" 404找不到"错误。

更新 似乎问题是由于我在conf文件中的这个规则:

location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
    try_files $uri =404;
}

出于某种原因,似乎nginx首先在文件系统中测试文件的存在,之后它会尝试"内部/别名"路径。

有关如何让nginx过滤所有" / protected_files"的任何想法从X-Accel-Redirect直接进入"内部"而不是先尝试在其他路径中找到?

提前致谢。

1 个答案:

答案 0 :(得分:7)

错误是由于nginx配置文件中的规则冲突造成的。

所以,解决方案是:

location ^~ /protected_files { # ^~ needed according to the [nginx docs][1] to avoid nginx to check more locations
    internal;
    alias /path/to/static/files/directory;
}

#avoid processing of calls to unexisting static files by my app
location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
    try_files $uri =404;
}

希望这有助于你们中的许多人。

相关问题