好的 - 我已经使用这个规则一段时间了
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;
}