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

时间:2016-08-15 11:52:41

标签: php redirect http-status-code-404 prestashop prestashop-1.6

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

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

由于

3 个答案:

答案 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();