nginx 使用重写作为动态 404 图像

nginx 使用重写作为动态 404 图像

我想根据请求的 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;

根据ngx_http_core_module 文档

如果您的文件不存在,它应该返回默认的 404 而不是 200。

只需告诉 nginx 针对所有 404 错误返回此文件。

此代码应放置在您的条件上方和位置块中:

location ~ /img {
    error_page 404 /srv/www/static/img/notfound.jpg;

    if (!-f $request_filename){

相关内容