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