301使用正确的段重定向

时间:2015-06-30 06:41:51

标签: php .htaccess symfony redirect

重定向所有已更改/重复的网址

/changed-title/2
/another-changed-title/2

更正网址

/original-correct-title/2

例如

http://stackoverflow.com/questions/232323/original-title-of-question

如果我更改url(slug)的最后一部分并按Enter键

http://stackoverflow.com/questions/232323/changed-title-of-question-duplicate

仍会被重定向到正确的slug正确的网址

在当前页面上尝试

我想做同样的事情

我正在使用symfony框架

的routing.yml

topic_item_redirect:
    path:   /topic/{title}/{id}
    defaults: { _controller: AppBundle:Topic:redirectToItem }

topic_item:
    path:    /topic/{title}/{id}
    defaults: { _controller: AppBundle:Topic:item }

TopicController.php

public function redirectToItemAction($title,$id) {

    $title = $this->getDoctrine()->getManager()->getConnection()
        ->fetchColumn(
                'select title from topic where id = ?',
                [$id]);

    // action which renders topic
    return $this->redirectToRoute('topic_item',['title'=>$title,'id'=>$id],301);
}

这种方法对我不起作用

2 个答案:

答案 0 :(得分:3)

要模拟SO行为,您可以在TopicController.php中添加此类php片段:

$id    = $_GET['id'];
$title = $_GET['title'];

$dbTitle = $this->getDoctrine()->getManager()->getConnection()
    ->fetchColumn(
            'select title from topic where id = ?',
            [$id]);

if ($title != $dbTitle) {
   // redirect with 301 to correct /questions/<id>/<title> page
   header ('HTTP/1.1 301 Moved Permanently');
   header('Location: /questions/' . $id . '/' . $dbTitle);
   exit;
}
// rest of your script

答案 1 :(得分:0)

由于topic_item_redirecttopic_item都使用相同的path属性,因此您每次都会被重定向。

我认为您需要在控制器中处理此问题:获取slug,查询DB并确定是否需要/不需要重定向。

希望这有帮助