Nginx 保持页面不重写图像

Nginx holding page without rewriting images

我正在尝试在 Nginx 上为 WordPress 网站设置一个保留页面。保留页面已经存在,但在我们将其移至之前该站点曾经位于 Apache 服务器上。

如果启用维护模式,我可以让它重定向到保留页面,但 holding.png 图像不显示。这是我的 Nginx 代码:

server {
        # Set to on to enable holding page
        set $maintenance off;

        if ($maintenance = on) {
                rewrite ^(.*)$ /holding.html break;
        }
}

保存图像位于项目的根目录中,就像保存页面 HTML 文件一样。

首先,我会让 Nginx 在维护模式下发送 503(服务不可用)HTTP 响应代码。这可以防止搜索引擎在离线时索引您的维护页面。

其次,我会将维护页面的所有静态资产放在一个单独的目录中(例如 maintenance_files),以便它们很好地耦合在一起,并且可以很容易地从重写中排除。

此外,我希望有一种方法可以排除某些人,以便他们能够执行维护任务。这可以通过 IP 或检查 cookie 来完成。然后,您可以 set/unset 使用一段 javascript 粘贴到浏览器检查器中的 cookie。

server {
  error_page 503 @maintenance;

  # Set to 1 to enable holding page
  set $maintenance 0;

  # Always allow access for clients that have the 'maintainer' cookie set
  if ($http_cookie ~* "maintainer") {
    set $maintenance 0;
  }

  location / {
    if ($maintenance) {
      return 503;
    }
  }

  location @maintenance {
    # You might want to use a different document root for the maintenance
    # files so you can freely move and shuffle in the default document root
    # during maintenance. 
    #root /var/www/maintenance/;

    if ($uri !~ ^/maintenance_files/) {
      rewrite ^(.*)$ /holding.html break;
    }
  }
}

为了获得维护权限,请将其粘贴到您的浏览器检查器中:

document.cookie="maintainer=1";

要删除该 cookie:

document.cookie = "maintainer=; expires=Thu, 01 Jan 1970 00:00:00 UTC";

或者,您可以检查磁盘上是否存在文件,而不是将变量 $maintenance 设置为 1。这样你就不必重新加载你的 Nginx 配置来将你的站点置于维护模式。但是,您会在每个请求上添加额外的磁盘查找,这可能是您选择该选项的原因。在这种情况下,运行 在更改 $maintenance 值后执行以下命令:

sudo service nginx force-reload