如何修复CakePHP环境下WordPress的重定向异常问题
搞定你的CakePHP+WordPress重定向问题!
我来帮你拆解并解决这个烦人的重定向问题——咱们先理清楚核心矛盾:你现在的多层.htaccess规则撞车了!原本/var/www/.htaccess已经把所有请求都转发到CakePHP的html/webroot/目录,但/var/www/html/.htaccess又多做了一次转发到webroot/的操作,这就导致WordPress的/blog路径被错误地加上了webroot/前缀,最终出现了example.com/webroot/blog的错误重定向。另外你之前加的尾部斜杠移除规则,顺序没放对也可能添乱。
下面是一步步的修复方案:
1. 保留/var/www/.htaccess的原样(它没问题)
这个文件的作用是把根请求直接导向CakePHP的webroot,规则是对的,不用改:
<IfModule mod_rewrite.c> RewriteEngine on RewriteRule ^$ html/webroot/ [L] RewriteRule (.*) html/webroot/$1 [L] </IfModule>
2. 重点修改/var/www/html/.htaccess(这是问题核心)
这个文件里的转发到webroot的规则完全多余,而且是罪魁祸首。我们调整一下:
- 保留www重定向的规则(这个是对的)
- 移除重复的webroot转发规则
- 把尾部斜杠移除的规则调整到合适位置,避免干扰WordPress的链接
修改后的代码:
<IfModule mod_rewrite.c> RewriteEngine on # 先处理www跳转,优先级最高 RewriteCond %{HTTP_HOST} ^example\.com$ [NC] RewriteRule ^ http://www.example.com%{REQUEST_URI} [R=301,L] # 移除尾部斜杠,但排除真实目录(不然WordPress的目录链接会出问题) RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)/$ /$1 [L,R=301] # 这里删掉原来的webroot转发规则!因为上层已经处理过了 </IfModule>
3. 简化/var/www/html/webroot/.htaccess
把之前注释掉的尾部斜杠规则彻底删掉,因为我们已经在上面的文件里统一处理了,保持CakePHP的核心路由规则干净:
<IfModule mod_rewrite.c> RewriteEngine On # CakePHP的核心路由,处理非文件/目录的请求 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php [QSA,L] </IfModule>
4. WordPress的.htaccess保持默认就行
/var/www/html/webroot/blog/.htaccess的规则是WordPress自动生成的,完全没问题,不用修改:
# BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase /blog/ RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /blog/index.php [L] </IfModule> # END WordPress
最后别忘了清缓存!
因为你之前用了301永久重定向,浏览器会死死记住旧的规则,所以修改完一定要清除浏览器缓存,或者用无痕模式测试,确保新规则生效。
这样调整后,首页的双斜杠问题会被解决,WordPress的/blog也能正常访问,不会再跳去webroot/blog啦!
内容的提问来源于stack exchange,提问作者Trey Copeland
相关产品推荐
相关产品推荐

