我有一个用于 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 状态。