前端模块中的友好 URL 问题 - Prestashop
Friendly URL problem in front module - Prestashop
我正在为一个在 SEO 和 URL 配置中使用 301 Moved Permanently
选项的网站构建前端模块。
Wesbite 使用 Prestashop 1.6.1.9.
在模块中,我这样定义路由:
public static $ModuleRoutes = array(
'module-aacategories-viewmapping-mapping' => array(
'controller' => 'viewmapping',
'rule' => 'mappings{/:tree}',
'keywords' => array(
'tree' => array('regexp' => '[/_a-zA-Z0-9-\pL]*', 'param' => 'tree'),
),
'params' => array(
'fc' => 'module',
'module' => 'aacategories',
)
)
);
在浏览器地址栏,当我输入:
site.local/en/mappings/test-map/first-test
我得到:
Please use the following URL instead:
site.local/en/index.php?controller=viewmapping&tree=test-map%2Ffirst-test&module=aacategories
后者 link 给出 404。但是,当我将 &fc=module
附加到 url 时,它会转到所需的页面。
问题:
1- 如何强制 Prestashop 路由在末尾附加 &fc=module
?
2- 如何在地址栏中保留友好的url而不被重定向?
注意:当我将 SEO 和 URL 中的配置更改为 no redirection
时,它就起作用了。但这不是prod中需要的配置。
非常感谢您的帮助。提前致谢。
问题是您在模块控制器中设置 public 属性 $php_self
。
您需要删除 属性 以便核心前端控制器不会执行规范重定向。
执行此操作的代码在 FrontController.php
第 378 行。
if (!empty($this->page_name)) {
$page_name = $this->page_name;
} elseif (!empty($this->php_self)) {
$page_name = $this->php_self;
} elseif (Tools::getValue('fc') == 'module' && $module_name != '' && (Module::getInstanceByName($module_name) instanceof PaymentModule)) {
$page_name = 'module-payment-submit';
}
// @retrocompatibility Are we in a module ?
elseif (preg_match('#^'.preg_quote($this->context->shop->physical_uri, '#').'modules/([a-zA-Z0-9_-]+?)/(.*)$#', $_SERVER['REQUEST_URI'], $m)) {
$page_name = 'module-'.$m[1].'-'.str_replace(array('.php', '/'), array('', '-'), $m[2]);
} else {
$page_name = Dispatcher::getInstance()->getController();
$page_name = (preg_match('/^[0-9]/', $page_name) ? 'page_'.$page_name : $page_name);
}
如果您在第 401 行设置 属性,然后执行规范重定向。
if (!empty($this->php_self) && !Tools::getValue('ajax')) {
$this->canonicalRedirection($this->context->link->getPageLink($this->php_self, $this->ssl, $this->context->language->id));
}
我正在为一个在 SEO 和 URL 配置中使用 301 Moved Permanently
选项的网站构建前端模块。
Wesbite 使用 Prestashop 1.6.1.9.
在模块中,我这样定义路由:
public static $ModuleRoutes = array(
'module-aacategories-viewmapping-mapping' => array(
'controller' => 'viewmapping',
'rule' => 'mappings{/:tree}',
'keywords' => array(
'tree' => array('regexp' => '[/_a-zA-Z0-9-\pL]*', 'param' => 'tree'),
),
'params' => array(
'fc' => 'module',
'module' => 'aacategories',
)
)
);
在浏览器地址栏,当我输入:
site.local/en/mappings/test-map/first-test
我得到:
Please use the following URL instead:
site.local/en/index.php?controller=viewmapping&tree=test-map%2Ffirst-test&module=aacategories
后者 link 给出 404。但是,当我将 &fc=module
附加到 url 时,它会转到所需的页面。
问题:
1- 如何强制 Prestashop 路由在末尾附加 &fc=module
?
2- 如何在地址栏中保留友好的url而不被重定向?
注意:当我将 SEO 和 URL 中的配置更改为 no redirection
时,它就起作用了。但这不是prod中需要的配置。
非常感谢您的帮助。提前致谢。
问题是您在模块控制器中设置 public 属性 $php_self
。
您需要删除 属性 以便核心前端控制器不会执行规范重定向。
执行此操作的代码在 FrontController.php
第 378 行。
if (!empty($this->page_name)) {
$page_name = $this->page_name;
} elseif (!empty($this->php_self)) {
$page_name = $this->php_self;
} elseif (Tools::getValue('fc') == 'module' && $module_name != '' && (Module::getInstanceByName($module_name) instanceof PaymentModule)) {
$page_name = 'module-payment-submit';
}
// @retrocompatibility Are we in a module ?
elseif (preg_match('#^'.preg_quote($this->context->shop->physical_uri, '#').'modules/([a-zA-Z0-9_-]+?)/(.*)$#', $_SERVER['REQUEST_URI'], $m)) {
$page_name = 'module-'.$m[1].'-'.str_replace(array('.php', '/'), array('', '-'), $m[2]);
} else {
$page_name = Dispatcher::getInstance()->getController();
$page_name = (preg_match('/^[0-9]/', $page_name) ? 'page_'.$page_name : $page_name);
}
如果您在第 401 行设置 属性,然后执行规范重定向。
if (!empty($this->php_self) && !Tools::getValue('ajax')) {
$this->canonicalRedirection($this->context->link->getPageLink($this->php_self, $this->ssl, $this->context->language->id));
}