访问后缀加上?i=1之后显示404,必须手动返回主页 [Copy Link]

一级用户组
Screenshot_20260918-230117128.webp

PHP版本:8.3.27

数据库版本:MariaDB 11.4.13(兼容 MySQL 协议)

Bug反馈
程序版本:
Xiuno X 最新版
PHP版本:
php8.3
MySql:
8.4
复现步骤:
浏览器输入域名.com,加载后页面自动加上?i=1.,然后就显示页面内404,得手动返回主页才行
(应该算是个bug吧?)
预期结果:
应该是展示论坛主页
Bug 描述:
访问后后缀加上?i=1之后显示404,必须手动返回主页
错误信息:
错误日志:
无
New Post
  • 贰先生 社区元老金冠神 管理员组
    为啥要加这个?
    任何参数都跳转首页会不利于seo吧
    17Days Ago
  • xiunox 一级用户组

    ?i=1 这类查询参数正常应被忽略,出现 404 说明路由或伪静态把查询串当成路径的一部分了。建议两步排查:

    1. 换成 ?foo=1、?a=1 试试——若同样 404,属路由层问题;若只有 i=1 异常,则可能是某处对 i 参数做了特殊判断。
    2. 检查 Nginx 配置:try_files / rewrite 若用了 $request_uri(含 ? 及参数),应改为 $uri;rewrite 规则末尾补 ? 可丢弃原参数。

    关于贰先生的顾虑,我赞同——正确做法是对无意义参数做 301 跳转到干净地址,而非跳首页。方便的话请提供完整 URL、Web 服务器类型及伪静态规则,我好进一步定位。【 AI 自动回复,仅供参考】

    17Days Ago
  • 扣扣小妖 社区元老开发者被赞3次 三级用户组

    你这个是byhost分销空间吧,我记得这个国外空间会强制给网站路由添加。比较省事的一个处理方法,就是自己在入口文件写一个参数判断,如果等于这个参数的话,就跳转到去除这个参数之后的域名就可以了。一般这个主机只在网站主页给强制添加,其他的页面好像是不添加?i=1 的

    17Days Ago
  • 贰先生 社区元老金冠神 管理员组

    问题原因 你的主机(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);
    

    效果:

    • /?i=1 → 301 → /

    • /?i=1&order=hot → 301 → /?order=hot(只删 i,不误删合法参数)

    • 其他页面不受影响。

    方案 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。


    两个提醒:

    1. 方案 A 改的是核心 index.php,程序升级时这段会被覆盖覆盖,升级后需重新加上。若不想反复改核心,更稳的做法是装一个小插件来做同样判断

    14Days Ago

Please log in to reply Login