如何在“维护模式”期间使用 nginx 提供 HTML 和 JSON?

如何在“维护模式”期间使用 nginx 提供 HTML 和 JSON?

我有一个用于 PHP Web 应用程序的 nginx 配置,我想让它发挥其他作用,但我似乎找不到实现它的方法。我当前的 nginx 配置执行以下操作:

  • 重写//intro/*PHP 驱动的“营销”网站的静态 HTML 页面
  • 如果磁盘上存在则尝试加载/maintenance.html,这仅在部署期间存在
  • 如果/maintenance.html不存在,则通过 FastCGI 向 PHP 发送请求

最终结果是静态页面在部署期间保持可用,而后端 PHP 应用程序可以在部署时停机进行维护。server配置块的重要部分如下所示:

rewrite ^/$ /marketing/index.html last;
rewrite ^/intro/(.*)$ /marketing/$1.html last;

try_files $uri /maintenance.html @webapp;
location @webapp
{
    rewrite ^(.*)$ /index.php?url=$1 last;
}

include php.conf;

php.conf配置处理location ~ \.php$位置并执行所有常规fastcgi_param设置。那里没有特定于项目的内容,所以我没有发布该块。)

除了上述功能之外,我还希望在“维护模式”开启时,/maintenance.html为标准 HTTP 请求提供服务,但在处理 AJAX 请求时使用一些 JSON 进行响应。我发现我可以通过执行以下操作安全地返回基本内容:

if ($http_x_requested_with = XMLHttpRequest)
{
    return 503 '{"maintenance":true}';
}

然而,这显然发生在全部请求,而不仅仅是/maintenance.html正在提供服务的请求。看来我需要在某个地方设置一些标志,因为它try_files不允许您根据所选文件或位置执行其他操作。

有没有某种方法可以配置 nginx 以返回 HTML 和 JSON 维护模式详细信息?

编辑:maintenance.html进一步考虑后,也许完全退出会更好try_files,这样就可以获得 503 状态而不是 200 状态。

相关内容