在互联网中描述的很多变体如何用nginx显示维护页面。 但我没有find解决scheme来检查用户是否是开发人员,而不是显示开发人员的维护页面。
我使用try_files,这是不正常的,因为我需要任何中频部分input后。 所以我做了我自己的解决scheme,我想分享。 它可以在任何configuration中使用try_files,proxy等等。
在http部分(在任何server部分之外)检查用户是否是开发者:
map $http_cookie $isDevHack { default ""; ~DEVELOPER_SECRET=1010 "/non-existed-location"; }
如果在这种情况下,用户是具有1010值的DEVELOPER_SECRET的开发者。 这个映射是在configuration中的所有服务器共享的。
附加503error handling程序的server部分:
error_page 503 @maintenance; location @maintenance { rewrite ^(.*)$ /maintenance-mode.html break; }
maintenane-mode.html是在维护模式下显示给非开发者用户的页面。 文件path是相对于当前server document_root 。
在维护模式下必须保护的location部分,在任何正常模式规则之前添加:
if (-f "$isDevHack/home/site-home/maintenance") { return 503; }
如果当前用户是开发人员,则选中的文件名将被添加/non-existed-location前缀, if不会被input。
我有一个相当简单的服务器设置,在答案的末尾configuration将执行以下操作:
如果名为MAINTENANCE的文件存在于根的上一级,则服务器将处于维护模式。 (这是-ftesting)。
除了如果有一个名为foo_dev的cookie的值的secret! ,上面所描述的检查将被绕过,nginx会像服务器不在维护模式那样提供数据。 (这是$cookie_foo_dev = "secret!"testing。)
我已经尝试了一些try_files设置,并没有遇到任何问题。
这是configuration。
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永远不会以纯文本forms通过Internet传输。
我还设置了nginx转发请求的服务器,如果设置了cookie foo_dev ,显示一个很大的警告,这样我就不会错误地忘记该站点处于维护模式。