第十四章-PHP与HTTP协议

第十四章-PHP与HTTP协议

一,HTTP 协议详解

HTTP(HyperText Transfer Protocol,超文本传输协议)是互联网上应用最广泛的协议之一,用于客户端(如浏览器)与服务器之间的通信。它是 Web 技术的基石,理解 HTTP 协议是开发 Web 应用的核心基础。以下是 HTTP 协议的全面解析:


一、HTTP 协议基础

1. 协议特性
  • 无状态 (Stateless)
    每个 HTTP 请求相互独立,服务器默认不保存客户端状态(如用户登录信息)。状态管理需通过 Cookie、Session 或 Token 实现。
  • 基于请求-响应模型
    • 客户端发送请求(Request) → 服务器返回响应(Response)。
    • 支持多种数据格式:HTML、JSON、XML、图片、视频等。
  • 灵活可扩展
    • 通过 HTTP 头部(Headers) 扩展功能(如缓存控制、内容协商)。
    • 支持 HTTPS(HTTP + SSL/TLS)加密传输。
2. 协议版本
版本年份核心改进
HTTP/0.91991仅支持 GET 方法,返回纯文本
HTTP/1.01996支持 MIME 类型、状态码、Header
HTTP/1.11999持久连接、管道化、Host 头
HTTP/22015二进制协议、多路复用、头部压缩
HTTP/32022基于 QUIC 协议(UDP)、减少延迟

二、HTTP 消息结构

1. 请求(Request)
GET /index.html HTTP/1.1             # 请求行:方法 + 路径 + 协议版本
Host: www.example.com                # 头部字段(Headers)
User-Agent: Mozilla/5.0
Accept: text/html# 空行(分隔头部和消息体)# 消息体(Body,GET 请求通常为空)
  • 请求方法 (Methods)

    方法用途幂等性
    GET获取资源(参数在 URL)
    POST提交数据(参数在 Body)
    PUT更新完整资源
    DELETE删除资源
    PATCH更新部分资源
    HEAD获取响应头(无 Body)
    OPTIONS查询服务器支持的通信选项
2. 响应(Response)
HTTP/1.1 200 OK                       # 状态行:协议版本 + 状态码 + 状态描述
Content-Type: text/html               # 头部字段(Headers)
Content-Length: 1234
Date: Mon, 01 Jan 2024 12:00:00 GMT# 空行
<!DOCTYPE html>                       # 消息体(Body)
<html>...</html>
  • 状态码 (Status Codes)

    状态码类别常见示例
    1xx信息响应100(继续)
    2xx成功200(OK)、201(Created)
    3xx重定向301(永久重定向)、304(未修改)
    4xx客户端错误400(错误请求)、403(禁止访问)
    5xx服务端错误500(内部错误)、503(服务不可用)

三、核心机制详解

1. 连接管理
  • 短连接 (HTTP/1.0)
    每次请求后关闭 TCP 连接,效率低。
  • 持久连接 (HTTP/1.1)
    • 默认保持 TCP 连接复用(Connection: keep-alive)。
    • 通过 Content-LengthTransfer-Encoding: chunked 处理动态内容。
  • 多路复用 (HTTP/2)
    单个 TCP 连接上并行传输多个请求/响应,解决队头阻塞问题。
2. 缓存机制
  • 强缓存
    • Cache-Control: max-age=3600:资源有效期 1 小时。
    • Expires: Mon, 01 Jan 2024 12:00:00 GMT(HTTP/1.0,已被取代)。
  • 协商缓存
    • Last-Modified + If-Modified-Since:基于时间戳。
    • ETag + If-None-Match:基于内容哈希值。
3. 内容协商

客户端通过 Header 声明偏好,服务器返回最合适的内容:

  • Accept: text/html, application/json(内容类型)
  • Accept-Language: en-US, zh-CN(语言)
  • Accept-Encoding: gzip, deflate(压缩方式)
