12

I want to configure the server to show a maintenance page when it exist. I tried this code and works:

location / {
    try_files /maintenance.html $uri $uri/ @codeigniter;
}

But I noticed it would be served with a 200 status code, and it can cause confusion to search engines. I think the best practice would be returning a 503 status code. On google I find several relevant pages about it, like this. However, they use if to make the redirect and according to nginx documentation it isn't safe to use ifs.

Is there a way of doing it without using if? Is safe to use if in this case?

Thanks.

6

I think the best practice would be returning a 500 status code.

I think you mean 503 instead of 500.

they use if to make the redirect and according to nginx documentation it isn't safe to use ifs.

No. Only return is 100% safe inside if in location context.

According to nginx documentation, you can specify an HTTP status code as the last argument to try_files. I've tried this but it didn't work.

16

Here is what I do.

            if (-f $document_root/maintenance.html) {
                    return 503;
            }
            error_page 503 @maintenance;
            location @maintenance {
                    rewrite ^(.*)$ /maintenance.html break;
            }

If the file is there it will show the maintenance page. Once you remove the file you will go back to normal.

  • 1
    Yeah, that is the same code that is on the link in the question. I'm actually asking if it's safe to use ifs in this case since it should not be used according to documentation. – NeDark Sep 13 '11 at 19:43
  • 1
    And that same documentation: In some cases it's also possible to move ifs to server level (where it's safe as only other rewrite module directives are allowed within it). The maintenance error_page as Mike showed is normally set in server {} context. – Regan Nov 13 '13 at 13:18
  • 1
    I did the same except just did a 'return 503' without checking the existence of the file. That way I can just enable/disable the site (using Debian's "sites-available"/"sites-enabled" layout) by symlinking and turn on the maintenance page. – Asfand Qazi Jul 14 '15 at 11:18
  • Sounds like this would be a performance hit: NGINX will need to check for the existance of a file for every request... – Marc Sep 14 '17 at 7:32
  • Marc, it isn't since commonly accessed files are stored in filesystem cache which is in memory. – Mike Feb 19 '18 at 3:00

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.