好的 - 我一直在使用这个规则一段时间
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
关于如何使这项工作的任何想法?
首先,您可以强制 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)
归档时间: |
|
查看次数: |
3758 次 |
最近记录: |