如何获取$_GET来源URL的最后部分?带空格州名无法完整获取
解决URL含空格时仅获取部分内容的问题
这个问题我遇到过好几次,根源出在你的.htaccess正则规则上,咱们一步步解决:
1. 修复.htaccess的URL捕获规则
你当前的RewriteRule正则[0-9a-zA-Z]+只匹配字母和数字,完全没考虑空格(或者URL编码后的%20,服务器会自动解码成空格),所以当URL是state/new%20york时,正则只能匹配到空格前的new,后面的york直接被丢弃了。
把规则改成下面这样,就能完整捕获所有除了斜杠之外的字符:
RewriteRule ^state/([^/]+)$ location.php?state=$1 [NC,L]
这里的[^/]+表示匹配任意非斜杠的字符,不管是空格、字母、数字还是其他合法URL字符,都能完整传递给location.php的state参数。
2. 紧急修复SQL注入漏洞
另外必须提醒你:你的PHP代码直接把$_GET['state']拼进SQL语句,这是严重的SQL注入漏洞!别小看这个问题,攻击者可以轻易篡改你的数据库甚至获取敏感数据。
赶紧改成预处理语句,安全又可靠:
<?php $state = $_GET['state']; // 使用mysqli预处理语句防止SQL注入 $stmt = $db_conx->prepare("SELECT * FROM states WHERE state = ?"); // 绑定参数,"s"表示参数是字符串类型 $stmt->bind_param("s", $state); $stmt->execute(); // 获取查询结果 $records = $stmt->get_result(); // 后续处理记录的代码... ?>
验证效果
现在访问example.com/state/new%20york,服务器会自动把%20解码成空格,$_GET['state']就能拿到完整的new york,再通过预处理语句安全查询数据库,就能获取到对应的州数据了。
内容的提问来源于stack exchange,提问作者Pazzy
相关产品推荐
相关产品推荐

