Php Nginx:X-Accel-Redirect在具有已知MIME扩展名的文件中不起作用

Php Nginx:X-Accel-Redirect在具有已知MIME扩展名的文件中不起作用,php,nginx,mime-types,x-sendfile,x-accel-redirect,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 非工作示例: X-Accel-Redirect: /protected_files/myfile01.z X-Accel

我正在开发一个webapp,X-Accel-Redirect头只在没有扩展名的文件中工作。出于某种原因,如果我向文件名添加扩展名,X-Accel-Redirect将无法工作

工作示例:

X-Accel-Redirect: /protected_files/myfile01.z
X-Accel-Redirect: /protected_files/myfile01.zip
非工作示例:

X-Accel-Redirect: /protected_files/myfile01.z
X-Accel-Redirect: /protected_files/myfile01.zip
我正在使用nginx1.7.1

一开始,奇怪的是,如果我用未在mime.types文件中注册的东西更改扩展部分(在本例中为“.zip”),它可以正常工作(显然我会相应地重命名该文件),但是使用指向已知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过滤来自X-Accel-Redirect的所有“/protected_文件”直接指向“internal”而不是首先尝试在其他路径中查找,您有什么想法吗


提前感谢。

错误是由于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;
}

希望这能帮助你们中的许多人。

顺便说一句,我已经在SO研究了类似的问题,没有发现任何类似的问题。具体的解决方案是什么?这段代码也是问题所在。@MichaelRogers解决方案是添加以下部分:
location^~/protected\u files
谢谢!省得我再花几个小时来抨击这件事