PHP中如何获取包含&符号的复杂GET参数?
解决GET参数含&时被截断的问题
这个问题我之前开发时也碰到过!核心原因很直白:&是URL里分隔多个GET参数的特殊字符,当你的url参数里包含&时,服务器会把第一个&后面的内容识别成新的独立参数,自然就导致原url参数被截断了。不用修改服务器配置的话,有两个实用的解决办法:
方法一:让请求方对目标URL做URL编码
这是最规范的处理方式。请求方需要把要传递的URL里的特殊字符(比如&、?、空格等)转换成URL编码格式:
&→%26?→%3F- 空格 →
%20(或+)
比如你原来的请求会变成:
http://localhost/run.php?url=www.google.com%3Faction%3DGo%26category%3D3%26name%3Dfoo%20bar
这时PHP里直接用$_GET['url']就能拿到完整的URL了——因为PHP会自动对GET参数做URL解码,你不需要额外处理。
方法二:手动解析整个查询字符串
如果没办法要求请求方做编码,那可以在PHP里通过$_SERVER['QUERY_STRING']获取完整的原始查询字符串,然后自行提取url参数的内容:
<?php // 获取?后面的所有原始查询内容 $queryString = $_SERVER['QUERY_STRING'] ?? ''; $url = ''; // 定位到url=的起始位置 $urlParamStart = strpos($queryString, 'url='); if ($urlParamStart !== false) { // 截取url=之后的所有内容 $rawUrlContent = substr($queryString, $urlParamStart + 4); // 对内容做URL解码,还原原始URL $url = urldecode($rawUrlContent); } echo $url; // 输出完整的www.google.com?action=Go&category=3&name=foo bar ?>
小提醒
无论用哪种方法,都要注意安全风险:直接使用用户传入的URL可能存在SSRF(服务器端请求伪造)等问题,建议在使用前对URL做合法性校验(比如限制允许的域名、协议等)。
内容的提问来源于stack exchange,提问作者albertma789
相关产品推荐
相关产品推荐

