Nginx try_files 问题

Nginx try_files 问题

好的 - 我已经使用这个规则一段时间了

location ~* /(?:abc12345|12abcdef)/(.*\.(jpe?g|gif|png)) {
    alias /usr/local/image/$1;
    error_page 404 /handler.php;
}

如果图像文件存在,则提供服务 - 如果文件不存在,则名为 /handler.php 的自定义 404 错误页面将负责提供服务。如果图像没有变化,它将返回 304 - 新图像将返回 200。几乎完美。

问题是,返回带有图像的 404 并不是正确的做法 - 我应该接受请求,确定文件是否存在,如果不存在则运行处理程序并返回图像 - 而不是显示 404。

我尝试用 try_files 替换 error_page,但没有得到预期的结果:

 location ~* /(?:abc12345|12abcdef)/(.*\.(jpe?g|gif|png)) {
     alias /usr/local/image/$1;
     try_files $uri $uri/ /handler.php;
 }

try_files 中似乎没有匹配项,因此所有请求都转到 handler.php。我理解别名是一种特殊的匹配模式,但如果我尝试输入

try_files "" /handler.php;

哪个有效,但是“”返回不正确的内容类型(Content-Type:·application / octet-stream),而handler.php返回正确的内容类型(Content-Type:·image / jpeg)

当然,我可以添加“default_type image/jpeg;”来强制使用默认值,但当实际图像可能是 gif 或 png 时,我可能会返回 jpeg 内容类型。

我正在运行 debian 6-nginx-1.0.6-1~dotdeb.2

关于如何实现这个功能你有什么想法吗?

答案1

首先,你可以使用以下命令强制 Nginx 从脚本返回状态代码error_page

location ~* /(?:abc12345|12abcdef)/(.*\.(jpe?g|gif|png)) {
    alias /usr/local/image/$1;
    error_page 404 = /handler.php;
}

该等号告诉 Nginx 返回来自handler.php而不是 的状态代码404

从 开始try_files,尝试此配置:

location ~* /(?:abc12345|12abcdef)/(.*\.(jpe?g|gif|png)) {
    root /usr/local/image;
    try_files /$1 /handler.php;
}

相关内容