如何删除 url codeigniter 路由 htaccess 中的某些部分

Posted

技术标签:

【中文标题】如何删除 url codeigniter 路由 htaccess 中的某些部分【英文标题】:how to remove some parts in the url codeigniter routes htaccess 【发布时间】:2019-06-18 22:05:02 【问题描述】:

假设我的网站中有这些网址

http://www.example.com/locations

http://www.example.com/locations/sydney

http://www.example.com/locations/brisbane

http://www.example.com/locations/perth

http://www.example.com/services/

http://www.example.com/services/cars

http://www.example.com/services/truck

http://www.example.com/services/phone

http://www.example.com/blog

http://www.example.com/blog/display/blog-title

http://www.example.com/blog/display/blog-title2

http://www.example.com/blog/display/blog-title3

http://www.example.com/blog/display/blog-title4

我想要的是像这样的网址

http://www.example.com/locations

http://www.example.com/sydney

http://www.example.com/brisbane

http://www.example.com/perth

http://www.example.com/services/

http://www.example.com/cars

http://www.example.com/truck

http://www.example.com/phone

http://www.example.com/blog

http://www.example.com/blog-title

http://www.example.com/blog-title2

http://www.example.com/blog-title3

http://www.example.com/blog-title4

如何在codeigniter中实现这一点??

我试过下面的代码:

$route[''] = 'blog/index';
$route['(:num)'] = 'blog/index/$1';
$route['(:any)'] = 'blog/display/$1';
$route['home/(:any)'] = 'blog/display/$1';

但问题是只为博客工作不能为其他人使用相同的代码,这会导致其他链接被破坏

所以我尝试@ACD 回答它给出了 2 个错误 1. 未定义属性:CI_Router::$load 2. null 时调用成员函数 library()

所以我做了一些这样的修改

$req = $this->uri->segment(1);
require_once ( BASEPATH. 'database/DB.php');
$db =& DB();
if ($db->get_where('home_inner_tbl', array('page_url' => $req))) 
    $route['(:any)'] = 'home/display/$1';
 elseif ($db->get_where('blog_tbl', array('page_url' => $req))) 
    $route['(:any)'] = 'blog/blog_display/$1';
 elseif ($db->get_where('towing_services_tbl', array('page_url' => $req)))  
$route['(:any)'] = 'towing-services/display/$1';
 elseif ($db->get_where('special_services_tbl', array('page_url' => $req))) 
$route['(:any)'] = 'cash-for-cars/display/$1';
 elseif ($db->get_where('locations_tbl', array('page_url' => $req))) 
$route['(:any)'] = 'locations/display/$1';

使用此代码,它没有给出错误,但只有 if 语句的第一行有效,即 $route['(:any)'] = 'home/display/$1';其他链接(例如定位、拖车服务、博客、现金换车)无效。

if 语句有问题吗?因为看起来这个答案应该是正确的。

顺便说一句,我的控制器看起来像这样

class Home extends CI_Controller


public function index() 
// some code in here

public function display($page_url) 
// some code in here


外观相同的控制器会转到其他人(位置、博客、拖曳服务等)

如您所见,我正在从数据库中调用 $page_url。

任何人都可以帮助我吗?谢谢

【问题讨论】:

【参考方案1】:

如果请求存在,您可以在创建路由之前首先过滤要采用的路由,假设可以在数据库中获取 url 请求(或将其更改为您采取的任何措施以了解它是否存在于某个类别中):

$req = $this->uri->segment(1);
if ($this->db->get_where('locations_table', array('name' => $req))) 
    $route['(:any)'] = 'locations/$1';
 else if ($this->db->get_where('blogs_table', array('name' => $req))) 
    $route['(:any)'] = 'blog/display/$1';
 else if ($this->db->get_where('services_table', array('name' => $req))) 
    $route['(:any)'] = 'services/$1';

仅供参考:除非每个类别都有特定的格式(例如:位置 - loc_singapore、loc_usa;服务 - svc_someservice 等),否则 htaccess 无法做到这一点

【讨论】:

嗨,我试过你的代码,它给了我 2 个错误 1. 未定义的属性:CI_Router::$load 2. 在 null 上调用成员函数 library() 我在 routes.php 中编写了你的​​代码,这是写它的正确位置吗?似乎它不理解 $this->db->get_where 部分。所以我试图 $this->load->library('database');但也没有用。有什么建议吗???。看来你很理解我的问题,能不能帮帮我

以上是关于如何删除 url codeigniter 路由 htaccess 中的某些部分的主要内容,如果未能解决你的问题,请参考以下文章

如何编写 .htaccess 文件以使 CodeIgniters URL 路由工作?

Codeigniter路由:如何在url中显示名称而不是id号

我如何路由到控制器并在 codeigniter 中运行?

Codeigniter 3.1.6 - 如何从 url 中删除 index.php

如何将所有XML扩展路由到特定方法codeigniter?

如何创建不覆盖其他控制器路由的 Codeigniter 路由?