我想根据请求的 URL 获取动态 404 响应:
foo.jpg 不存在
http://example.com/img/style/thumbnail/foo.jpg
应该显示
http://example.com/img/notfound/thumbnail.jpg
和404 标头状态
我重写部分正确,但似乎无法让它返回 404 状态代码。
我尝试使用以下代码,但没有成功:
location ~ /img {
if (!-f $request_filename){
rewrite "^(.*img\/)style\/([a-zA-Z\_\-[0-9]*)\/?(.+)" $1notfound/$2.jpg;
#so far so good. Now i want to return the rewrite result as a 404 response
error_page 404 = $request_filename;
return 404;
}
}
这给了我默认的 nginx 404 错误页面,而不是带有 404 状态代码的重写 URL。我如何告诉 nginx 使用重写结果作为 404 错误页面?
答案1
你误解了这个$request_filename
变量。它代表物理路径考虑到根和别名指令值以及正在处理的当前 URI 映射到文件。
因此,您的error_page
指令将在内部重定向到与不存在的物理路径相对应的 URI,因为它与进入 if 块所测试的路径相同。
错误指令中的运算符=
不是问题,它只是告诉 nginx 保持当前错误代码不变。您还会转义正则表达式中不需要的一些符号,这会损害可读性。
因此,您的 if 块所执行的操作与位置块使用正则表达式所执行的操作完全相同。
你可以简单地将其简化为:
location /img {
location ~ ^/img/style/([_-a-zA-Z0-9]*) {
error_page 404 /img/notfound/$1.jpg;
}
}
答案2
我认为error_page 404 = $request_filename;
应该
error_page 404 $request_filename;
如果您的文件不存在,它应该返回默认的 404 而不是 200。
只需告诉 nginx 针对所有 404 错误返回此文件。
此代码应放置在您的条件上方和位置块中:
location ~ /img {
error_page 404 /srv/www/static/img/notfound.jpg;
if (!-f $request_filename){