假设 nginx 正在提供由 rsnapshot 创建的静态图像文件夹:/rsnapshots/hourly.0/imageA.png /rsnapshots/hourly.0/imageB.png
因此,如果我到这里:
http://example.com/hourly.0/imageA.png
,我会看到 ImageA.png
如果文件自上次备份以来没有更改,RSnapshot 将只创建硬链接。因此,图像 imageA.png 没有更改,但 B 没有更改。因此,我最近在 hourly.0 的备份现在将如下所示:
/rsnapshots/hourly.0/imageA.png /rsnapshots/hourly.0/imageB.png -> /rsnapshots/hourly.1/imageB.png
imageB.png
只是到 /rsnapshots/hourly.1/imageB.png 的一个硬链接(而不是符号链接)。
因此,如果客户要求http://example.com/hourly.0/imageB.png
,他们会得到imageB.png
,但我可以将他们重定向到:http://example.com/hourly.1/imageB.png
,他们会得到相同的图像。
nginx 是否可以 A) 检测硬链接 B) 如果检测到则将客户端重定向到“真实”文件?
编辑:正如 Michael 敏锐地观察到的那样,当涉及硬链接时,没有“真实”文件。它们都只是指向同一文件的指针。在这种情况下,我可以想到对我的问题进行两处修改:1) Nginx 能否在收到请求时探测其他服务器目录,测试文件是否存在,如果它在另一条路径上找到该文件,则将客户端重定向到另一条路径。2) 如果我将问题中的“硬链接”替换为“符号链接”,我是否可以对符号链接进行测试,确定符号链接的位置,然后重定向到符号链接路径?
答案1
据我所知,nginx 无法做到这一点,但还有其他可能的方法,例如:
- 每次备份后生成带有重定向的 nginx 配置文件
- 添加 /elsewhere/index.php 将使用 $_SERVER['PATH_INFO'] 来查找并重定向到最新文件,然后您将打开http://example.com/elsewhere/index.php/imageB.png