You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PrestaShop无效商品URL跳转index.php?controller=404问题

PrestaShop商品页无效URL触发302跳转而非直接返回404的修复方法

问题根因

该问题是PrestaShop核心商品控制器的内置逻辑导致:当访问商品路径匹配到商品路由规则,但无法加载对应有效商品(包括后缀缺失、商品ID不存在、商品已下架/删除)时,核心代码默认执行302重定向到/index.php?controller=404地址,而非在当前请求路径直接返回404状态码。
分类、CMS等其他页面的路由匹配失败时走全局404兜底逻辑,所以不会出现该问题,反复开关友好URL功能不会影响这段核心逻辑,因此操作后无效果。


修复方案

方案1:控制器覆盖(推荐,全版本兼容,升级不丢失配置)

通过PrestaShop原生的override机制重写商品控制器逻辑,拦截无效商品的跳转逻辑,直接返回404状态码:

  1. 在站点根目录新建/编辑文件 override/controllers/front/ProductController.php,写入以下代码:
<?php
class ProductController extends ProductControllerCore
{
    public function init()
    {
        parent::init();
        // 商品不存在时直接返回404,不触发跳转
        if (!Validate::isLoadedObject($this->product)) {
            header('HTTP/1.1 404 Not Found');
            $this->setTemplate('errors/404');
            exit;
        }
    }

    public function canonicalRedirection($canonicalUrl = '')
    {
        // 仅在商品有效时执行规范化URL跳转
        if (Validate::isLoadedObject($this->product)) {
            parent::canonicalRedirection($canonicalUrl);
        }
    }
}
  1. 清除系统缓存:
    • 后台进入「高级参数 > 性能」页面,点击「清除所有缓存」按钮
    • 手动删除/var/cache/(1.7/8.x版本)或/cache/(1.6版本)目录下的所有文件
  2. 验证:访问缺失.html后缀的商品链接,响应状态码直接为404 Not Found,无302跳转,页面正常展示站点自定义404模板。

方案2:Web服务器规则配置(无需修改PHP代码)

如果不想改动PHP逻辑,可以直接在Web服务器配置中加规则,拦截不符合格式的商品路径直接返回404:

  • Apache环境(根目录.htaccess文件,在默认重写规则最顶部加入):
# 匹配默认ID-别名格式的无后缀商品路径,直接返回404
RewriteRule ^[0-9]+-[a-zA-Z0-9-]+$ - [R=404,L]
  • Nginx环境(在站点server配置块中加入,重载nginx生效):
# 匹配默认ID-别名格式的无后缀商品路径,直接返回404
location ~ ^/[0-9]+-[a-zA-Z0-9-]+$ {
    return 404;
}

注意:如果自定义过商品URL路由规则,需要对应调整上述正则匹配规则,避免误拦截正常路径。


注意事项

  • 禁止直接修改核心目录下的controllers/front/ProductController.php原文件,版本升级后修改会被直接覆盖
  • 如果站点安装了第三方SEO、URL优化类模块,优先检查模块的路由重写配置,部分模块会替换核心商品路由逻辑,需要同步调整模块内的跳转规则
  • 配置完成后可通过curl -I 测试链接的方式检查响应头,确认无多余302跳转

内容的提问来源于stack exchange,提问作者Dominik Gorczyca

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 22:54:30