如何禁用 prestashop 的页面未找到重定向?

How to disable prestashop's page-not-found redirect?

我在 VPS 主机上安装了 Prestashop 1.6,并且一切正常,除了当我尝试访问不存在的页面时,而不是提供 404 页面模板,返回 301 重定向,客户端被重定向到显示 404 模板的 index.php?controller=page-not-found

由于 SEO 原因,这对我不起作用。 如何禁用此重定向?

谢谢

原来 prestashop 的默认行为是重定向。这不是覆盖。无论如何 - 我找到了一种方法来实现我想做的事情。

经过一段时间的努力 - 我想出了一个迟钝的解决方案,现在就可以了。 我在这里分享它,因为我肯定会很高兴在几天前找到它,但请注意 - 它已被延迟到没有 return 的地步。 如果你能想出别的东西,不推荐。

我所做的是这个 - 我在 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();

不要忘记,如果控制器被覆盖,它可能无法正常工作。

我在覆盖的工具控制器中完成了此操作

public 静态函数 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();

    }

}

针对此问题的全局解决方案(因此您不必逐个控制器)直接进入 -> classes/Dispatcher。php 在那里你会找到调度功能。 你可以做类似的事情 ->

if ($this->controller == $this->controller_not_found) {
//your code here
}

在将要执行控制器的行之前

$controller->run();