4. 安全机制
  • HTTPS

    • HTTP over SSL/TLS,加密传输数据。
    • 通过数字证书验证服务器身份。
  • CORS (跨域资源共享)

    Access-Control-Allow-Origin: https://trusted-site.com
    Access-Control-Allow-Methods: GET, POST
    

四、HTTP 头部关键字段

常用请求头
字段用途
Host目标域名(HTTP/1.1 必需)
User-Agent客户端标识(浏览器、操作系统)
Cookie发送服务器设置的 Cookie
Authorization认证凭证(如 Bearer <token>
Content-Type请求体的 MIME 类型(如 application/json
常用响应头
字段用途
Set-Cookie设置客户端的 Cookie
Location重定向目标 URL(配合 3xx 状态码)
Content-Encoding内容压缩方式(如 gzip
Cache-Control缓存策略(如 no-cache
Content-Security-Policy防止 XSS 攻击

二,常见的HTTP 响应设置

一、基础响应设置

1. 设置 HTTP 状态码
// 直接设置状态码 (PHP >= 5.4)
http_response_code(404); // 返回 404 Not Found// 传统方式(兼容旧版本)
header("HTTP/1.1 403 Forbidden");
2. 设置响应内容类型
// 返回 HTML
header('Content-Type: text/html; charset=utf-8');// 返回 JSON(API 开发必备)
header('Content-Type: application/json; charset=utf-8');// 返回纯文本
header('Content-Type: text/plain');// 返回 XML
header('Content-Type: application/xml');

二、重定向与页面跳转

1. 基础重定向
// 302 临时重定向(默认)
header('Location: /new-page.php');
exit; // 必须立即终止脚本执行// 301 永久重定向
header('Location: /permanent-page.php', true, 301);
exit;
2. 延迟重定向
// 3 秒后跳转
header('Refresh: 3; url=/target-page.php');
echo '即将跳转,请稍候...';

三、缓存控制

1. 禁止浏览器缓存
header('Cache-Control: no-cache, no-store, must-revalidate'); // HTTP/1.1
header('Pragma: no-cache'); // HTTP/1.0
header('Expires: 0'); // 代理服务器缓存
2. 设置资源缓存时间
// 缓存 1 小时(适用于静态资源)
header('Cache-Control: public, max-age=3600');
header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 3600) . ' GMT');

四、文件操作相关

1. 文件下载
$filePath = '/path/to/file.zip';header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . basename($filePath) . '"');
header('Content-Length: ' . filesize($filePath));readfile($filePath);
exit;
2. 断点续传支持
header('Accept-Ranges: bytes');
header('Content-Length: ' . filesize($filePath));

五、安全相关头部

1. 防止点击劫持
header('X-Frame-Options: DENY'); // 或 SAMEORIGIN
2. 内容安全策略(CSP)
header("Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.cdn.com");
3. 禁用 MIME 类型嗅探
header('X-Content-Type-Options: nosniff');

六、跨域资源共享(CORS)

1. 简单跨域请求
header('Access-Control-Allow-Origin: *'); // 允许所有域名(慎用)
header('Access-Control-Allow-Origin: https://trusted-site.com'); // 指定域名
2. 预检请求处理
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE');header('Access-Control-Allow-Headers: Content-Type, Authorization');header('Access-Control-Max-Age: 86400'); // 缓存预检结果 24 小时exit;
}

七、Cookie 操作

1. 设置 Cookie
setcookie('user_token',          // Cookie 名称'abc123xyz',           // 值time() + 3600,         // 过期时间(1 小时)'/',                   // 有效路径'.example.com',        // 域名(支持子域名)true,                  // 仅 HTTPS 传输true                   // 禁止 JavaScript 访问(HttpOnly)
);
2. 删除 Cookie
setcookie('user_token', '', time() - 3600, '/', '.example.com', true, true);

八、高级场景示例

