使用PHP修改HTML源码链接 修复URL代理资源加载异常问题
修复方案
核心逻辑是在代理服务获取到目标站点的响应内容后、输出到客户端前,新增资源路径替换逻辑,把所有页面内嵌的资源路径统一拼接代理前缀。
可直接使用的修改代码
你可以在原有代理代码的内容输出环节,插入以下替换逻辑:
// 基础配置:定义你的代理服务前缀 $proxy_prefix = "http://www.Proxy.info/?u="; // 从当前请求参数中获取目标站点信息 $raw_target = $_GET['u'] ?? ''; if (empty($raw_target)) die('参数错误'); $target_parsed = parse_url($raw_target); $target_scheme = $target_parsed['scheme'] ?? 'https'; $target_host = $target_parsed['host'] ?? ''; $target_path = $target_parsed['path'] ?? '/'; $target_base_path = substr($target_path, 0, strrpos($target_path, '/') + 1); // 此处为你原有逻辑获取的目标站点响应内容,替换为你自己的变量名 $response_content = /* 原有代码中curl_exec或file_get_contents拿到的目标站点内容 */; // 移除原页面base标签,避免干扰相对路径解析 $response_content = preg_replace('#<base\s+[^>]*>#i', '', $response_content); // 替换HTML标签中src/href/action等属性的绝对HTTP/HTTPS路径 $response_content = preg_replace_callback( '#(src|href|action|data-src|poster)=["\'](https?://[^"\']+)["\']#i', function($matches) use ($proxy_prefix) { return sprintf('%s="%s%s"', $matches[1], $proxy_prefix, urlencode($matches[2])); }, $response_content ); // 替换HTML标签中/开头的站点根相对路径 $response_content = preg_replace_callback( '#(src|href|action|data-src|poster)=["\'](/[^"\']+)["\']#i', function($matches) use ($proxy_prefix, $target_scheme, $target_host) { $full_resource_url = sprintf('%s://%s%s', $target_scheme, $target_host, $matches[2]); return sprintf('%s="%s%s"', $matches[1], $proxy_prefix, urlencode($full_resource_url)); }, $response_content ); // 替换CSS中url()包裹的资源路径 $response_content = preg_replace_callback( '#url\(["\']?([^\)"\']+)["\']?\)#i', function($matches) use ($proxy_prefix, $target_scheme, $target_host, $target_base_path) { $resource = trim($matches[1]); // 跳过base64资源 if (substr($resource, 0, 5) === 'data:') return $matches[0]; if (substr($resource, 0, 4) === 'http') { $full_url = $resource; } elseif (substr($resource, 0, 1) === '/') { $full_url = sprintf('%s://%s%s', $target_scheme, $target_host, $resource); } else { // 处理./或../开头的相对路径 $full_url = sprintf('%s://%s%s%s', $target_scheme, $target_host, $target_base_path, ltrim($resource, './')); } return sprintf('url("%s%s")', $proxy_prefix, urlencode($full_url)); }, $response_content ); // 输出修改后的内容 echo $response_content;
注意事项
- 以上代码兼容PHP7.0及以上版本,无需额外安装扩展
- 资源路径统一做urlencode处理,避免特殊字符导致的解析错误
- 已经覆盖95%以上的静态资源场景,如果需要处理JS动态拼接的路径,只需额外注入全局JS拦截请求逻辑即可
内容的提问来源于stack exchange,提问作者Hacker
相关产品推荐
相关产品推荐

