我有示例代码:
$var = $_GET['myurl'];
我的示例网址
https://mydomain/sample/value-2019?fbclid=xxxxxxxxxxxx
or
https://mydomain/sample/value-2019?date=2018&fbclid=xxxxxxxxxxxx
or
https://mydomain/sample/value-2019?fbclid=xxxxxxxxxxxx&id=10
or
https://mydomain/sample/value-2019?x=xyz
or etc...
$ _ GET ['myurl']-是我实际的URL地址。
我需要检查$ var参数是否为fbclid-如果是,请将其删除。
例如:
来自
$var = 'https://mydomain/sample/value-2019?date=2018&fbclid=xxxxxxxxxxxx'
我想要拥有:
$var = 'https://mydomain/sample/value-2019?date=2018'
重要提示: fbclid参数并不总是出现,因此我首先需要检查URL中是否可用。
如何做到?
答案 0 :(得分:1)
<?php
$urls = array(
"https://mydomain/sample/value-2019?fbclid=xxxxxxxxxxxx",
"https://mydomain/sample/value-2019?date=2018&fbclid=xxxxxxxxxxxx",
"https://mydomain/sample/value-2019?fbclid=xxxxxxxxxxxx&id=10",
"https://mydomain/sample/value-2019?x=xyz"
);
function strip_fbclid($url) {
$patterns = array(
'/(\?|&)fbclid=[^&]*$/' => '',
'/\?fbclid=[^&]*&/' => '?',
'/&fbclid=[^&]*&/' => '&'
);
$search = array_keys($patterns);
$replace = array_values($patterns);
return preg_replace($search, $replace, $url);
}
foreach($urls as $url) {
echo "URL: " . $url . "\n";
echo "REP: " . strip_fbclid($url) . "\n";
}
如果我们在每次运行函数时都没有定义和解析模式/搜索/替换URL,则可以使此代码更高效,但这应该行得通吗?
答案 1 :(得分:0)
这似乎对我有用:
$actual_link=(isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http");
$actual_link.="://$_SERVER[HTTP_HOST]$_SERVER[SCRIPT_NAME]";
foreach($_GET as $key => $value) if($key!='fbclid') {
if(isset($args)) $args.="&$key=$value";
else $args="?$key=$value";
}
$actual_link.=$args;
答案 2 :(得分:0)
有一个简单的方法来做这个服务器端。 当然,它只适用于 GET 或 HEAD,不适用于请求有正文(即:POST PUT 等...)
这里以 nginx 为例(请注意,这是有效的,因为 fbclid
始终附加到查询字符串)
map $request_uri $redirect_fbclid {
"~^(.*)(?:[?&]fbclid=[a-zA-Z0-9_-]+)$" $1;
}
if ( $redirect_fbclid ) {
return 301 $redirect_fbclid;
}
对于 apache,可以使用 mod_rewrite 来完成
RewriteEngine On
RewriteCond %{QUERY_STRING} ^(.+?&|)fbclid=[^&]*(?:&(.*)|)$
RewriteRule ^ %{REQUEST_URI}?%1%2 [R=301,L]