我可以使用 nginx 重定向到最近的文件吗?

Jar*_*ndt 5 nginx

我想知道是否可以让 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
...
Run Code Online (Sandbox Code Playgroud)

我想将对“file.txt”的请求重写为该文件的最新版本。这就是我想做的事情:

root /var/files;
rewrite file.txt $(ls -v /var/files | tail -1);
Run Code Online (Sandbox Code Playgroud)

或者302也不错!

location file.txt {
    return 302 $(ls -v /var/files | tail -1);
}
Run Code Online (Sandbox Code Playgroud)

另请注意,符号链接不是一个选项:( 我希望由 nginx 或 nginx 的某些扩展来处理此问题。

Jar*_*ndt 4

我对这个问题的解决方案最终被证明是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"
Run Code Online (Sandbox Code Playgroud)

启动 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;
}
Run Code Online (Sandbox Code Playgroud)

使用此策略,您可以使用位置块捕获任何类型的请求,并让 shell 脚本确定该 URI 的输出应该是什么。

nginx/fcgiwrap 的更多信息/示例可以在NGINX 文档中找到。