PHP 网页代理导航:相对 URL、Cookie 与源
在把 PHP 抓取改造成面向浏览器的网页代理时,规划资源 URL、导航、Cookie 与源边界。
在为 PHP 抓取器添加更多重写之前,先确定下一个资源该去哪里。从 https://destination.example/catalog/ 抓取、并在 https://viewer.example/browse?url=... 返回的文档可能包含:
<img src="photo.jpg">
<a href="details/42">Details</a>浏览器会用它在查看器中收到的文档来解析这些引用。PHP 抓到了原始字节,并不等于确立了远端基准。
base 元素可以把相对 URL 指向目标站点,但那些请求随后可能直接从浏览器发往目标。若要让每个请求都经过 PHP,则需要代理 URL 和更完整的路由模型:
| 资源或操作 | 所需处理 |
|---|---|
| 链接与图片 | 相对远端文档解析,并生成预期路由 |
| CSS 导入与资源 | 使用样式表的远端基准 |
| 表单 | 保留方法与提交的数据 |
| 重定向 | 让导航留在允许的模型内 |
| 脚本创建的请求 | 处理原始 HTML 中不存在的 URL |
几处正则替换无法保证对脚本密集的网站普遍兼容。对于已知的公开文档,也许关闭导航、允许直接链接,或把受支持的子集经由查看器转发就够了。要保留真实媒体类型,而不是把每个响应都当作 HTML。
从你的域名返回不受信任的标记,也会让它获得查看器的浏览器源,而不是被抓站点的身份。把这些文档与账户、管理页面隔离。为每位访客定义远端 Cookie、允许转发的请求头和重定向目标;共用的 Cookie 罐会混淆远端登录。
在提供浏览会话之前,先确认这条支持边界。若只是经另一个出口普通浏览,浏览器自带的代理界面,例如 Firefox 的 HTTP/SOCKS 设置,会保留浏览器的目标 URL 与源模型,无需这一抓取再发布层。若要做单独的公开站点测试,免费代理列表 提供候选端点;在浏览器设置里匹配协议。