如何用PHP清理URL设置规范网址?解决Search Console重复URL问题
重复URL的Canonical标签修复问题
我在Search Console里发现一批重复URL,都是原URL后面拼接了字符串g;m.parentNode.insertBefore(a,m)。比如:
- 原URL:
https://mywebsite.com/my-page/ - 重复URL:
https://mywebsite.com/my-page/g;m.parentNode.insertBefore(a,m)
我尝试用下面这段PHP代码清理URL并设置meta canonical,但完全没效果:
$mycanonicalurl = "https://mywebsite.com" .parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
问题原因
原代码无效的核心原因是:parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)会把包含多余字符串的完整路径全部提取出来(比如/my-page/g;m.parentNode.insertBefore(a,m)),拼接后生成的canonical URL还是带多余内容的,自然无法解决重复问题。
修复方案
方案1:精准检测并截取字符串
直接判断URL中是否包含那个特定的多余字符串,截取到它之前的部分作为干净路径:
$requestUri = $_SERVER['REQUEST_URI']; $badSuffix = 'g;m.parentNode.insertBefore(a,m)'; // 检查URL是否包含恶意后缀 if (strpos($requestUri, $badSuffix) !== false) { $cleanPath = substr($requestUri, 0, strpos($requestUri, $badSuffix)); } else { $cleanPath = parse_url($requestUri, PHP_URL_PATH); } $mycanonicalurl = "https://mywebsite.com" . $cleanPath;
方案2:正则匹配去除后缀
如果多余字符串总是出现在URL路径的末尾,可以用正则直接替换掉:
$requestUri = $_SERVER['REQUEST_URI']; $cleanPath = preg_replace('/\/g;m.parentNode.insertBefore\(a,m\)$/', '', parse_url($requestUri, PHP_URL_PATH)); $mycanonicalurl = "https://mywebsite.com" . $cleanPath;
方案3:服务器层面301重定向(更彻底)
除了设置canonical,建议在服务器配置里做301重定向,直接把带多余字符串的URL跳转到原URL,从根源解决重复抓取问题:
- Nginx配置:
location ~* /g;m.parentNode.insertBefore\(a,m\)$ { rewrite ^(.*)/g;m.parentNode.insertBefore\(a,m\)$ $1 permanent; }
- Apache .htaccess配置:
RewriteEngine On RewriteRule ^(.*)/g;m.parentNode.insertBefore\(a,m\)$ $1 [R=301,L]
内容的提问来源于stack exchange,提问作者al404IT
相关产品推荐
相关产品推荐

