目前,我正在配置nginx对某些错误页面和其他“默认”媒体文件(例如favicon.ico和robots.txt)的处理,但遇到了一个小问题,即我无法以某些错误页面的方式工作。
基本上,我想做的是为该服务器的根目录下的服务器提供某些文件,例如/var/www/someserver.com/robots.txt。如果该文件不存在,我希望nginx转到“默认”,即/var/www/default/robots.txt。这是我如何(成功)配置的基本要点:
server {
...
root /var/www/someserver.com;
location ~* ^/(robots\.txt)$ {
error_page 404 = @default;
}
location @default {
root /var/www/default;
}
}
效果很好。
我正在尝试对错误页面执行相同的操作,但是我无法做到这一点:
server {
...
root /var/www/someserver.com;
error_page 404 /404.html;
location ~* ^/(404\.html)$ {
error_page 404 = @default;
}
location @default {
root /var/www/default;
}
}
请注意,在您访问someserver.com/404.html的意义上,这种“工作方式”会首先尝试加载/var/www/someserver.com/404.html,然后回退到/ var / www / default /404.html(如果找不到)。但是,如果您访问someserver.com/blahblah,则仅在/var/www/someserver.com/中设置时才会显示404页面。如果该文件不存在,它不会退回到默认目录。
无论如何,您可能可以完成我想完成的工作(这就是为什么我包括了第一个工作示例)。
有任何想法吗?
编辑:
根据Martin F的回答,这就是我最终得出的结论:
# Doesn't work when error page is returned on a POST request
server {
...
root /var/www/someserver.com;
error_page 404 = @notfound;
error_page 500 502 504 = @server_error;
error_page 503 = @maintenance;
location @notfound {
try_files /404.html /../default/404.html =404;
}
location @server_error {
try_files /500.html /../default/500.html =500;
}
location @maintenance {
try_files /503.html /../default/503.html =503;
}
}
这很棒。上面的error_pages和位置的实际块位于每个虚拟主机都包含的server_defaults.conf文件中,这就是为什么我没有将路径硬编码到每个位置中,而是使用相对路径作为默认值的原因。
编辑2:
这种方法有问题。如果您将POST发送到返回错误的URL,则将使用try_files尝试发送POST请求方法。(对我而言)这将导致405不允许错误,因为nginx本质上是尝试将其发布到例如/default/500.html而不是仅获取该页面。
编辑3:
我发布了一个解决方案,该解决方案与我的最初想法更加接近。