php - 如何提供通过 nginx 中的 404 页面请求的媒体内容?
问题描述
我正在运行一个 nginx 服务器,它基本上有一个空的“图像”目录和一个 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;
}
根据文档error_page
始终返回该错误代码(可以强制状态代码),但始终返回硬编码的状态代码。将查找该文件,然后如果找不到,则转到您的then 如果这不起作用将返回一个 true 。try_files
404.php
404
推荐阅读
- angular - Swagger CodeGen,使代理删除某些元素并被简化
- oracle - ORA-00904: "S"."AIR_TIME": 标识符无效
- conv-neural-network - 我可以在任何任务中使用 ROI Pooling 从整个图像的特征图中提取区域特征吗?
- javascript - 自动完成无法通过 https laravel php
- angular - Angular 11 Firebase 服务器端渲染无限加载/挂起
- google-translate - 谷歌翻译与谷歌云翻译
- python - Keras 中的 1D CNN:如果过滤器的数量和 kernel_size 太低,它会在序列中间停止卷积吗?
- php - Codeigniter 4 在最新的 PHP 8 中不起作用
- html - 如何使 django 酥脆的表单具有响应性?
- oracle - Oracle 函数的小字符串缓冲区