CodeIgniter不内置百度收录提交和SEO链接生成逻辑,需手动拼接base_url与路由路径生成绝对URL,严格配置重写规则、base_url及命名路由,并确保中文转拼音等辅助功能完备,三者任一错位即导致SEO失效。

CodeIgniter 本身不内置百度收录提交或 SEO 友好链接生成逻辑,所有 URL 提交和链接规则都得靠你自己控制输出、配合百度 API 和重写规则来实现。别指望 url_title() 或 site_url() 自动适配百度推送要求——它们只管生成路径,不管搜索引擎要不要收。
百度主动推送必须用完整可访问的 HTTP(S) URL
百度 API 要求提交的是带协议、域名、路径的绝对 URL,比如 https://example.com/article/123。而 CodeIgniter 的 site_url('article/view/123') 默认输出的是相对路径 /index.php/article/view/123(或重写后 /article/view/123),没协议也没域名,直接丢给百度会失败。
- 必须手动拼接:用
$config['base_url']+ 路由路径,例如$config['base_url'] . 'article/' . $id - 确保
$config['base_url']以https://开头且末尾不带斜杠(否则变成https://example.com//article/123) - 如果项目部署在子目录(如
https://example.com/myapp/),base_url必须精确匹配,不能漏掉/myapp - 避免用
current_url()获取当前地址再提交——它依赖$_SERVER,在 CLI 或异步任务里不可用
CI3 和 CI4 的 SEO 链接生成方式完全不同
CI3 的 site_url() 和 base_url() 是全局函数,输出受 $config['index_page'] 和 $config['uri_protocol'] 控制;CI4 则改用 url_to()、site_url()(新实现)和 base_url(),且默认关闭 index.php,但路由注册方式更严格。
- CI3 中想隐藏
index.php,除了配置$config['index_page'] = '',还必须配好 Apache 的.htaccess或 Nginx 的try_files,否则site_url()生成的链接点开会 404 - CI4 的
url_to('article.view', ['id' => 123])依赖你在Routes.php里显式定义了命名路由,没定义就抛异常,不像 CI3 那样“尽力猜” - 两者都不自动处理中文标题转拼音。若要生成
/article/如何配置-codeigniter这类链接,得自己写辅助函数调用url_title()并传入 UTF-8 字符串,且确认 PHP 的mbstring已启用
伪静态规则失效时,SEO 链接全是 index.php 开头
这是最常被忽略的环节:即使你代码里写了干净的 site_url('product/detail'),如果 Web 服务器没正确转发请求,浏览器实际访问的仍是 index.php/product/detail,百度抓取时看到的也是带 index.php 的 URL,等同于放弃 SEO。
- Apache 下检查
.htaccess是否被读取:在根目录放一个临时文件,加deny from all,看是否 403;不是则说明 mod_rewrite 没生效或 AllowOverride 被禁用 - Nginx 下不能只抄网上的
if (!-e $request_filename)规则——它在某些版本会引发 500 错误,推荐用try_files $uri $uri/ /index.php?$query_string; - CI4 的
index_page配置项已移除,必须靠 Web 服务器规则把所有非静态资源请求导向public/index.php - 验证方法:直接访问
https://yoursite.com/nonexistent-path,如果返回 CI 的 404 页面,说明重写成功;如果返回 Web 服务器原生 404,说明规则没起作用
真正卡住人的从来不是百度 API 怎么调,而是你生成的链接在用户浏览器里点不开、在百度爬虫眼里是死链。重写规则、base_url 配置、路由定义这三者只要一个没对齐,后面所有 SEO 动作都是往沟里推。