1. 构建 JSON API
try {$data = ['status' => 'success', 'data' => fetchData()];http_response_code(200);
} catch (Exception $e) {$data = ['status' => 'error', 'message' => $e->getMessage()];http_response_code(500);
}header('Content-Type: application/json');
echo json_encode($data, JSON_UNESCAPED_UNICODE);
exit;
2. 强制下载大文件(内存优化)
$file = fopen('large-file.iso', 'rb');header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="large-file.iso"');while (!feof($file)) {echo fread($file, 8192); // 分块输出ob_flush();flush();
}fclose($file);
exit;

关键注意事项

  1. 输出顺序问题

    • 所有 header() 调用必须在任何实际输出(包括空格和空行)之前
    • 使用 ob_start() 开启输出缓冲可避免报错
  2. 编码一致性

    header('Content-Type: text/html; charset=utf-8');
    // 同时设置 PHP 内部编码
    mb_internal_encoding('UTF-8');
    
  3. 性能优化

    • 避免频繁设置重复头部
    • 使用 header_remove() 清除不需要的默认头部
  4. 安全防护

    • 敏感操作后立即调用 session_regenerate_id()
    • 使用 header('X-XSS-Protection: 1; mode=block') 启用浏览器 XSS 过滤

三, PHP模拟 HTTP 请求

一、使用 file_get_contents() 发送请求

适用于简单 GET/POST 请求,需开启 allow_url_fopen 配置。

1. 发送 GET 请求
$url = 'https://api.example.com/data?param1=value1&param2=value2';
$response = file_get_contents($url);
echo $response;
2. 发送 POST 请求(表单数据)
$url = 'https://api.example.com/submit';
$data = ['key1' => 'value1', 'key2' => 'value2'];$options = ['http' => ['method' => 'POST','header' => 'Content-Type: application/x-www-form-urlencoded','content' => http_build_query($data)]
];
$context = stream_context_create($options);
$response = file_get_contents($url, false, $context);
echo $response;
3. 发送 POST 请求(JSON 数据)
$url = 'https://api.example.com/submit';
$data = json_encode(['name' => 'Alice', 'age' => 30]);$options = ['http' => ['method' => 'POST','header' => "Content-Type: application/json\r\n",'content' => $data]
];
$context = stream_context_create($options);
$response = file_get_contents($url, false, $context);
echo $response;

二、使用 cURL 扩展

功能更强大,支持 HTTPS、头部设置、文件上传等。

