我想知道是否可以让 nginx 重写 URL 以指向文件的最新 (最后自然排序) 版本?基本上,我有一个充满文件修订版本的目录,如下所示:
/var/files/file-5.6.10.3.txt
/var/files/file-5.6.10.12.txt
/var/files/file-5.6.10.20.txt
/var/files/file-5.6.12.1.txt
...
我想将对“file.txt”的请求重写为该文件的最新版本。这就是我想要做的:
root /var/files;
rewrite file.txt $(ls -v /var/files | tail -1);
或者 302 也不错!
location file.txt {
return 302 $(ls -v /var/files | tail -1);
}
还请注意,符号链接不是一个选项:(我希望由 nginx 或 nginx 的一些扩展来处理这个问题。
答案1
我最终解决这个问题的办法是使用 fcgiwrap。这对我来说很有意义,因为我想在 nginx 配置中使用 shell 命令。
首先,安装 fcgiwrap:
apt-get install fcgiwrap
编写一个 shell 脚本来执行您需要的任何类型的逻辑,并将其保存在 nginx 可以访问的地方:
#!/bin/bash
# Filename: /var/www/script
echo "HTTP/1.1 200 OK"
echo "Content-Length: $( echo "$REQUEST_URI" | wc -c )"
echo
echo "$REQUEST_URI"
启动fcgiwrap进程:
fcgiwrap -s unix:/run/myfunsocket
最后,配置 nginx 来处理请求:
location /subdir {
fastcgi_param SCRIPT_FILENAME /var/www/script;
fastcgi_param REQUEST_URI $uri;
fastcgi_pass unix:/run/myfunsocket;
}
使用此策略,您可以捕获带有位置块的任何类型的请求,并让 shell 脚本确定该 URI 的输出应该是什么。
有关 nginx/fcgiwrap 的更多信息/示例,请参阅NGINX 文档。