PHP自动预加载处理GET参数失效,如何用.htaccess替换特殊参数值
问题解决:GET参数清理失败与.htaccess重写实现
原PHP代码的问题修复
你的PHP预加载文件无法处理GET参数,核心是代码存在语法和逻辑错误:
- 函数定义缺少
function关键字,导致sanit函数未被解析 - 数组递归处理时调用了不存在的
sanitizare函数,应为sanit - 数组处理未初始化
$inputstring变量,直接修改原数组项更合理 - 循环结构缺少大括号,虽语法允许但易引发逻辑混乱
修复后的完整代码:
<?php echo 'test'; if(isset($_GET) && !empty($_GET)) { foreach ($_GET as $key => $value) { if(!empty($value)) { $_GET[$key] = sanit($value); } } } function sanit($item) { if(is_array($item)) { foreach($item as $key => $val) { $item[$key] = sanit($val); } } else { $item = filter_var($item, FILTER_SANITIZE_STRING); $item = filter_var($item, FILTER_SANITIZE_MAGIC_QUOTES); $item = preg_replace('/(0x)(\d{2,})/i', 'OOO', $item); $item = preg_replace('/(0o)(\d{2,})/i', 'OOO', $item); $item = preg_replace('/(0b)(\d{2,})/i', 'OOO', $item); } return $item; }
用.htaccess实现GET参数替换
如果坚持使用.htaccess重写,需确保服务器已启用mod_rewrite模块,以下分两种场景实现:
场景1:仅替换指定参数(如ref)
RewriteEngine On # 替换ref参数中0x开头的两位以上数字 RewriteCond %{QUERY_STRING} ^(.*)ref=0x\d{2,}(.*)$ RewriteRule ^(.*)$ /$1?%1ref=OOO%2 [L,R=302] # 替换ref参数中0o开头的两位以上数字 RewriteCond %{QUERY_STRING} ^(.*)ref=0o\d{2,}(.*)$ RewriteRule ^(.*)$ /$1?%1ref=OOO%2 [L,R=302] # 替换ref参数中0b开头的两位以上数字 RewriteCond %{QUERY_STRING} ^(.*)ref=0b\d{2,}(.*)$ RewriteRule ^(.*)$ /$1?%1ref=OOO%2 [L,R=302]
场景2:替换所有GET参数中的匹配值
RewriteEngine On # 替换所有参数值中0x开头的两位以上数字 RewriteCond %{QUERY_STRING} ^(.*?)([&?])([^&=]+)=0x\d{2,}(.*)$ RewriteRule ^(.*)$ /$1?%1%2%3=OOO%4 [L,R=302] # 替换所有参数值中0o开头的两位以上数字 RewriteCond %{QUERY_STRING} ^(.*?)([&?])([^&=]+)=0o\d{2,}(.*)$ RewriteRule ^(.*)$ /$1?%1%2%3=OOO%4 [L,R=302] # 替换所有参数值中0b开头的两位以上数字 RewriteCond %{QUERY_STRING} ^(.*?)([&?])([^&=]+)=0b\d{2,}(.*)$ RewriteRule ^(.*)$ /$1?%1%2%3=OOO%4 [L,R=302]
说明:
R=302为临时重定向,需永久重定向可改为R=301- 规则会循环执行,直到所有匹配模式都被替换
内容的提问来源于stack exchange,提问作者Hexman
相关产品推荐
相关产品推荐

