如何提供通过 nginx 中的 404 页面请求的媒体内容?

How to serve media content that is being requested through a 404 page in nginx?

我是 运行 一台 nginx 服务器,基本上只有一个空的 "image" 目录和一个 404.php 脚本。

每次用户从 nginx 服务器请求图像时,例如"www.example.com/image/12312.png",nginx 服务器从 s3 下载图像,将其存储在特定名称下,并提供它。然后,下次请求相同的图片时,不再需要下载它,因为它已经在服务器上(因此不再触发 404 脚本,这意味着它直接提供图片)。


希望你能看懂基本图。它本质上是镜像媒体内容并立即提供。现在,粗体部分 目前是我无法解决的问题 - 除了该部分之外的其他所有部分都完美无缺!

我猜这是因为nginx服务器沿着图片发送了一个404回复,导致图片不显示。我必须让访问者在第一次请求文件时重新加载页面,这很麻烦。

你知道我该如何解决这个问题吗?


这是我当前用伪代码显示图像(或本例中的视频)的代码:

404.php

// Get requested file
$requestedFile = $_SERVER["REQUEST_URI"];
$localFile = $requestedFile
$remoteFile = "s3.example.com/".$requestedFile

// Download and store file from s3
file_put_contents($remoteFile, $localFile);

// Serve the stored file
// THIS PART IS WHERE I ENCOUNTER PROBLEMS - THE VIDEO IS NOT BEING DISPLAYED!
header('Content-Type: video/mp4');
header('Accept-Ranges: bytes');
header('Content-Length:'.filesize($localFile));
readfile($localFile);

希望您了解我正在尝试做什么以及问题到底是什么。否则我可以给你更多信息。

根据您的配置,我会尝试:

删除

error_page 404 /404.php;

并添加类似

的内容
location / {
        try_files $uri /404.php?$args =404;
}

根据 documentationerror_page 总是 return 错误代码(可以强制状态代码)但总是 return 硬编码状态代码。 try_files 将查找该文件,如果找不到,请转到您的 404.php,如果这不起作用,则 return 一个真正的 404.