【问题标题】:Seo-friendly url in CodeIgniterCodeIgniter 中对搜索引擎友好的 url
【发布时间】:2017-04-13 11:55:27
【问题描述】:

我创建了一个过滤器方法来过滤产品列表。这是我的网址:

localhost/myshop/products/filter?category=shirts&color=blue&page=1

但我想这样展示:

localhost/myshop/products/shirts/blue/1

我怎样才能实现它?

【问题讨论】:

  • 第一个 URL 中的控制器名称是什么?
  • 请提供您尝试过的代码,以便其他人可以帮助您。
  • 对不起,我忘记了。这是产品。

标签: php codeigniter url routes seo


【解决方案1】:

假设Products::filter()负责处理请求,你可以重写方法来接受其签名中的参数。所以,如果当前的逻辑是这样的:

class Products extends CI_Controller
{
    public function filter()
    {
        // Retrieve data from GET params
        $page     = $this->input->get('page');
        $color    = $this->input->get('color');
        $category = $this->input->get('category');
    
        // Do the filtering with $category, $color and $page...
    }
}

您可以简单地重构它以通过 URL 段接受参数:

public function filter($category, $color, $page)
{        
    // Do the filtering with $category, $color and $page...
}

有了这个,您当前的网址是:

localhost/myshop/products/filter/shirts/blue/1

我们需要摆脱多余的filter/,我们就完成了,对吧?引用自docs

通常,URL 字符串与其对应的控制器类/方法之间存在一对一的关系。 URI 中的段通常遵循以下模式:

example.com/class/method/param1/param2

然而,在某些情况下,您可能希望重新映射这种关系,以便可以调用不同的类/方法来代替与 URL 对应的类/方法。

好的,所以我们需要重新映射当前路线。您有几个选择:

  • 首先,使用新条目更新您的 application/config/routes.php 文件:

      $route['products/(:any)'] = 'products/filter/$1';
    

    它表示如果 URL 以 products/ 开头,则将其重新映射到 products 类的 filter 方法。

    在这里,您可以使用通配符和正则表达式模式来更准确地了解您的方法接受的参数类型。

  • 另一种选择是您可能希望在控制器中实现 _remap() 方法,以便为您重新映射路由。

【讨论】:

  • 太棒了!这是完美的!!谢谢,但是如果其中一个参数为空,如何避免?例如:localhost/myshop/products/filter/blue/1
  • 没关系。如果一个或多个参数为空,CodeIgniter 将为您抛出一个ArgumentCountError 异常。如果一个或多个参数包含非法字符,您将获得400 Bad Request。因此,基本上,您可以安全地抵御这些威胁。
  • 即使在routes.php 文件中,您也可以指定通配符/正则表达式模式来匹配和保护参数。例如,您希望$page 始终是一个数字:$route['products/(:any)/(:any)/(:num)'] = 'products/filter/$1/$2/$3';。在routing docs 中阅读更多相关信息。
【解决方案2】:

routes.php文件中,你可以写下一行

    $route['products/(:any)/(:any)/(:num)'] = 'products/filter/$1/$2/$3';

功能如下

    public function filter($category, $color, $page)
    {        
        echo $category.'<br>';
        echo $color.'<br>';         
        echo $page.'<br>';
    }

【讨论】:

    猜你喜欢
    • 2011-08-31
    • 2012-06-18
    • 2015-02-04
    • 2021-06-12
    • 2013-10-16
    • 2014-11-09
    • 2010-12-11
    • 1970-01-01
    • 2011-12-24
    相关资源
    最近更新 更多