Я настроил конфигурацию любого домена на моем сервере nginx - чтобы уменьшить объем работы, необходимой при открытии нового сайта / домена. Эта конфигурация позволяет мне просто создать папку в /usr/share/nginx/sites/
с именем домена / поддомена и тогда он просто работает. ™
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;
}
}
Однако есть одна проблема, которую я хотел бы решить: когда домен, у которого нет папки в каталоге сайтов, nginx выдает внутреннюю страницу ошибки 500, потому что он не может перенаправить на /errorpages/error.php
поскольку его не существует.
Как я могу создать резервную страницу ошибок, которая будет перехватывать эти неудавшиеся запросы?
Попробуйте использовать if
условный на вашем сервере, который обрабатывает случаи, когда этот веб-сайт не существует
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;
...
И добавьте index.html
в /usr/share/nginx/sites/notexist
описывая, что сайт не существует
Резервные страницы ошибок в nginx работают так:
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;
}
Возможно, мне нужно подумать об этом подробнее, но что, если вы попробуете что-то вроде:
location /errorpages {
try_files $uri $uri/ @fallback
}
location @fallback {
root /usr/share/nginx/sites/default
... error page directives ...
}
Где по умолчанию содержатся страницы ошибок для несуществующих сайтов.
В основном попробуйте создать условный корень.
Видеть: http://end.re/2011/05/02/nginx-alternative-root-with-conditional-autoindex/
Обновить
Это сработало для случая 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
}
(Конечно, вы должны создать error / 404.html)
Может быть, это сработает: (вместо возврата 404 в последнем месте вы можете попробовать указать точный URL-адрес ошибки)
location / {
try_files $uri $uri/ @notfound;
}
location @notfound {
root /usr/share/nginx/sites/errorpages;
return 404;
}
Ниже фрагмент кода должен решить вашу проблему
http {
server {
error_page 404 http://www.mywebsite.com/error.php;
error_page 500 http://www.mywebsite.com/error.php;
}
................
................
}