Take the 2-minute tour ×
Server Fault is a question and answer site for professional system and network administrators. It's 100% free, no registration required.

I'm trying to set a default error_page for my entire nginx server (as in for all vhosts).

I'm trying it with following code:

http {
    ...
    ...
    error_page 404 /var/www/default/404.html;
    ...
    ...
}

Also, I'd like to be able to create a vhost and make it use the default 404.html if I don't explicitly write another one.

Something like:

server {
    ...
    server_name mydomain.com
    root /var/www/mydomain.com/;
    ...
}

Anyways, I'm getting the following error:

[error] 16842#0: *1 open() "/var/www/mydomain.com/var/www/default/404.html" failed (2: No such file or directory)

While I do understand the error, and I do understand why it's happening, I can't understand why can't I tell NGINX to user the default error_page as an absolute path instead of appending it to the root of my vhost.

Any idea how to make it?

Regards

share|improve this question
    
/var/www/default is not the same as /var/default/, did you modify that output by hand at all? –  gparent Feb 21 '13 at 15:41
    
@gparent Oh, yes, sorry, that's a typo in the error. I'll change it in a second. –  alexandernst Feb 21 '13 at 15:41

2 Answers 2

up vote 3 down vote accepted

As you've already discovered, the error_page directive specifies a document that is relative to the document root.

One way to work around this is to create a separate file containing your error page specifications, which contains the appropriate location blocks, and then include that from each server which will use the "global" error_page.

For example, a file /etc/nginx/global404:

location = /404.html {
    root /var/www/default;
}

error_page 404 /404.html;

Now in each server block, you will:

include global404;
share|improve this answer
    
This indeed is a solution, but it's not perfect. Isn't there really some way I could tell NGINX to use a default error_page without having to put it on every server{} ? –  alexandernst Feb 22 '13 at 7:56
    
Nope, sorry. This is about the best you can do. –  Michael Hampton Feb 22 '13 at 8:01
    
Do you know if this was asked in the ML of NGINX? If it wasn't, I could try asking and see if they can implement it. –  alexandernst Feb 22 '13 at 8:07
    
You can try. Maybe Igor will implement it, or maybe he will yell at you. :) –  Michael Hampton Feb 22 '13 at 8:08
    
Hahaha, let's hope he'll do the first! Or at least won't do the second :P –  alexandernst Feb 22 '13 at 8:08

I plan to use the include approach previously submitted but, for the sake of thoroughness, an alternative: Use symlinks. It still requires an extra operation for each vhost you manage but it does offer the benefit of not requiring further server config changes and restarts.

http {
    ...
    ...
    error_page 404 /error/404.html;
    ...
    ...
}

...and then in each vhost's root...

ln -s [path to error page html directory] /[vhost root]/error

This approach strikes me as inelegant and unportable (I'd vote it down if I have enough rep to vote things up or down) but it works.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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