【问题标题】:Server 400 error when beautifying URLs within the Yii Framework在 Yii 框架中美化 URL 时出现 Server 400 错误
【发布时间】:2014-08-25 12:28:46
【问题描述】:

所以,使用 urlManager 我已经能够做到这一点:

'people/<id:\d+>/<last:.*?>/<name:.*?>'=>'person/view',

生成这个:http://foo.com/people/3/smith/john

我想去掉 ID 号,在本例中为“3”

我试过用这个:

'people/<last:.*?>/<name:.*?>'=>'person/view', //makes sense right?

但是,当我尝试导航到 http://foo.com/people/smith/john 时,出现服务器 400 错误。 是什么赋予了?我应该尝试修改 .htaccess 文件吗?

这里要求的是我的整个 urlManager 组件:

    'urlManager'=>array(
        'urlFormat'=>'path',
        'showScriptName'=>false,
        'rules'=>array(
            'about' => array('site/page', 'defaultParams' => array('view' => 'about')),
            'contact'=>'site/contact',
            'login' =>'site/login',
            '/'=>'site/index',
            'people/<last:.*?>/<name:.*?>'=>'person/view',
            '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
            '<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
        ),
    ),

这是我的 PersonController.php 文件:

public function actionView()
{
    $person=$this->loadModel();
    $this->render('view',array(
        'model'=>$person,
    ));
}

private $_model;

public function loadModel()
{
    if($this->_model===null)
    {
        if(isset($_GET['last']))
        {
            $this->_model=Person::model()->findByPk($_GET['id']);
        }
        if($this->_model===null)
            throw new CHttpException(404,'The requested page does not exist.');
    }
    return $this->_model;
}

【问题讨论】:

  • 您的第二条规则中似乎有错字。它与第一个相同。此外,如果您粘贴了 urlManager 组件的全部内容,这将有所帮助,这样我们就可以看到哪些规则取代了哪些规则。这应该很容易解决。
  • 你说得对,我确实有错字,我编辑了我的问题以反映这一点
  • 你确定是 400 而不是 500?无论哪种情况,您都可以访问您的服务器日志以查看错误是什么?
  • 是的,肯定是 400。错误日志什么也没说,除了我今天早些时候犯的一些 php 语法错误。
  • 在这里抓住稻草,尝试以下操作:将最通用的规则“/”移到底部。将该规则中的星号更改为加号。并将点更改为\w

标签: url url-rewriting yii


【解决方案1】:

您的视图操作需要接受名称并通过属性进行查找,而不是使用需要 ID 的 loadModel:

public function actionView($last, $name)
{
    $person = Person::model()->find(
        'name=":name" AND last=":last"',
        array(':name'=>$name, ':last'=>$last)
    );

    if($person === null) throw new CHttpException(404);

    $this->render('view',array(
        'model'=>$person,
    ));
}

请注意,您的请求将不支持多个具有相同名字和姓氏的人!

【讨论】:

    【解决方案2】:

    您可能需要为 URL 设置重写条件,以便请求仍被路由回 index.php。

    查看本指南:http://www.yiiframework.com/doc/guide/1.1/en/topics.url#user-friendly-urls

    【讨论】:

      【解决方案3】:

      PersonControlleractionView

      public function actionView($id,...)
      {
      
      }
      

      所以视图操作必须需要一个$id 参数才能工作。否则会抛出 400 bad request 错误。在您修改后的 url 规则中,指定的唯一参数是 $last$name。解决方案是如果actionView内部没有使用$id参数,则将actionView()去掉。否则,您必须更改功能逻辑以从 $last$name 而不是 $id 确定所需人员

      【讨论】:

      • 感谢您的回答,我想我越来越近了,但它仍然在逃避我。我从 actionView() 和 loadModel() 中删除了 $id,但是如果不使用 $_GET['id'],我就无法让它工作。我已将我所拥有的内容添加到我的问题中。
      • 正如我已经说过的,如果你知道 id(主键),你只能加载一个人模型。在您修改后的 url 中没有 id 参数。所以你有两个选择。要么保留 url 中的 id,要么使用姓氏更改加载模型。对于第二种方法,姓氏必须是唯一的,即没有两个人的姓氏相同,这实际上是不可能的。
      猜你喜欢
      • 2015-01-26
      • 2014-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-05
      • 1970-01-01
      相关资源
      最近更新 更多