wordpress与codeigniter 4共存需物理隔离或路径级分流,nginx/apache须为ci4子路径单独配置入口和重写规则,避免wp拦截,并确保ci4路由前缀不与wp页面别名冲突。

WordPress伪静态规则和CodeIgniter 4路由重写共存时,最常出问题的地方不是“谁覆盖谁”,而是两者在Web服务器层面对请求路径的处理逻辑打架——WP想把所有非静态资源都交给index.php(前端控制器),而CI4也依赖同样的机制来接管请求;但若配置顺序或范围不对,就会出现/wp-admin进不去、/home返回WP 404、或者CI4路由全失效的情况。
先确认服务端入口是否冲突
WP和CI4不能共用同一个index.php文件,也不能放在同一级目录下直接混用。常见错误配置是把CI4项目整个丢进WordPress子目录(如/var/www/html/wp-content/themes/myci/),这会导致Nginx/Apache根本分不清该走WP还是CI4的重写逻辑。
- 正确做法:两个系统物理隔离,比如WP跑在
example.com/,CI4跑在example.com/api/或api.example.com/ - 若必须同域不同路径(如WP在根,CI4在
/app/),则Web服务器配置中必须为CI4子路径单独设置location块(Nginx)或段(Apache),且明确指定其 index.php入口和重写规则 - CI4项目
public/目录必须作为实际Web根目录(或其子路径),不能让WP的index.php先拦截掉所有请求
Nginx下共存配置要点
以WP主站 + CI4部署在/app/为例,server块需分段处理:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 根路径交给WordPress:
location / { try_files $uri $uri/ /index.php?$args; } - CI4子路径独立接管:
location /app/ { alias /path/to/ci4/public/; try_files $uri $uri/ /app/index.php?$query_string; } - 关键细节:
alias后路径末尾必须有斜杠;/app/index.php中的/app要与location前缀一致;$query_string不能写成$args,否则CI4无法解析URI段 - 务必关闭WP对
/app/路径的干扰:在WP后台→固定链接里,避免使用含/app/字样的自定义结构;也可在.htaccess(如果Apache兼容模式启用)中加RewriteRule ^app/ - [L]提前放行
Apache环境下避坑组合
WP根目录下有.htaccess,CI4子目录(如/app/)也需自己的.htaccess,二者不能合并。
- WP根目录
.htaccess保持默认(含RewriteBase /),但要在末尾加排除规则:RewriteRule ^app/ - [L],确保/app/xxx不被WP重写捕获 - CI4子目录
/app/.htaccess内容必须精简且路径适配:RewriteEngine On<br>RewriteCond %{REQUEST_FILENAME} !-f<br>RewriteCond %{REQUEST_FILENAME} !-d<br>RewriteRule ^(.*)$ index.php/$1 [L]
注意:RewriteBase /app/这一行必须加上,否则$1会丢失前缀,导致CI4路由解析失败 - Apache虚拟主机配置中,对应
/app/目录的块必须设 AllowOverride All,否则子目录.htaccess无效
CI4路由与WP路径语义不重叠
即使Web服务器层分流成功,应用层仍可能因URL设计引发隐性冲突。例如WP有页面/contact,CI4又注册了$routes->get('/contact', 'Contact::index'),用户访问/contact时只会命中WP,根本到不了CI4。
- 解决方案:CI4所有对外暴露的路由统一加命名空间前缀,如
/api/v1/users、/ci/home,避开WP已占用的常规路径(/about、/blog、/wp-admin等) - 若需复用相同语义路径(如SEO要求),只能二选一:要么把WP页面转为CI4视图(移除WP,只留CI4),要么将CI4功能封装为WP REST API扩展,不再走独立路由
- 检查
php spark routes输出,确认CI4注册的路径没和WP已知页面别名重复;WP页面别名可在后台→页面列表中查看“永久链接”列










