cababunga
cababunga

Reputation: 3114

Return 503 for POST request in Nginx

I have simple configuration file that is used to server custom 503 error page at a time of maintenance. The relevant part is this:

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;
    }
}

The problem is Nginx figures out that any request resolves in a static file and any POST, PUT and DELETE requests get 405 (method not allowed) response.

So the question is: how do I tell Nginx to serve my page for any HTTP method?

Upvotes: 7

Views: 5991

Answers (3)

bigiCrab
bigiCrab

Reputation: 121

Don't know why, but my POST requset only get 405 when using named location.

so I change @ to /, with internal, then GET/POST will get 503 with json.

error_page 503 /503;
location /503
{
    internal;

    root /path/to/config;
    try_files /503.json =404;
}

internal doc here

I am on nginx/1.24.0

Upvotes: 0

Jay
Jay

Reputation: 4280

I ran into this today. It seems the issue is due to nginx (like most servers) not letting you POST to a static file.

The solution is to capture 405 errors in your @503 location block, serving the maintenance page. In addition, you will have to enable @recursiveerrorpages@, since you are first, intentionally, throwing a 503 error, and then the user is throwing a 405 by posting to your static file:

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;
}

Source: https://www.onehub.com/blog/2009/03/06/rails-maintenance-pages-done-right/

Upvotes: 9

Femi
Femi

Reputation: 64700

Maybe try forcing the 405 requests to be the actual URI:

error_page 405 = $uri;

Upvotes: 0

Related Questions