Nginx的try_files gotcha

好的 – 我一直在使用这个规则

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

如果图像文件存在,则将其提供 – 如果该文件不存在,则会自定义一个名为/handler.php的404 error_page用于传递商品。 如果图像不变,则会返回一个304 – 新的图像返回一个200.几乎完美。

问题是,返回一个404与图像是不是正确的事情 – 我应该接受请求,确定文件是否存在,如果不运行处理程序,并返回图像 – 而不是显示404。

我试图用try_filesreplaceerror_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; 

哪个工作,但“”返回不正确的内容types(内容types:·应用程序/八位字节stream),而handler.php返回正确的(内容types:·图像/ jpeg)

当然,我可以添加“default_type image / jpeg;” 强制默认,但我运行的风险,返回一个JPEG格式的内容types时,实际图像可能是GIF或PNG。

我正在运行Debian 6 – nginx-1.0.6-1〜dotdeb.2

任何想法如何使这项工作?

首先,您可以强制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 ,试试这个configuration:

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