CodeIgniter伪静态核心是路由匹配、Web服务器跳过文件检查、请求交由index.php处理三者缺一不可;Apache需开启mod_rewrite、AllowOverride All并配置正确.htaccess;Nginx应使用try_files而非if重写;路由正则需精确捕获,config.php中index_page须置空、uri_protocol设为REQUEST_URI,且必须加载url helper。
CodeIgniter 实现文章伪静态 URL 的核心不是“加后缀”,而是让路由匹配真实路径、Web 服务器跳过文件/目录检查、并把请求正确交给处理——三者缺一不可,漏掉任一环都会 404。
Apache 下伪静态失效的典型表现和修复点
你改了
,加了
,但访问
直接报 404,不是代码问题,是 Apache 根本没把请求转给 CI。
确认
中
已取消注释
找到所有
(常见于
块),改成
—— WAMP/XAMPP 通常有 2–3 处,别只改一处
必须放在项目根目录(和
同级),内容用这个最稳的版本:
别信网上那些带
或多层
的变体,CI 3.x 默认用
模式,
才能被正确解析
Nginx 下
替代
更可靠
Nginx 不支持
,硬套 Apache 规则会出问题。重点不是“重写”,而是“兜底”:当请求的文件或目录不存在时,交由
处理。
在
块内配置
时,必须用
:
不要用
—— Nginx 官方明确不推荐在
中使用
,容易触发意外跳转或 404
确保
指向物理路径,且
开启(否则
为空,CI 拿不到路由段)
如果项目不在 Web 根目录(比如
),
要配准,且
中的
是相对于
的,不是绝对路径
路由规则里正则捕获和参数传递的坑
伪静态 URL 的语义靠路由规则实现,但 CI 对
、
的替换很机械,稍不注意就传错参。
SEO GPT
免费的白帽SEO,PPC和网站经销商平台
下载
这样写没问题;但如果你写成
,顺序就反了
避免在正则中用贪婪匹配,比如
—— 若 URL 是
,
会是整个
,控制器方法得手动
,不如拆成
日期类路径建议用固定位数,比如
,既防误匹配,也方便后续做数据库查询
路由规则不区分大小写,但文件系统可能区分——确保控制器类名(
)、方法名(
)和路由里写的完全一致
和
的配套调整
光配路由和重写不够,CI 自身行为也要对齐。
必须设为空字符串,否则生成的
仍带
推荐设为
(CI 3.x 默认),比
兼容性更好,尤其在 Nginx + PHP-FPM 组合下
helper 必须加载(
),否则
无法生成带伪静态后缀的链接
生成 HTML 链接时,别手写
,用
并配合路由规则,才能保证开发/生产环境 URL 一致
真正难的不是写那几行重写规则,而是理解请求从浏览器发出后,如何经过 Web 服务器、PHP、CI 框架三层拦截与转发——每层都可能吃掉路径、丢掉参数、或拒绝处理。调试时优先看 Apache 的
或 Nginx 的
,里面往往直接告诉你哪一步没走通。
index.phproutes.php$route['news/(\d+)\.html'] = 'article/show/$1';/news/123.htmlhttpd.confLoadModule rewrite_module modules/mod_rewrite.soAllowOverride NoneAllowOverride All.htaccessindex.phpRewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]QSA,PTRewriteBasePATH_INFOindex.php/$1try_filesrewrite.htaccessindex.phpserverlocation /try_fileslocation / {
try_files $uri $uri/ /index.php?$query_string;
}if (!-e $request_filename) { rewrite ... }locationiffastcgi_param SCRIPT_FILENAMEfastcgi_split_path_infoPATH_INFO/var/www/html/blog/roottry_files/index.phproot$route['article/(\d+)-(\d+)\.html'] = 'article/detail/$1/$2';'article/detail/$2/$1'news/(.*)\.htmlnews/2026/04/18/abc.html$12026/04/18/abcexplode()news/(\d+)/(\d+)/(\d+)/([a-z]+)\.htmlnews/(\d{4})-(\d{2})-(\d{2})/(\d+)\.htmlArticle.phpshow()config.phpautoload.php$config['index_page'] = '';site_url()index.php$config['uri_protocol']REQUEST_URIPATH_INFOurl$autoload['helper'] = ['url'];site_url('article/show/123')site_url('article/show/123')error_logerror.log