WordPress主站与子目录CodeIgniter URL重写问题求助
搞定WordPress根目录下CodeIgniter的URL重写问题
我来帮你解决这个URL重写的坑!你要把http://example.com/developer直接映射到子目录drinking-water-database里的对应路径,之前的规则没生效主要是匹配范围不全、规则顺序不对,还有不必要的外部重定向,我给你调整一下配置:
调整后的完整.htaccess配置(替换原WordPress区块内容)
# BEGIN WordPress # `BEGIN WordPress`和`END WordPress`之间的指令是动态生成的,仅应通过WordPress过滤器修改。 # 对此标记间指令的任何修改都会被覆盖。 <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / # 优先处理CodeIgniter的developer路径映射 # 同时匹配/developer、/developer/、/developer/xxx等所有场景 RewriteRule ^developer(/.*)?$ drinking-water-database/index.php?/developer$1 [L] # 保留WordPress原有的核心重写规则 RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> # END WordPress
为啥之前的规则不行?我给你拆解下关键修改点:
- 规则顺序很重要:把CodeIgniter的规则放在WordPress规则前面,不然WordPress的兜底规则会先把请求抢走,直接跳去index.php导致404。
- 匹配范围要全:之前的
^developer/(.*)/$只能匹配带结尾斜杠的路径,比如/developer/test/,但你访问的/developer(不带斜杠)根本匹配不到,新规则^developer(/.*)?$能覆盖所有可能的访问形式。 - 别用外部重定向:之前的
R=301会让浏览器跳转到子目录的URL,用户能看到地址栏变化,我们要的是内部重写(地址栏保持/developer),所以去掉R=301,只留[L]表示这条规则处理完就停止。
额外要检查的几个点:
- 确认服务器开了
mod_rewrite模块,没开的话重写规则根本不会生效。 - 去CodeIgniter的
config.php里把$config['index_page']设为空字符串'',这样能让框架正常处理无index.php的URL。 - 测试前清一下浏览器缓存,之前的301缓存可能会干扰测试结果。
要是你想单独测试规则,也可以把下面这段放在根目录.htaccess的最顶部(WordPress区块外面):
<IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^developer(/.*)?$ drinking-water-database/index.php?/developer$1 [L] </IfModule>
不过更推荐整合到WordPress的区块里,避免规则冲突。
内容的提问来源于stack exchange,提问作者Airful
相关产品推荐
相关产品推荐

