由于某些众所周知的原因,我准备将空间搬到米国去了。由于另一个众所周知的原因,现在的域名也将很快停止使用。
我已经申请好了新的空间,近期可能就要搬过去了。先做个广告:在此诚招空间合租者一位,无限空间无限流量,PHP、Python、Perl、RoR、CGI、CGI-BIN、MySQL、PgSQL 全功能 Linux 空间,可自定义 php.ini,提供域名对应的邮箱储存、邮箱别名服务,支持 POP3、IMAP、邮件列表,独立 FTP 管理,带免费自签名证书的 SSL 服务,含一个免费域名及一个独立 IP,3年共计525元RMB。有意者邮箱联系 quanxunzhen@gmail.com
不过因为新空间还没摸索清楚,还在研究搬迁事宜。
下面讲讲今天的探索……这个新空间的 PHP 用了 CGI 的模式,而不是传统(或者说我熟悉的)PHP Module 的模式,而且作为 CGI 的 php 解析程序和 php.ini 配置文件也是放在网站的 cgi-bin 目录里面的,因此我怀疑可玩性很高,甚至可以自己编译 PHP 放上去用。不过这个空间有一个很麻烦的,就是不支持自动的泛域名匹配,这大大的不如现在的这个空间方便。不过经过一番研究,也并不是没有办法的。今天才算是第一次体会到了 Apache mod_rewrite 的强大!
本来以为 rewrite 不能实现那样功能的,因为似乎 rewrite 不能把主机名弄进来匹配,结果发现我想错了。参考了一些 Apache 的官方资料,我发现 Apache 的官方文档里有一种很有趣的方式间接实现泛域名到子文件夹的匹配,大约是这个样子的:
1 2 3 4 | RewriteEngine on RewriteCond %{HTTP_HOST} ^www\.[^.]+\.host\.com$ RewriteRule ^(.+) %{HTTP_HOST}$1 [C] RewriteRule ^www\.([^.]+)\.host\.com(.*) /home/$1$2 |
惊叹于这种其实妙想!这个恐怕能实现的功能比那个 VirtualHost 的模块还要强大了吧~
不过这个代码似乎是不能用的囧……做一个适合的修改就发生 500 错误……经过思考,我想起了很早以前说过的,mod_rewrite 是会把修改过的网址再次注入 rewrite 的,因此如果这样那么这个网址可能会不断的经过这个 rewrite 过程,造成死循环,最后被 Apache 以 500 强制结束。
看来想在网站根目录下像现在这样搞是不行了……不过,办法总是有的,其实有的时候我觉得自己还是蛮聪明的~我就在根目录下建立了一个名叫 www 的文件夹,然后给出了下面这样的 .htaccess:
1 2 3 4 5 | RewriteEngine On RewriteCond %{HTTP_HOST} ^[^\.]+\.upsuper\.org\.cn$ RewriteCond %{REQUEST_URI} !^/www/ RewriteRule ^(.*)$ %{HTTP_HOST}/$1 RewriteRule ^([^\.]+)\.upsuper\.org\.cn/(.*)$ /www/$1/$2 |
OK,现在已经非常正常了,网页可以正常访问了~不过新的问题再度出现!所有的 PHP 都显示 404 错误……我汗!404?!那个 PHP 明明在那里凭啥 404 呢?
后来在空间商的 FAQ 里面偶然看到,解析 PHP 用的东西储存在已经被我删掉的 cgi-bin 文件夹里面……呃……马上把所有内容删掉恢复原来的内容。然后再放上这个,还是 404……其中必有问题……那么问题一定出在 cgi-bin 文件夹上……难道 Apache 最后也要通过自己访问 CGI 接口?其实其中奥妙我也不是很了解,不过最后又加了一条针对 cgi-bin 的 rewrite 规则,成功解决。关于 Apache 和 PHP 通过 CGI 接口的机制看来还是很值得好好研究研究的嗯……下面是最后的代码:
1 2 3 4 5 6 | RewriteEngine On RewriteCond %{HTTP_HOST} ^[^\.]+\.upsuper\.org\.cn$ RewriteCond %{REQUEST_URI} !^/www/ RewriteCond %{REQUEST_URI} !^/cgi-bin/ RewriteRule ^(.*)$ %{HTTP_HOST}/$1 RewriteRule ^([^\.]+)\.upsuper\.org\.cn/(.*)$ /www/$1/$2 |
最后还有一个小小的问题,就是遇到找不到的 PHP,服务器虽然返回了 404 的头,不过显示的内容却是“No input file specified.”,而不是我指定的 404 页面(当然,IE 用户肯定什么都看不到,因为 IE 已经默认为他们准备好了一个“友好”的 404 页面)。这个虽然不是什么大问题,不过也还是很烦人的,有搜索了一番,最后在 rewrite 规则里面又加了两行解决问题:
1 2 | RewriteCond %{DOCUMENT_ROOT}/$1 !-f RewriteRule ^(.*\.php)$ - [T=text/html] |
稍微想一想肯定看出来,这个代码不是没有问题的,不过我想我应该不会遇到吧……嗯……
最后就是关于 php.ini,php.ini 里面不小心撇到了 mbstring 的设置,发现默认语言竟然是 Japanese……呃……马上改成了 Chinese,并且把下面的默认编码 EUC-JP 也改成了 EUC-CN,真是无语……不知道这个是 PHP 的默认配置,还是那个客服看我英语这么差以为我是日本人“帮”我设置的呢?
参考资料:
还想讲一点买空间的事情。因为这个空间商支持支付宝,我就决定用支付宝。而且支付宝不是支持 Linux 么,很好的嘛。今天中午就跑到邮局去汇款给我很早以前申请了但一直没用的支付宝账户充钱。然后充完跑回来打开上网本登录支付宝充值……为什么要打开上网本?因为台机的 Arch Linux 已经把 Firefox 升级到了 3.6,而支付宝唯一支持 Linux 的插件,是不兼容 Firefox 3.6 的……幸好上网本的 Ubuntu 9.10 很乖巧的使用了 Firefox 3.5.8,还能用那个支付宝插件。很期待支付宝能快些支持 Firefox 3.6,这样我以后也可以网购了~这年头天朝的银行不厚道,几乎完全不支持我家 Linux……还是支付宝好嗯~
哇,好强大的空间~~独立IP+SSL。。。。。
PS:RewriteRule后面加一个[L]不就可以防止死循环了么……
但是那样可能照成子目录 Wordpress 的 Rewrite 规则出问题啊……