nginx 检查是否存在具有不同扩展名的文件名

nginx 检查是否存在具有不同扩展名的文件名

如果不存在带有“.html”扩展名的文件,我需要知道是否存在带有“.th.html”扩展名的相同文件并进行重定向。

现在,在 404 上我正在执行重写,如果 $request_filename 存在,我就会进行重定向。

    try_files $uri $uri/ @thengine;

    error_page 404 = @thengine;

    location @thengine {
            rewrite ^/(.*)\.(htm|html)$ /$1.th.html;

            if (-f $request_filename) {
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_set_header Host $http_host;
                    proxy_intercept_errors on;
                    proxy_redirect off;

                    proxy_pass http://thengine_backend;
            }
    }

我想知道是否有更好的方法可以做到这一点而无需重写。

也许类似

if ($request_filename ~ (some rule to replace extension)){...}

谢谢。

编辑:来自浏览器的所有请求都带有.html,但如果带有.html的文件不存在,我必须检查是否存在带有.th.html的相同文件,并且仅在这种情况下进行重定向。

编辑2:假设有人访问domain-nginx.com/path/to/index.html

  • nginx 必须检查文件是否存在,如果存在,则显示页面
  • 如果文件不存在,则查找 index.th.html
  • 如果 index.th.html 不存在,直接给出 404
  • 如果 index.th.html 确实存在,请设置一些标题和serve domain-app.com/path/to/index.th.html(这里有一个可以处理此类模板的应用程序)

在这段时间内,用户只能看到domain-nginx.com/path/to/index.html而看不到任何重定向或要更改的 URL。

请注意,.th.html 由另一个应用程序处理

答案1

您不需要error_page这里的指令,因为您已经有了指令@thengine的最后一部分try_files。要回答实际问题,我需要澄清您实际上想要发生什么。

对于您的实际用例,我认为这是最简单的解决方案。您可以@thengine像这样修改:

 location @thengine {
     rewrite ^/(.*)\.(htm|html)$ /$1.th.html;

     if (-f $request_filename) {
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
             proxy_set_header Host $http_host;
             proxy_intercept_errors on;
             proxy_redirect off;

             proxy_pass http://thengine_backend;
             break;
     }
     return 404;
}

但是,我不能 100% 确定这种配置是否安全,因为有这篇文章:https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/

nginx 中该指令的当前实现if很容易引起不必要的副作用,需要对实现进行适当的检查。在阅读了上述文章和解释if行为的文章后,我仍然不确定这种解决方案是否安全。

可以使用 Lua 脚本实现更安全的解决方案。

答案2

这个应该可以工作。在引擎的帮助下rewrite。它还不够完整,因为您仍然需要检查是否存在不存在的文件。

location /your_location {
try_files $uri $uri/ @rewrite;
}
location @rewrite {
    if (!-e $request_filename) {
    rewrite ^/(.*)\.html$ /$1.th.html last;
    }
}

错误的答案:

如果你尝试这样的做法会怎样?

try_files $uri.html $uri.th.html =404;

相关内容