当根目录不存在时为 nginx 创建后备错误页面

当根目录不存在时为 nginx 创建后备错误页面

我在 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该页面。

我如何创建一个后备错误页面来捕获这些失败的请求?

答案1

下面的代码应该可以解决你的问题

  http {
      server {
          error_page 404 http://www.mywebsite.com/error.php;
          error_page 500 http://www.mywebsite.com/error.php;

    }
  ................
  ................
    } 

答案2

这可能会起作用:(您可以尝试指定确切的错误 URL,而不是在最后一个位置返回 404)

location / { 
        try_files $uri $uri/ @notfound;
    }

location @notfound {
  root /usr/share/nginx/sites/errorpages;
  return 404;
}

答案3

我可能需要对此进行更多的考虑,但是如果你尝试以下方法会怎样:

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
}

(当然你必须创建errors/404.html)

答案4

尝试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该站点不存在

相关内容