前段时间将博客从独立服务器迁移到了 Godaddy 的主机上,顺便从 Magike 换到了 Typecho。期间先将 Magike 迁移到 Godaddy 的主机上测试,然后将本地安装好的 Typecho 迁移到 Godaddy 的主机上测试,最后在 Godaddy 主机上全新安装 Typecho,整个过程始终被一个诡异的问题所困扰,即重写无法生效。
这个问题源于 Godaddy 主机环境使用的 Apache 版本和 Magike、Typecho 本身使用的 Rewrite 机制。经过自己反复折腾和反复骚扰 70 同学后均没有彻底解决问题,最后易先生眼看自己的博客也受到了影响,于是才亲自动手搞定。
这个问题是这样的:
首先,Godaddy 主机的 Apache 版本是 1.3.33。假设 Magike 或 Typecho 没有开启伪静态,在处理类似 https://www.xuchao.org/index.php/archives/1/ 这样的地址时,服务器会在
/index.php/archives/1/ 这个目录里找 index.php 然后来执行,并不会带上 /archives/1/
这个参数,所以点到哪都是首页。若 Magike 或 Typecho 开启了伪静态,浏览器则会接收到 404 错误。
要解决这个问题,大致有两种方案:
1、改变 Magike 和 Typecho 的 URL 传参形式,及程序获得参数的方法;
2、通过升级 Apache 版本等方式,解决服务器对 Magike 和 Typecho 的 URL 的识别。
很显然,在一个租用环境中无法做到第二点。因此只能考虑调整 Magike 和 Typecho 的 URL 解析的函数。
最后问题是这样解决的:
1、Magike
在根目录 index.php 的 include('./core/core.php'); 这行前面加上如下代码:
$baseInfo = @explode('?', $_SERVER['REQUEST_URI'], 2);
if (is_array($baseInfo))
{
$_SERVER['REQUEST_URI'] = $_SERVER['REQUEST_URI'];
$_SERVER['PATH_INFO'] = $baseInfo[0];
unset($_GET);
if ($baseInfo[1])
{
$getInfo = @explode('&', $baseInfo[1]);
foreach ($getInfo as $v)
{
$getInfo2 = @explode('=', $v);
$_GET[$getInfo2[0]] = $getInfo2[1];
}
}
}
如果启用了伪静态,则需要修改 .htaccess 文件如下:
RewriteEngine On
RewriteBase /
RewriteRule index(\.)php/(.*) /index.php?/$2 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?/$1 [L]
2、Typecho
在根目录 index.php 的 Typecho_Plugin::factory('index.php')->begin(); 这行前面加上上面一样的代码,若需伪静态,.htaccess 文件也一样。
值得庆幸地是,以上问题仅存在于 Magike 和 Typecho 0.6 以下(含)版本,最新的 Typecho 0.7 正式版已完全解决此问题。
问题解决,立此存照。感谢易先生的帮助与 70 同学的辛勤耕耘。
2013 年 4 月 13 日更新:关闭本篇文章评论,垃圾太多。