直接改扩展名不会让PHP文件变成MP4,因PHP是文本脚本而MP4是二进制容器;强行重命名会导致服务器拒绝执行、浏览器无法播放、功能完全中断。
PHP 文件是文本脚本,MP4 是二进制媒体容器。把 index.php 改成 index.mp4 不会生成视频,只会让 Web 服务器拒绝执行(或直接下载裸文件),浏览器也无法播放——因为内容根本不是 MP4 格式。
有人用 rename 或 mv 批量把所有 .php 改成 .mp4,结果导致:
ffprobe 检查会报错:Invalid
data found when processing input
真正需要的通常是以下两种场景之一,而不是“强行改后缀”:
readfile() 输出 MP4)伪装成静态 MP4 链接(需 URL 重写 + 正确响应头).php(比如上传时出错),此时才需要安全地重命名先验证文件类型,再批量改名。别跳过这步,否则可能把真实 PHP 脚本当 MP4 删了/改了。
立即学习“PHP免费学习笔记(深入)”;
Linux/macOS 下操作建议:
for f in *.php; do
if file "$f" | grep -q "MP4"; then
mv "$f" "${f%.php}.mp4"
else
echo "SKIP: $f (not MP4)"
fi
done
关键点:
file "$f" 读取文件魔数,比扩展名可靠得多${f%.php} 是 Bash 参数展开,安全去除后缀rename 's/\.php$/.mp4/' *.php 这类无校验命令Get-ChildItem *.php | Where-Object { $_.Length -gt 1MB -and (Get-Content $_.FullName -Encoding Byte -TotalCount 12 | ForEach-Object { $_.ToString("X2") }) -join "" -match "^000000[12]866746F" } | Rename-Item -NewName { $_.Name -replace '\.php$', '.mp4' }(仅作示意,实际建议先用 file 类工具校验)例如访问 /video/123.mp4,实际由 video.php?id=123 处理并输出 MP4 流。Nginx 配置示例:
location ~ ^/video/(\d+)\.mp4$ {
fastcgi_pass php-fpm;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /path/to/video.php;
fastcgi_param QUERY_STRING id=$1;
add_header Content-Type video/mp4;
add_header Content-Transfer-Encoding binary;
}
对应 video.php 必须做两件事:
header('Content-Type: video/mp4'); 和 header('Accept-Ranges: bytes');
readfile($real_mp4_path); 或 fopen()+fpassthru() 输出原始字节,不能有额外空格或 echo
漏掉 Accept-Ranges 会导致 iOS Safari 无法拖动进度条;输出前有 warning 或 BOM 会导致 MP4 解析失败。
核心就一句:扩展名只是个标签,内容决定一切。批量改后缀前,先用 file 看真实类型,再想清楚你到底要“假装是 MP4”还是“纠正错误命名”。