Nginx try_files 问题

jim*_*img 1 nginx alias

好的 - 我一直在使用这个规则一段时间

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

如果图像文件存在,则提供它 - 如果文件不存在,一个名为 /handler.php 的自定义 404 error_page 用于交付货物。如果图像没有改变,它将返回 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;
 }
Run Code Online (Sandbox Code Playgroud)

try_files 中似乎没有任何匹配项,因此所有请求都通过 handler.php。我知道别名是一种特殊的匹配模式,但是如果我尝试输入

try_files "" /handler.php;
Run Code Online (Sandbox Code Playgroud)

哪个有效,但是 "" 返回不正确的内容类型 (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

关于如何使这项工作的任何想法?

Ale*_*rov 5

首先,您可以强制 Nginx 在使用时从脚本中返回状态代码error_page

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

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

try_files,试试这个配置:

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