当根目录不存在时为nginx创build回退错误页面

我已经在我的nginx服务器上设置了任何域名configuration,以减less打开新站点/域时所需的工作量。 这个configuration允许我简单地在/usr/share/nginx/sites/目录下创build一个文件夹,域名/子域名,然后就可以了。

 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错误页面,因为它不能redirect到/errorpages/error.php它不存在。

我如何创build一个回退错误页面来捕获这些失败的请求?

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

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

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

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

我可能需要给这个更多的想法,但是如果你尝试这样的事情呢?

 location /errorpages { try_files $uri $uri/ @fallback } location @fallback { root /usr/share/nginx/sites/default ... error page directives ... } 

默认情况下,保存错误页面不存在的网站。

基本上尝试创build一个条件的根。

见: 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 } 

(你必须创build错误/ 404.html当然)

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; }