我正在设置一个脚本(http://dbwebb.se/opensource/cimage) 进行一些图像处理,我想缓存生成的图像输出。我这部分工作正常。
我遇到的问题是当有人从缓存中下载图像时。查询字符串上的问号通过代理 URL 传递,因此下载的图像的默认文件名为“test.jpg&height=200”,如果不重命名,则无法在 Windows 上正确打开。
我需要设置某种重写规则,以便将第一个“?”字符更改为“&”。如果请求只是针对文件名而没有任何其他参数,它还需要继续工作。
我需要添加什么才能使 URL 能够通过“?”访问,但以“&”的形式发送到服务器?
起源
http://origin.example.com/img.php?src=folder1/test.jpg&height=200
当前的边缘缓存(这是它现在的工作方式):
http://cdn.example.com/dynimg/folder1/test.jpg&height=200
所需边缘缓存:
http://cdn.example.com/dynimg/folder1/test.jpg?height=200 http://cdn.example.com/dynimg/folder1/test.jpg
nginx 配置(重要区域):
location /dynimg/ {
expires 14d;
proxy_pass http://origin.example.com/img.php?src=;
proxy_cache_valid 200 302 2880m;
proxy_cache_valid 404 1m;
}
答案1
您的图像处理应用程序应发送Content-Disposition
HTTP 标头,其中包含所需的文件名。这样,用户的浏览器将使用该文件名,而不是从请求的 URL 派生的文件名。
Nginx 代理缓存会保存该Content-Disposition
头部,然后用户就会得到正确的文件名。