我有一个简单的配置文件,用于在维护时服务器自定义 503 错误页面。相关部分是这样的:
server {
listen 80 default;
root /usr/share/nginx/html;
server_name example.com;
location / {
if (-f $document_root/503.json) {
return 503;
}
}
# error 503 redirect to 503.json
error_page 503 @maintenance;
location @maintenance {
rewrite ^(.*)$ /503.json break;
}
}
问题是 Nginx 发现任何请求都会在静态文件中解析,并且任何 POST、PUT 和 DELETE 请求都会得到 405(方法不允许)响应。
所以问题是:我如何告诉 Nginx 为我的页面提供任何 HTTP 方法?
我今天遇到了这个。看来这个问题是由于 nginx(像大多数服务器一样)不允许您
POST
访问静态文件。
解决方案是捕获@503位置块中的405错误,服务 维护页面。此外,您还必须启用 @recursiveerrorpages@,因为你是第一个,故意抛出一个 503 错误,然后用户通过发布到您的网站抛出 405 静态文件:
recursive_error_pages on;
if (-f $document_root/system/maintenance.html) {
return 503;
}
error_page 404 /404.html;
error_page 500 502 504 /500.html;
error_page 503 @503;
location @503 {
error_page 405 = /system/maintenance.html;
# Serve static assets if found.
if (-f $request_filename) {
break;
}
rewrite ^(.*)$ /system/maintenance.html break;
}
来源:https://www.onehub.com/blog/2009/03/06/rails-maintenance-pages-done-right/
也许尝试强制 405 请求成为实际的 URI:
error_page 405 = $uri;
不知道为什么,但我的 POST 请求在使用命名位置时只得到 405。
所以我将@更改为/,用
internal
,然后GET/POST将得到503与json。
error_page 503 /503;
location /503
{
internal;
root /path/to/config;
try_files /503.json =404;
}