Since IfIsEvil I've been trying to set up a configuration using the directive try_files
only so that a maintenance page is displayed together with the response code 503, for any URI without exception, i.e. including php pages, if a maintenance file exist.
There are two problems with my configuration:
- The maintenance page does not display for php URIs.
- The response code 503 is not returned if the maintenance.html file exists.
I've seen similar questions [1],[2] but none with a solution that uses try_files
only (as opposed the using the if
directive) and that unconditionally serves a maintenance page with the response code 503, if the corresponding file is present. Is such a solution possible?
Below is my current non-working conf file. It doesn't contain a 503 response code setting because I don't understand where it's supposed to go in order for it to work as described above.
worker_processes 1;
error_log /var/log/nginx/error.log debug;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
index index.php index.html index.htm;
server {
listen 80;
server_name rpi;
root /www;
location / {
try_files /maintenance.html $uri $uri/ /index.php?$args;
# pass the PHP scripts to FastCGI server
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
include fastcgi.conf;
}
}
}
}
I guess that my question could alternatively be phrased like this: Can try_files
be made to work as an if
control structure? If not by itself, can it, with the above goal, be combined with other directives to act as such, excluding the if
directive?
edit: Below is a solution using if
that I'm currently using by including it in the server section:
error_page 503 @maintenance;
if (-f $document_root/maintenance.html) {
return 503;
}
location @maintenance {
try_files /maintenance.html =404;
}