1. 基础 GET 请求
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.example.com/data');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 返回响应内容
$response = curl_exec($ch);
curl_close($ch);
echo $response;
2. 发送 POST 请求(表单数据)
$url = 'https://api.example.com/submit';
$data = ['username' => 'test', 'password' => '123456'];$ch = curl_init();
curl_setopt_array($ch, [CURLOPT_URL => $url,CURLOPT_RETURNTRANSFER => true,CURLOPT_POST => true,CURLOPT_POSTFIELDS => http_build_query($data),CURLOPT_HTTPHEADER => ['Content-Type: application/x-www-form-urlencoded']
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
3. 发送 POST 请求(JSON 数据)
$url = 'https://api.example.com/submit';
$data = json_encode(['title' => 'Test', 'content' => 'Hello World']);$ch = curl_init();
curl_setopt_array($ch, [CURLOPT_URL => $url,CURLOPT_RETURNTRANSFER => true,CURLOPT_POST => true,CURLOPT_POSTFIELDS => $data,CURLOPT_HTTPHEADER => ['Content-Type: application/json','Authorization: Bearer abc123xyz']
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;

三、处理 HTTPS 与 SSL 验证

1. 忽略 SSL 证书验证(仅限测试环境)
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
2. 指定 CA 证书
curl_setopt($ch, CURLOPT_CAINFO, '/path/to/cacert.pem');

四、文件上传

$filePath = '/path/to/file.jpg';
$data = ['file' => new CURLFile($filePath, 'image/jpeg', 'photo.jpg'),'description' => 'My photo'
];$ch = curl_init();
curl_setopt_array($ch, [CURLOPT_URL => 'https://api.example.com/upload',CURLOPT_POST => true,CURLOPT_POSTFIELDS => $data,CURLOPT_RETURNTRANSFER => true
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;

五、处理 Cookies

1. 发送时携带 Cookies
curl_setopt($ch, CURLOPT_COOKIE, 'session_id=abc123; user_token=xyz789');
2. 保存响应 Cookies
curl_setopt($ch, CURLOPT_COOKIEJAR, '/path/to/cookies.txt'); // 保存到文件
curl_setopt($ch, CURLOPT_COOKIEFILE, '/path/to/cookies.txt'); // 读取 Cookies

六、高级配置

1. 设置超时时间
curl_setopt($ch, CURLOPT_TIMEOUT, 30); // 30 秒超时
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); // 连接超时 10 秒
2. 处理重定向
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 自动跟随重定向
curl_setopt($ch, CURLOPT_MAXREDIRS, 5); // 最大重定向次数
3. 获取响应头信息
curl_setopt($ch, CURLOPT_HEADER, true); // 包含头信息在输出中$response = curl_exec($ch);
$headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$headers = substr($response, 0, $headerSize);
$body = substr($response, $headerSize);echo "Headers:\n$headers\nBody:\n$body";

七、错误处理

$ch = curl_init();
// ... 设置选项 ...$response = curl_exec($ch);
if ($response === false) {$error = curl_error($ch);$errno = curl_errno($ch);echo "cURL 错误 ($errno): $error";
} else {$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);echo "HTTP 状态码: $httpCode\n响应内容:\n$response";
}
curl_close($ch);

八、完整示例:调用 REST API

function callApi($url, $method = 'GET', $data = null, $headers = []) {$ch = curl_init();$options = [CURLOPT_URL => $url,CURLOPT_RETURNTRANSFER => true,CURLOPT_CUSTOMREQUEST => strtoupper($method),CURLOPT_HTTPHEADER => $headers];if ($method !== 'GET' && $data !== null) {$options[CURLOPT_POSTFIELDS] = is_array($data) ? json_encode($data) : $data;}curl_setopt_array($ch, $options);$response = curl_exec($ch);$error = curl_error($ch);$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);curl_close($ch);return ['code' => $httpCode,'data' => json_decode($response, true),'error' => $error];
}// 调用示例
$result = callApi('https://api.example.com/users','POST',['name' => 'Alice', 'email' => 'alice@example.com'],['Content-Type: application/json', 'Authorization: Bearer token123']
);print_r($result);

注意事项

  1. 安全建议
    • 生产环境务必启用 SSL 证书验证
    • 敏感数据(如 API 密钥)不要硬编码在代码中
    • 对用户输入做严格过滤
  2. 性能优化
    • 复用 cURL 句柄(使用 curl_init() 一次,多次请求)
    • 设置合理的超时时间
  3. 第三方库推荐
    如需更复杂功能,可使用:
    • Guzzle HTTPcomposer require guzzlehttp/guzzle
    • Symfony HTTP Clientcomposer require symfony/http-client

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/77552.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

刀客独家 | 潘胜接管百度移动生态市场部

一、 据刀客doc向独家信源确认&#xff0c;百度移动生态事业群&#xff08;MEG&#xff09;市场部日前完成重要人事调整&#xff1a;潘胜已经接任市场负责人。 此前&#xff0c;根据雷锋网3月底的报道&#xff0c;百度云渠道生态总经理陈之若离职&#xff0c;原移动生态事业群…

Springoot、Flowable快速学习

应用背景&#xff1a; 公司打算做个考勤系统&#xff0c;涉及到请假、补卡之类的流程审批。想到了工作流&#xff0c;gitee、github上看了下开源的&#xff0c;有自研的和常见的Flowable‌、Activiti‌。首先放弃自研的&#xff0c;考虑到成熟度、社区生态&#xff0c;最后选择…

关于 【Spring Boot Configuration Annotation Processor 未配置问题】 的详细分析、解决方案及代码示例

以下是关于 Spring Boot Configuration Annotation Processor 未配置问题 的详细分析、解决方案及代码示例&#xff1a; 1. 问题描述 当使用 Spring Boot 的配置注解&#xff08;如 ConfigurationProperties、Value、ConditionalOnProperty 等&#xff09;时&#xff0c;若未…

Spring系列四:AOP切面编程 第一部分

AOP切面编程 &#x1f497;AOP-官方文档&#x1f35d;AOP 讲解&#x1f35d;AOP APIs &#x1f497;动态代理&#x1f35d;初探动态代理&#x1f35d;动态代理深入&#x1f35d;AOP问题提出&#x1f4d7;使用土方法解决&#x1f4d7; 对土方法解耦-开发最简单的AOP类&#x1f4…

【云计算】云计算中IaaS、PaaS、SaaS介绍

0 随着云计算、大数据、人工智能发展迅速,布局“云”已经是互联网企业共识。云计算的服务类型分为三种,分别为IaaS、PaaS、SaaS,这三个分别是什么意思,今天做一个简单的介绍和了解。 一、云计算 云计算是用户需求通过Internet获取计算资源,把计算资源包装成服务,提供给…

使用HYPRE库并行装配IJ稀疏矩阵指南: 矩阵预分配和重复利用

使用HYPRE库并行装配IJ稀疏矩阵指南 HYPRE是一个流行的并行求解器库&#xff0c;特别适合大规模稀疏线性系统的求解。下面介绍如何并行装配IJ格式的稀疏矩阵&#xff0c;包括预先分配矩阵空间和循环使用。 1. 初始化矩阵 首先需要创建并初始化一个IJ矩阵&#xff1a; #incl…

目标跟踪最新文章阅读列表

AAAI2025 TrackFormer: Multi-Object Tracking with Transformers 论文:https://arxiv.org/abs/2101.02702 代码:https://github.com/timmeinhardt/trackformer AAAI2025 SUTrack 单目标跟踪 论文:https://pan.baidu.com/s/10cR4tQt3lSH5V2RNf7-3gg?pwd=pks2 代码:htt…

分布式GPU上计算长向量模的方法

分布式GPU上计算长向量模的方法 当向量分布在多个GPU卡上时&#xff0c;计算向量模(2-范数)需要以下步骤&#xff1a; 在每个GPU上计算本地数据的平方和跨GPU通信汇总所有平方和在根GPU上计算总和的平方根 实现方法 下面是一个完整的CUDA示例代码&#xff0c;使用NCCL进行多…

高并发下单库存扣减异常?飞算 JavaAI 自动化生成分布式事务解决方案

在电商、旅游等行业业务量激增&#xff0c;高并发下单场景中&#xff0c;传统库存扣减方式弊端尽显。超卖问题因缺乏有效并发控制机制频发&#xff0c;多个订单同时访问库存数据&#xff0c;导致同一商品多次售出&#xff0c;订单无法履约引发客户投诉&#xff1b;同时&#xf…

MVCWebAPI使用FromBody接受对象的方法

近期在做软件升级操作的时候突然想着需要的参数比较多&#xff0c;如果需要参数的话参数比较多&#xff0c;所有想着使用frombody来集合数据统一操作做了个样张希望对您有帮助 代码如下&#xff1a; /// <summary>/// 入口当前文件接口下的操作数据/// </summary>/…

Atlas 800I A2 离线部署 DeepSeek-R1-Distill-Llama-70B

一、环境信息 1.1、硬件信息 Atlas 800I A2 1.2、环境信息 注意&#xff1a;这里驱动固件最好用商业版&#xff0c;我这里用的社区版有点小问题 操作系统&#xff1a;openEuler 22.03 LTS NPU驱动&#xff1a;Ascend-hdk-910b-npu-driver_24.1.rc3_linux-aarch64.run NPU固…

NLP预处理:如何 处理表情符号

一、说明 本系列文总结了在NLP处理中&#xff0c;进行文本预处理的一些内容、步骤、处理工具包应用。本篇专门谈论网上文章表情符号处理&#xff0c;对于初学者具有深刻学习和实验指导意义。 二、介绍 表情符号已成为现代交流不可或缺的一部分&#xff0c;尤其是在社交媒体、…

C++/SDL 进阶游戏开发 —— 双人塔防(代号:村庄保卫战 14)

&#x1f381;个人主页&#xff1a;工藤新一 &#x1f50d;系列专栏&#xff1a;C面向对象&#xff08;类和对象篇&#xff09; &#x1f31f;心中的天空之城&#xff0c;终会照亮我前方的路 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 文章目录 二…

解锁空间数据新质生产力暨:AI(DeepSeek、ChatGPT)、Python、ArcGIS Pro多技术融合下的空间数据分析、建模与科研绘图及论文写作

人工智能&#xff08;AI&#xff09;与ArcGIS Pro的结合&#xff0c;为空间数据处理和分析开辟了前所未有的创新路径。AI通过强大的数据挖掘、深度学习及自动化能力&#xff0c;可高效处理海量、多源、异构的空间数据&#xff0c;极大提升了分析效率与决策支持能力。而ArcGIS P…

18.2.go语言redis中使用lua脚本

在 Redis 中使用 Lua 脚本可以实现原子性操作、减少网络开销以及提高执行效率。 Redis 执行 Lua 脚本的原理 Redis 内置了 Lua 解释器&#xff0c;能够直接在服务器端执行 Lua 脚本。当执行 Lua 脚本时&#xff0c;Redis 会将脚本作为一个整体执行&#xff0c;保证脚本执行期…

⭐Unity_Demolition Media Hap (播放Hap格式视频 超16K大分辨率视频 流畅播放以及帧同步解决方案)

播放大分辨率视频以及实现局域网视频同步是许多开发者会遇到的需求,AVPro有一个 Ultra Edition版本,也能播放Hap格式视频,之外就是Demolition Media Hap插件啦,实测即使是 7208*3808 大分辨率的视频帧率还是能稳定在30帧,它能帮助我们轻松解决这些问题😎。 一、插件概述 …

AI大模型知识与医疗项目实践 - Java架构师面试实战

AI大模型知识与医疗项目实践 - Java架构师面试实战 本文模拟了一场互联网大厂的Java架构师面试&#xff0c;围绕AI大模型知识、工具以及其在医疗项目中的实践和趋势展开讨论。 第一轮提问 面试官&#xff1a; 马架构&#xff0c;请您介绍一下AI大模型的基本概念及其在医疗领…

Windows 的文件系统不区分大小写,Linux区分

在 Windows 系统中&#xff0c;文件系统默认是不区分大小写的。这意味着在 Windows 上&#xff0c;文件名 ui_BalanceMeasureScreenUI.h 和 ui_balancemeasurescreenui.h 被视为同一个文件。因此&#xff0c;即使你在代码中使用了不同的大小写方式来引用同一个文件&#xff0c;…

Unity 资源合理性检测

一&#xff1a;表格过度配置&#xff0c;表格资源是否在工程中存在&#xff0c;并输出不存在的资源 import pandas as pd import glob import osassets [] count 0# 遍历configs文件夹下所有xlsx文件 for file_path in glob.glob(configs/*.xlsx):count 1try:sheets pd.re…

Python爬虫实战:获取高考资源网各学科精品复习资料

一、引言 高考资源网拥有丰富的高考复习资料,对于我们而言,获取这些资源并整理分享能为考生提供有价值的帮助。然而,手动从网站查找和下载资源效率低且易出错。利用 Python 爬虫技术可实现自动化资源获取,提高工作效率。但在爬取过程中,需考虑网站反爬机制,采取相应措施…