答案1
在此
http
部分(任何部分之外server
)检查用户是否是开发人员:map $http_cookie $isDevHack { default ""; ~DEVELOPER_SECRET=1010 "/non-existed-location"; }
DEVELOPER_SECRET
如果用户在这种情况下拥有值,则他为开发人员1010
。此映射在配置中为所有服务器共享。附加
server
503 错误处理程序部分:error_page 503 @maintenance; location @maintenance { rewrite ^(.*)$ /maintenance-mode.html break; }
maintenane-mode.html
是维护模式下向非开发人员用户显示的页面。文件路径相对于document_root
当前server
。location
在维护模式下必须保护的部分中,在任何正常模式规则之前添加:if (-f "$isDevHack/home/site-home/maintenance") { return 503; }
如果当前用户是开发人员,则检查的文件名将添加前缀
/non-existed-location
,并且if
永远不会输入。
答案2
我有一个相当简单的服务器设置,答案末尾的配置将执行以下操作:
如果名为的文件
MAINTENANCE
存在于根目录的上一级,则服务器将处于维护模式。(这是测试-f
)。但如果存在一个名为
foo_dev
值为 的cookiesecret!
,则上述检查将被绕过,并且 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 时显示一个大警告,这样我就不会错误地忘记该网站处于维护模式。