Abaixo, parte do código deve resolver seu problema
http {
server {
error_page 404 http://www.mywebsite.com/error.php;
error_page 500 http://www.mywebsite.com/error.php;
}
................
................
}
Eu configurei uma configuração de qualquer domínio no meu servidor nginx - para reduzir a quantidade de trabalho necessária ao abrir um novo site / domínio. Esta configuração permite-me simplesmente criar uma pasta em /usr/share/nginx/sites/
com o nome do domínio / subdomínio e depois funciona. ™
server {
# Catch all domains starting with only "www." and boot them to non "www." domain.
listen 80;
server_name ~^www\.(.*)$;
return 301 $scheme://$1$request_uri;
}
server {
# Catch all domains that do not start with "www."
listen 80;
server_name ~^(?!www\.).+;
client_max_body_size 20M;
# Send all requests to the appropriate host
root /usr/share/nginx/sites/$host;
index index.html index.htm index.php;
location / {
try_files $uri $uri/ =404;
}
recursive_error_pages on;
error_page 400 /errorpages/error.php?e=400&u=$uri&h=$host&s=$scheme;
error_page 401 /errorpages/error.php?e=401&u=$uri&h=$host&s=$scheme;
error_page 403 /errorpages/error.php?e=403&u=$uri&h=$host&s=$scheme;
error_page 404 /errorpages/error.php?e=404&u=$uri&h=$host&s=$scheme;
error_page 418 /errorpages/error.php?e=418&u=$uri&h=$host&s=$scheme;
error_page 500 /errorpages/error.php?e=500&u=$uri&h=$host&s=$scheme;
error_page 501 /errorpages/error.php?e=501&u=$uri&h=$host&s=$scheme;
error_page 503 /errorpages/error.php?e=503&u=$uri&h=$host&s=$scheme;
error_page 504 /errorpages/error.php?e=504&u=$uri&h=$host&s=$scheme;
location ~ \.(php|html) {
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_intercept_errors on;
}
}
No entanto, há um problema que gostaria de resolver e, quando um domínio que não tem uma pasta no diretório de sites, o nginx lança uma página de erro interna 500, porque não pode redirecionar para /errorpages/error.php
como não existe.
Como posso criar uma página de erro de fallback que detecte essas solicitações com falha?
Abaixo, parte do código deve resolver seu problema
http {
server {
error_page 404 http://www.mywebsite.com/error.php;
error_page 500 http://www.mywebsite.com/error.php;
}
................
................
}
Pode ser que isso funcione: (em vez de retornar 404 no último local, você pode tentar especificar o URL de erro exato)
location / {
try_files $uri $uri/ @notfound;
}
location @notfound {
root /usr/share/nginx/sites/errorpages;
return 404;
}
Eu provavelmente preciso pensar mais nisso, mas e se você tentar algo como:
location /errorpages {
try_files $uri $uri/ @fallback
}
location @fallback {
root /usr/share/nginx/sites/default
... error page directives ...
}
Onde o padrão contém as páginas de erro para sites inexistentes.
Basicamente tente criar uma raiz condicional.
Veja: link
Atualizar
Isso funcionou para o caso 404:
location /
try_files $uri $uri/ @errors;
...
}
location @errors {
try_files $uri $uri/ =510;
root /usr/share/nginx/sites/errors;
error_page 404 = /404.html
}
(Você tem que criar os erros / 404.html, claro)
As páginas de erro de fallback no nginx funcionam como:
error_page 400 /400.html;
location = /400.html {
try_files /400.html @error; # <-- this is your missing part 1
internal; # suggested
}
location @error { # <-- this is your missing part 2
root /var/www/error;
}
Tente usar um if
condicional em seu servidor que lida com casos em que esse site não existe
server {
# Catch all domains that do not start with "www."
listen 80;
server_name ~^(?!www\.).+;
client_max_body_size 20M;
# Send all requests to the appropriate host
if(!-d /usr/share/nginx/sites/$host){
set $host notexist
}
root /usr/share/nginx/sites/$host;
index index.html index.htm index.php;
location / {
try_files $uri $uri/ =404;
...
E adicione um index.html
no /usr/share/nginx/sites/notexist
descrevendo que o site não existe