Nginx:带有“是否为开发人员”检查的维护模式

Nginx:带有“是否为开发人员”检查的维护模式

这很变体互联网上描述了如何使用 nginx 显示维护页面。但我没有找到检查用户是否是开发人员并且不为开发人员显示维护页面的解决方案。

我使用 try_files,它不起作用我需要输入任何 IF 部分后才能执行此操作。所以我制作了自己的解决方案,我想分享一下。它适用于任何带有 try_files、代理等的配置。

答案1

  1. 在此http部分(任何部分之外server)检查用户是否是开发人员:

    map $http_cookie $isDevHack {
        default "";
        ~DEVELOPER_SECRET=1010 "/non-existed-location";
    }
    

    DEVELOPER_SECRET如果用户在这种情况下拥有值,则他为开发人员1010。此映射在配置中为所有服务器共享。

  2. 附加server503 错误处理程序部分:

    error_page 503 @maintenance;
    location @maintenance {
         rewrite ^(.*)$ /maintenance-mode.html break;
    }
    

    maintenane-mode.html是维护模式下向非开发人员用户显示的页面。文件路径相对于document_root当前server

  3. location在维护模式下必须保护的部分中,在任何正常模式规则之前添加:

    if (-f "$isDevHack/home/site-home/maintenance") {
        return 503;
    }
    

    如果当前用户是开发人员,则检查的文件名将添加前缀/non-existed-location,并且if永远不会输入。

答案2

我有一个相当简单的服务器设置,答案末尾的配置将执行以下操作:

  1. 如果名为的文件MAINTENANCE存在于根目录的上一级,则服务器将处于维护模式。(这是测试-f)。

  2. 但如果存在一个名为foo_dev值为 的cookie secret!,则上述检查将被绕过,并且 nginx 将像服务器未处于维护模式一样提供数据。(这是测试$cookie_foo_dev = "secret!"。)

我尝试了一些try_files设置,没有遇到任何问题。

这是配置。

server {
    # ... omitted stuff that does not pertain to the solution ...

    root <some path>;

    if ($cookie_foo_dev = "secret!") {
        break;
    }

    if ( -f $document_root/../MAINTENANCE) {
       return 503;
    }

    error_page 503 @maintenance;
    location @maintenance {
        rewrite ^(.*)$ /maintenance.html break;
    }

    location / {
        proxy_pass http://localhost:8000;
    }
}

所有传入连接都必须使用 HTTPS,因此 cookie 永远不会以纯文本形式在互联网上传输。

我还设置了 nginx 将请求转发到的服务器,以便在foo_dev设置了 cookie 时显示一个大警告,这样我就不会错误地忘记该网站处于维护模式。

相关内容