【问题标题】:Removing Controller name from URL in CodeIgniter在 CodeIgniter 中从 URL 中删除控制器名称
【发布时间】:2011-08-04 08:27:16
【问题描述】:

目前在我的 CI 项目中,我有一个控制器来处理所有帐户。如注册、登录、激活等。

我的路线就是这样工作的......

domain.com/account/login/ 或 domain.com/account/register/

如何从路由中删除account,同时还要从其他页面中删除控制器。

我基本上希望始终删除控制器。我这样做的一个原因是 SEO,搜索引擎根据页面在网站中的深度对页面的重要性进行排名。

我似乎实现这一目标的唯一方法是为每个页面执行route['activate'] = 'account/activate'; 之类的操作,这将是一个巨大的麻烦。

【问题讨论】:

  • 您是否预见到任何具有相同方法名称的方法?

标签: php codeigniter controller routes


【解决方案1】:
$route['^(?!other|controllers).*'] = “account/$0″;

【讨论】:

  • 这对我有用。由于在我的安装中如何重写 URL,我需要使用 $route['^(?!/other|/controllers).*'] = "controller/$0";
【解决方案2】:

试试这个:

$route['(:any)'] = "account/$1";

【讨论】:

  • 问题在于,我有多个控制器。
  • 我回答了这个问题,因为您提到“我有一个控制器可以处理所有帐户”。如果您有不同的控制器,则必须为每个控制器显式设置路由。
  • 啊,对不起,但我后来也提到我想对我所有的控制器都这样做。
【解决方案3】:

您的问题的答案是您必须明确设置路线。

它如何知道给定函数在哪个控制器中????

你必须告诉它。

【讨论】:

  • 这就是我的想法,但我希望有一些魔力:)
  • 如果你想要魔法,请使用 Rails,codeigniter 期望你成为魔法师。
【解决方案4】:

使用 mod_rewrite(如果控制器总是同名)

【讨论】:

    【解决方案5】:

    好的,我可以想到一种方法来做到这一点,但这可能比仅仅为每个函数写出路线更痛苦。

    您需要使用application/core/MY_Router.php 扩展Router.php 并覆盖_validate_request() 方法。这基本上决定了这是否是一条有效的路线。

    它会检查控制器类是否存在,如果不存在则失败。 您需要用一些假定没有控制器段的代码替换它,然后扫描每个控制器并检查它是否包含调用的方法(它将是段 1,因为没有控制器)。

    现在棘手的部分是,在 CI 生命周期的这一点上,您的控制器显然没有加载,因此您还不能使用 method_exists() 检查它。

    您需要一次加载一个控制器,然后为每个控制器运行

    method_exists($loaded_class, $method_name)
    

    如果它是真的,那么设置然后继续调用:

    $this->set_class('the_name_of_the_scanned_class_which_had_the_method');
    

    然后 CI 可以继续正常运行,它会在用户不知道它从哪个控制器加载的情况下加载您的方法。

    .. 可能不值得麻烦恕我直言。一个更简单的解决方案是只有一个控制器和一个到该控制器的路由。

    【讨论】:

      猜你喜欢
      • 2018-01-10
      • 2016-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-08
      • 2014-12-16
      • 1970-01-01
      • 2016-03-25
      相关资源
      最近更新 更多