我在VPS主机上安装了Prestashop 1.6并且一切都运行良好,除了当我尝试访问不存在的页面,而不是提供模板的404页面时,301返回重定向,并将客户端重定向到显示404模板的index.php?controller=page-not-found
。
由于SEO原因,这对我不起作用。 如何禁用此重定向?
由于
答案 0 :(得分:1)
原来prestashop的默认行为是重定向。这不是一个覆盖。无论如何 - 我找到了一种方法来实现我想要做的事情。
经过一段时间的努力 - 我想出了一个迟钝的解决方案,现在就可以了。 我在这里分享它,因为我肯定会赞赏几天前发现它,但要注意 - 它被推迟到不归路。 如果你能拿出别的东西,不推荐。
我做的是这个 - 我在controllers / front /文件夹中找到了CategoryController.php文件。 应该有这一行:
if (!$this->category->active)
在其中,我向网站的404.html页面发出了php file_get_contents请求,并提供服务。 然后我用exit()终止php脚本;命令。
这样服务器就会发送404.html内容,而不会重定向。 这是完整的代码:
header('HTTP/1.1 404 Not Found');
header('Status: 404 Not Found');
echo file_get_contents('https://website.com/404/'
false,
stream_context_create(
array(
'http' => array(
'ignore_errors' => true
)
)
)
);
exit();
不要忘记,如果控制器被覆盖,它可能无法正常工作。
答案 1 :(得分:0)
我已在覆盖的工具控制器
中完成此操作public static function redirectLink($ url) {
$init_url=$url;
if (!preg_match('@^https?://@i', $url)) {
if (strpos($url, __PS_BASE_URI__) !== false && strpos($url, __PS_BASE_URI__) == 0) {
$url = substr($url, strlen(__PS_BASE_URI__));
}
if (strpos($url, 'index.php?controller=') !== false && strpos($url, 'index.php/') == 0) {
$url = substr($url, strlen('index.php?controller='));
}
$explode = explode('?', $url);
$url = Context::getContext()->link->getPageLink($explode[0]);
if (isset($explode[1])) {
$url .= '?'.$explode[1];
}
}
if ((string)trim($init_url)==='404') {
header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
header('Status: 404 Not Found');
echo file_get_contents($url, false,
stream_context_create(
array('http' => array('ignore_errors' => true,
),
)
)
);
exit();
} else {
header("HTTP/1.1 301 Moved");
header('Location: '.$url);
exit();
}
}
答案 2 :(得分:0)
对此的全局解决方案(因此您不必逐个控制器)将直接转到 -> classes/Dispatcher.php 在那里你会找到调度功能。 你可以这样做 ->
if ($this->controller == $this->controller_not_found) {
//your code here
}
在将要执行控制器的行之前
$controller->run();