如何在CodeIgniter中生成类似文章标题格式的URL?
好的,在CodeIgniter里实现这种SEO友好的文章URL其实很直观,分几个步骤来就行,我给你一步步拆解:
1. 先移除URL里的index.php(必备基础)
首先得让服务器支持URL重写,去掉默认的index.php前缀。如果你用Apache,在项目根目录创建.htaccess文件,内容如下:
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php/$1 [L]
要是用Nginx,就在server配置块里添加这段规则:
location / { try_files $uri $uri/ /index.php?$args; }
别忘了打开application/config/config.php,把$config['index_page']改成空字符串:
$config['index_page'] = '';
2. 配置自定义路由规则
打开application/config/routes.php,添加一条路由,把Blog/my-article-name.html格式的URL映射到你的控制器方法。假设你的控制器是Blog,加载文章的方法是single_view,路由规则可以这么写:
// 匹配以.html结尾的文章URL,捕获文章slug作为参数 $route['Blog/(:any)\.html'] = 'Blog/single_view/$1';
这里的(:any)会抓取URL里的文章slug(也就是URL友好的文章名称,比如my-article-name),并把它作为参数传递给single_view方法。
3. 修改控制器方法接收slug参数
在Blog.php控制器里,调整single_view方法,用slug从数据库查询对应文章:
public function single_view($slug) { // 加载模型并查询文章 $this->load->model('Blog_model'); $article = $this->Blog_model->get_article_by_slug($slug); // 没找到文章就返回404 if (!$article) { show_404(); } // 把文章数据传给视图 $data['article'] = $article; $this->load->view('single_view', $data); }
然后在你的Blog_model.php模型里,实现根据slug查询文章的方法:
public function get_article_by_slug($slug) { $this->db->where('slug', $slug); return $this->db->get('articles')->row(); }
这里要注意:你的文章表(比如articles)需要新增一个slug字段,用来存储URL友好的文章名称。创建文章时,可以用CodeIgniter自带的url_title函数生成slug:
// 示例:把原始标题转成slug $original_title = "My Awesome Article"; $slug = url_title($original_title, 'dash', TRUE); // 输出结果:my-awesome-article
4. 生成友好URL链接
在视图或控制器里,要生成www.example.com/Blog/my-article-name.html这种链接,用CodeIgniter的site_url或者anchor函数就行:
// 用site_url生成纯URL echo site_url('Blog/' . $article->slug . '.html'); // 用anchor生成带文本的链接 echo anchor('Blog/' . $article->slug . '.html', $article->title);
这样一套流程下来,就能完美实现你想要的包含文章名称的友好URL了。如果遇到404问题,记得检查路由规则是否正确、.htaccess是否生效,还有数据库里的slug字段是否正确存储哦。
内容的提问来源于stack exchange,提问作者Fatih Ay

