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状态码:
- 在站点根目录新建/编辑文件
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); } } }
- 清除系统缓存:
- 后台进入「高级参数 > 性能」页面,点击「清除所有缓存」按钮
- 手动删除
/var/cache/(1.7/8.x版本)或/cache/(1.6版本)目录下的所有文件
- 验证:访问缺失.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
相关产品推荐
相关产品推荐

