我有以下代码检查以xz
开头的任何参数,如果找到这样的参数,它将仅重定向到同一页面而没有这些参数:
function unparse_url($parsed_url) {
$scheme = isset($parsed_url['scheme']) ? $parsed_url['scheme'] . '://' : '';
$host = isset($parsed_url['host']) ? $parsed_url['host'] : '';
$port = isset($parsed_url['port']) ? ':' . $parsed_url['port'] : '';
$user = isset($parsed_url['user']) ? $parsed_url['user'] : '';
$pass = isset($parsed_url['pass']) ? ':' . $parsed_url['pass'] : '';
$pass = ($user || $pass) ? "$pass@" : '';
$path = isset($parsed_url['path']) ? $parsed_url['path'] : '';
$query = !empty($parsed_url['query']) ? '?' . trim($parsed_url['query'], '&') : '';
$fragment = isset($parsed_url['fragment']) ? '#' . $parsed_url['fragment'] : '';
return "$scheme$user$pass$host$port$path$query$fragment";
}
function strip_query($url, $query_to_strip) {
$parsed = parse_url($url);
$parsed['query'] = preg_replace('/(^|&)'.$query_to_strip.'[^&]*/', '', $parsed['query']);
return unparse_url($parsed);
}
$url = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
$new_url = (strip_query($url, 'xz')); # or whatever query you want to strip/keep
$filtered = array_filter(array_keys($_GET), function($k) {
return strpos($k, 'xz') === 0;
});
if ( !empty($filtered) ) {
header ("Location: $new_url");
}
示例:
登陆的用户:domain.com/?xz=1&a=2&xzbo=3
将被重定向到domain.com/?a=2
如何针对2种不同的参数模式执行此操作,
例如,以xz
开头的任何内容以及以ab
开头的任何内容?
答案 0 :(得分:1)
一个简单的修复可能是定义一个新函数strip_queries
。
/**
* @param string $url
* @param array $queries the query params to strip
* @return string
*/
function strip_queries($url, array $queries)
{
foreach ($queries as $query) {
$url = strip_query($url, $query);
}
return $url;
}
用
打电话$new_url = strip_queries($url, array('xz', 'ab'));
你真的应该关注http_build_query
和parse_url
。有了这些,您可以将查询参数作为数组进行管理,而不是使用字符串操作。