网站PDF下载链接异常:下载index.php的HTML文件而非目标PDF
核心问题定位
你的PDF下载功能本地正常,但上线GoDaddy后跳转到index.php纯HTML内容,大概率是路径解析错误、Header输出问题或GoDaddy服务器重写/配置限制导致,以下是针对性修复步骤:
1. 修复文件路径解析错误(最可能原因)
GoDaddy的网站根目录是public_html,PHP脚本默认工作目录是当前脚本所在文件夹(比如你的downloadpdf.php在public_html/prints下),直接使用数据库返回的相对路径会导致PHP找不到文件,触发服务器默认错误处理(返回index.php)。
修复代码:
修改downloadpdf.php中获取文件路径的逻辑,拼接服务器根目录:
// 替换原来的$file_path = getExtensionFromID(...) $relative_path = getExtensionFromID($pdo, $recordID); // 拼接服务器根目录,确保路径绝对正确,同时去掉可能的开头斜杠避免重复 $file_path = $_SERVER['DOCUMENT_ROOT'] . '/' . ltrim($relative_path, '/'); // 先检查文件是否存在,避免报错 if (!file_exists($file_path)) { die("文件不存在:" . $file_path); // 调试用,上线后可替换为友好提示 }
同时确认数据库中extension字段的路径:
- 若PDF文件在
public_html/documents下,字段值应为documents/xxx.pdf(不要带开头的/或../)
2. 修复重复输出与Header问题
你的代码同时使用readFile($file_path)和fopen+fread输出文件内容,会导致重复输出并干扰Header发送;另外未启动Session会导致权限判断逻辑失效,触发跳转。
修复代码:
- 在
downloadpdf.php最开头添加Session启动代码:
<?php session_start(); // 必须在所有输出前启动Session include ("downloadpdf_model.php"); include ("dbh.inc.php");
- 删除重复的文件输出代码,保留简洁的
readFile:
// 保留正确的Header和readFile,删掉后面的fopen循环 header("Content-Type: application/pdf"); header("Content-Disposition: attachment; filename=" . urlencode(basename($file_path))); header("Content-Description: File Transfer"); header("Content-Length: " . filesize($file_path)); readFile($file_path); exit(); // 执行后立即退出,避免后续无关输出
注意:Header中
Content-Type统一用application/pdf即可,无需重复设置application/octet-stream和application/download
3. 检查.htaccess重写规则
GoDaddy默认的.htaccess可能包含伪静态规则,将不存在的文件请求重定向到index.php。检查public_html/.htaccess:
若存在以下规则,确保downloadpdf.php确实存在且路径正确:
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php [L]
如果脚本路径正确但仍被拦截,可在规则中添加例外:
RewriteCond %{REQUEST_URI} !^/prints/downloadpdf.php$
4. 调试技巧(快速定位问题)
在downloadpdf.php开头添加错误输出,直接查看具体报错:
ini_set('display_errors', 1); error_reporting(E_ALL);
上线后记得关闭错误输出,替换为友好提示。
5. 其他注意事项
- 文件权限:PDF文件权限设为
0644,文件夹权限0755即可,无需更高权限 - 检查include文件:
dbh.inc.php和downloadpdf_model.php开头/结尾不要有多余的空格、换行或UTF8 BOM,否则会在Header前输出内容,导致Header发送失败 - 权限判断逻辑:检查
$_SESSION['print-id']是否为笔误,应该是检查用户登录状态(比如$_SESSION['user_id']),否则会触发无意义的跳转
内容的提问来源于stack exchange,提问作者BrAirTec

