Magento2如何获取完整动作名判断商品详情页的用户访问来源
Magento2 商品详情页来源判断实现方案
核心实现逻辑
不需要直接解析重写后的URL,将HTTP REFERER传入Magento原生路由解析流程,即可获取对应页面的完整动作名,实现来源判断。
服务端实现代码
1. 依赖注入
在你需要用到该功能的类(商品详情页Block、插件、自定义控制器均可)的构造函数中注入以下类:
protected $httpHeader; protected $urlParser; protected $requestFactory; protected $routerList; public function __construct( \Magento\Framework\HTTP\Header $httpHeader, \Magento\Framework\Url\ParserInterface $urlParser, \Magento\Framework\App\Request\HttpFactory $requestFactory, \Magento\Framework\App\RouterList $routerList ) { $this->httpHeader = $httpHeader; $this->urlParser = $urlParser; $this->requestFactory = $requestFactory; $this->routerList = $routerList; }
2. 封装获取来源动作名方法
/** * 获取来源页面的full action name * @return string|null */ public function getRefererFullActionName() { $refererUrl = $this->httpHeader->getHttpReferer(); if (empty($refererUrl)) { return null; } // 解析REFERER的路径信息 $urlInfo = $this->urlParser->parse($refererUrl); $path = $urlInfo['path'] ?? ''; if (empty($path)) { return null; } // 生成临时请求对象匹配路由 $tempRequest = $this->requestFactory->create(); $tempRequest->setPathInfo(ltrim($path, '/')); // 遍历路由匹配 foreach ($this->routerList as $router) { if ($router->match($tempRequest)) { break; } } return $tempRequest->getFullActionName(); }
3. 来源判断
调用上述方法拿到返回值后,直接和Magento原生动作名比对即可:
- 分类商品列表页:
catalog_category_view - 搜索结果列表页:
catalogsearch_result_index - 其他自定义列表页可以对应其动作名自行匹配
备选轻量方案
如果觉得路由匹配逻辑过重,也可以通过URL加参数的方式实现:
- 给所有列表页的商品跳转链接统一追加
source参数,比如分类页加?source=category,搜索页加?source=search - 商品详情页直接通过
$this->getRequest()->getParam('source')即可快速判断来源,性能更高 - 注意需要将
source参数加入页面缓存排除项,避免全页缓存导致参数失效
注意事项
- 两种方案都有边界情况:HTTP REFERER可能被用户浏览器禁用,URL参数可能被用户篡改,核心业务逻辑需要做好兜底处理
- 不要在前端JS中做核心来源判断,容易被伪造
内容的提问来源于stack exchange,提问作者ahyan
相关产品推荐
相关产品推荐

