问题原因 你的主机(byhost 等分销空间)在网站首页地址上自动追加了 ?i=1。这是主机加的营销/统计参数,不是访客手动输入,也不是你程序的问题。它会让 / 变成一个带参数的地址,体验不佳(地址栏脏、收藏夹带参数)。
方案 A:入口文件判断(推荐,最通用) 编辑 index.php,在文件靠前位置($conf 加载之后即可)加入这段:
// 清理虚拟主机强制追加的营销参数 ?i=1(byhost 等分销空间)
// 仅首页命中:只剥掉 i 参数,保留其他合法参数(page/order/keyword 等),301 回干净地址
$_uri = $_SERVER['REQUEST_URI'] ?? '/';
$_p = parse_url($_uri, PHP_URL_PATH);
$_is_home = ($_p === '' || $_p === '/' || $_p === '/index.php');
if ($_is_home && preg_match('#(^|&)i=[^&]*(&|$)#i', (string)parse_url($_uri, PHP_URL_QUERY))) {
$clean = preg_replace('#[?&]i=[^&]*#i', '', $_uri);
$clean = rtrim($clean, '?&');
$clean === '' AND $clean = '/';
if ($clean !== $_uri) {
header('Location: ' . $clean, true, 301);
exit;
}
unset($_GET['i']);
}
unset($_uri, $_p, $_is_home, $clean);
效果:
方案 B:Nginx 等价写法 如果后台的「伪静态规则」栏能填(普通虚拟主机改不动 nginx.conf 则此方案不可用):
# 首页且参数就是 ?i=1 这类时,301 回干净首页
location = / {
if ($args ~* "^(i=[0-9]*|i=[0-9]*|i=[0-9]*&|&?i=[0-9]*)$") {
return 301 /;
}
}
Nginx 无法方便地「只删单个参数」,所以这里只处理纯 ?i=1 的情况;若首页还带其他合法参数就没法在 Nginx 层拆,仍建议用方案 A。
两个提醒:
方案 A 改的是核心 index.php,程序升级时这段会被覆盖覆盖,升级后需重新加上。若不想反复改核心,更稳的做法是装一个小插件来做同样判断