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

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

我正在开发一个 Web 应用程序,X-Accel-Redirect header 只能在没有扩展名的文件中正常工作。出于某种原因,如果我向文件名添加扩展名,X-Accel-Redirect 将不起作用。

工作示例:

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

非工作示例:

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

我正在使用 nginx 1.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_files”直接过滤到“内部”而不是首先尝试在其他路径中查找,有什么想法吗?

提前致谢。

最佳答案

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

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

关于php - Nginx:X-Accel-Redirect 在具有已知 MIME 扩展名的文件中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24018946/

相关文章:

node.js - 502 Bad Gateway - Ubuntu 16.04.2 LTS 上的 Meteor 和 nginx

html - 由于 MIME 类型不匹配,CSS 被忽略

javascript - 如何将 Javascript 数组值传递给 PHP,然后使用该值发送 MySQL 查询?

javascript - 谷歌地图多标记不工作

php - 获取mysql中相关标签(需要帮助)

php - 从多行中选择

python - 在 Debian 上使用 Python 3 找不到 mkdir 命令

如果 rewrite_by_lua_block 响应 header 包含模式,nginx 返回 200

mime-types - 原始图像应使用哪种 MIME 类型?

使用 HttpClient 的 C# application/x-www-form-urlencoded OAuth 和 HTTP REST 请求