通过php的`header()`函数设置`content-disposition`为`attachment`并读取文件流,可以在浏览器中强制触发下载对话框。实现referer防盗链校验时,需检查`$_server['http_referer']`是否包含预期的域名白名单,若校验失败则终止脚本或返回403错误。

如何配置HTTP头以强制浏览器下载而非预览
核心在于发送正确的MIME类型和`Content-Disposition`头。将`Content-Type`设为`application/octet-stream`可告知浏览器这是二进制数据,而`Content-Disposition: attachment; filename="..."`明确指示浏览器将其作为附件处理,从而弹出保存窗口。

<?php $file = 'document.pdf';
$path = '/path/to/' . $file;
if (file_exists($path)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . basename($path) . '"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($path));
readfile($path);
exit;
}
?>
上述代码首先验证文件是否存在,随后依次设置描述、类型、处置方式及缓存控制头。`readfile`直接输出文件内容到输出缓冲区,配合`exit`确保后续无额外HTML输出干扰二进制流。此方法适用于大多数文件类型,能有效避免浏览器内嵌预览。
如何基于HTTP Referer头实现简单的访问控制
利用`$_SERVER['HTTP_REFERER']`变量获取请求来源页面URL。通过解析该URL的主机部分并与预设的合法域名列表比对,可以判断请求是否来自可信源。若来源不在白名单内,则拒绝提供文件下载服务。

<?php $allowed_hosts = ['example.com', 'www.example.com'];
$referer = isset($_SERVER['HTTP_REFERER']) ? parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST) : '';
if (!in_array($referer, $allowed_hosts)) {
http_response_code(403);
die('Access Denied: Invalid Referer');
}
// 此处接上面的下载逻辑
$file = 'document.pdf';
$path = '/path/to/' . $file;
if (file_exists($path)) {
header('Content-Disposition: attachment; filename="' . basename($path) . '"');
readfile($path);
}
?>
代码首先从`$_SERVER`中提取`HTTP_REFERER`,并使用`parse_url`提取主机名以简化匹配逻辑。接着检查该主机名是否在`$allowed_hosts`数组中。如果校验失败,立即发送403状态码并终止执行。这种机制能防止外部网站直接链接盗取文件,但需注意Referer头可能被用户代理伪造或省略,因此仅适用于基础防护场景。
当Referer头为空或缺失时程序应如何处理
在隐私模式、HTTPS跳转至HTTP或某些移动应用中,`HTTP_REFERER`可能为空字符串。此时`parse_url`返回`null`,导致`in_array`校验失败。默认行为是拒绝访问,但这可能误伤合法用户。更稳健的做法是将空Referer视为特定策略:要么严格禁止(适合高敏感资源),要么允许(适合公开资源但需其他认证)。在本示例中,我们保持严格模式,即空Referer被视为非法来源。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











