我只有在Nginx的上游经验,而不是静态文件的服务。
Nginx有一个默认的服务器,提供一个欢迎使用nginx! 页面,并在虚拟主机上没有匹配时显示。 我想保持这个默认页面,但覆盖200状态代码为404 。
我不知道如何去做这件事。 有任何想法吗?
您可以使用错误代码返回页面
error_page 404 /index.html;
只要在您的服务器块中将root定义为nginx的默认path即可。 Nginx.org有这方面的大量文档 ,值得一试。
很危险 但是,您可以使用return来响应请求到服务器的任何其他地方,这将正确调用error_page指令。 如果你把它放在你的服务器块的底部,它将作为其他地方没有指定的请求的一个整体。
location / { return 404; }
要真正迂腐,你也可以省略error_page指令,而只是写:
location / { root /path/to/www/nginx; return 404 /index.html; }
…但如果出现任何问题,这可能难以排除故障。
Nginx有一个相当简单的语法来分隔状态码和页面。 在一个server块中,你可以定义一个root ,在那里nginx会查找请求的静态页面。 当一个静态页面被请求并且没有被find,或者不能被读取或者其他事情发生时,nginx获得一个状态码并且采取一个动作。 如果这个代码是200,那么它会处理html,php或者任何可以(通常会)触发对文件系统或者其他一些套接字的一系列请求来提供页面的这个或那个部分。 成功的结果被发送到浏览客户端,并在失败时返回错误的默认页面。 在这两种情况下,都会返回状态码(允许浏览器端定制404和其他错误)。
error_page指令只是告诉nginx接下来的请求。 实际上,这个请求甚至不一定是磁盘上的文件。 它可以是具有自己的一套规则的命名location 。 nginx的默认configuration很好地说明了这一点:
error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/www; }
所以在得到一个503的时候,nginx会请求/50x.html,并且对于50x.html的任何请求的location语句定义了查找这个文件的根path。