要实现CodeIgniter的SEO友好URL,必须同时满足:Web服务器正确转发请求、框架路由精准映射、生成带协议和域名的绝对URL;缺一不可。

CodeIgniter 默认生成的 URL 带 index.php、参数冗长、路径不语义化,直接交到搜索引擎手里等于主动放弃排名权重。要真正实现 SEO 友好 URL,必须同时满足三件事:Web 服务器正确转发请求、框架路由精准映射、生成的链接是带协议和域名的绝对 URL —— 少一个环节,百度/Google 爬到的就还是 index.php/product/view/123 这种无效链接。
Apache 或 Nginx 的重写规则必须生效
哪怕你在 config.php 里把 $config['index_page'] = '' 设对了,routes.php 也写了干净路由,只要 Web 服务器没把请求转给 index.php,所有努力都白搭。
- Apache 下必须启用
mod_rewrite,且项目根目录的.htaccess文件内容不能少这三行:RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php/$1 [L] - Apache 虚拟主机配置里得有
AllowOverride All,否则.htaccess被忽略 - Nginx 不读
.htaccess,必须在server块里加:try_files $uri $uri/ /index.php?$query_string;
,漏掉$query_string会导致 GET 参数丢失 - 验证是否生效:访问
https://yoursite.com/about,如果返回 404 而不是跳转到控制器,说明重写失败,别急着调路由
路由定义必须匹配真实访问路径,而非“看起来像”
很多人写 $route['product/(:any)'] = 'catalog/view/'; 后,以为 /product/apple-iphone-5s 就能进 Catalog::view(),结果 404。问题往往出在 URI 分段解析被干扰或正则没覆盖边界。
Google索引API工具。用于提交URL以供Google索引。支持两种模式:“auto-index”(获取sitemap,与缓存对比差异并提交...)
- 确保
$route['translate_uri_dashes'] = FALSE;(默认值),除非你真需要把my-page自动转成my_page控制器名 - 带连字符的 slug(如
apple-iphone-5s)要用([^/]+)替代(:any),因为:any会匹配斜杠,导致后续分段错位 - 多语言前缀必须前置拦截,例如
$route['^(en|zh)/(.+)$'] = '$2';,否则/en/product/123会被当成控制器en、方法product,根本进不了路由匹配 - 数据库中存 slug 字段时,必须保证唯一性;同一产品不能有两个不同 slug 指向同一 ID,否则 canonical 和 hreflang 会冲突
生成的链接必须是完整 HTTP(S) URL,不能靠 site_url() 凑合
site_url('product/detail/123') 输出的是相对路径,百度主动推送接口直接拒收。它只适合页面内跳转,不适合外发链接、sitemap 或 API 提交。
- 绝对 URL 必须手动拼:
$config['base_url'] . 'product/' . $slug,其中$config['base_url']必须以https://开头、末尾**不能**有斜杠 - 如果项目部署在子目录(如
https://example.com/myapp/),$config['base_url']必须精确为https://example.com/myapp,少一个myapp就 404 - CI4 中用
url_to('product.view', ['slug' => $slug])前,必须先在Routes.php里注册命名路由:route::get('product/[:slug]', 'Product::view')->name('product.view');,否则抛异常 - 中文标题转拼音 slug 必须自己处理,
url_title()需传入 UTF-8 字符串且依赖mbstring扩展,线上环境常因缺失该扩展导致 slug 为空
最易被忽略的一点:所有 SEO 链接的生成逻辑,必须和当前请求的 URI 结构完全一致。比如你在路由里把 /article/123 映射到 Post::show,那生成链接时就不能用 /post/123 —— 即使控制器叫 Post,URL 路径也必须按路由定义来。搜索引擎只认 URL,不认控制器名。

















