为phpwind做代理加速镜像

今天给风云墙做了一个教育网的代理服务器来给教育网的用户加速。本来以为是一个很简单的问题,结果却大费周折。

第一打算是用squid来做,结果却由于原来的80端口被占用,暂时找不到一个圆满的解决方案,只好放弃。

80端口已经被apache占用了,也就只好用mod_proxy来做了。
在apache中加上这么一个vhost,理论上应该是可以了,但是,里面的链接还是指向原来的http://bbs.clwind.net,并不像反向代理所期待的http://edu.clwind.net.

<VirtualHost *:80>
    ServerAdmin myhnet@gmail.com
    DocumentRoot /none
    ServerName  edu.clwind.net
    ProxyRequests Off
    ProxyPass  / http://bbs.clwind.net
    ProxyPassReverse / http://bbs.clwind.net
</VirtualHost>

开始一直以为是反向代理的问题(我对反向代理不太熟悉),查找了好久,也没发现问题所在(本来就不是他的问题,怎么可能发现得了)。最好做了一个最简单的网站来做源站,才发现原来是phpwind的head部分的问题。

在phpwind的header.html中,给页面加上了一个base标签

<base id="headbase" href="$db_bbsurl/" />

base标签的作用是给网页中的链接指定一个默认的URL前缀或者是指定一个target,比如:

<base target="_blank" />

而在phpwind中,$db_bbsurl这个变量是由PHP系统变量$_SERVER[HTTP_HOST]得来的。

但是这个变量在使用了反向代理之后,并不是我们访问的URL,这个时候介入了一个新的变量,只有在使用代理访问之后才会有的变量:$_SERVER[HTTP_X_FORWARDED_HOST]。这个变量才是我们访问的URL。

这样,为了反向代理能够正常使用,我们需要更改phpwind的代码。
打开global.php

解决base标签的问题
找到:

$R_url = $db_bbsurl = Char_cv("http://$_SERVER[HTTP_HOST]".substr($tmp,0,strrpos($tmp,'/')));

修改为:

if ($_SERVER[HTTP_X_FORWARDED_HOST]) {
        $R_url = $db_bbsurl = Char_cv("http://$_SERVER[HTTP_X_FORWARDED_HOST]".substr($tmp,0,strrpos($tmp,'/')));
} else {
        $R_url = $db_bbsurl = Char_cv("http://$_SERVER[HTTP_HOST]".substr($tmp,0,strrpos($tmp,'/')));
}

解决前台发帖的非法操作问题
同样在global.php中:
找到:

list($http_host) = explode(':',$_SERVER['HTTP_HOST']);

修改为:

if ($_SERVER[HTTP_X_FORWARDED_HOST]){
                        list($http_host) = explode(':',$_SERVER['HTTP_X_FORWARDED_HOST']);
                } else {
                        list($http_host) = explode(':',$_SERVER['HTTP_HOST']);
                }

解决多重代理IP unknow问题
还是global.php
找到:

$onlineip = $_SERVER['HTTP_X_FORWARDED_FOR'];

改为:

$ip_temp=explode(",",$_SERVER['HTTP_X_FORWARDED_FOR']);
        $onlineip = $ip_temp[0];

这样子做有一个BUG:如果访问者用内网代理,得到的IP将会是内网IP。我正在想办法解决。

最后,要做的就是解决后台操作非法的问题。由于有我前面说的那个BUG,我不建议修改这个,可以说明的就是修改的方法跟前台类似。

我的phpwind上传附件大小怎么总是为0K?

今天风云墙的管理给我报一个错误,说论坛上传的附件大小总是0K,也不报错

听到这个,我想到的第一件事就是,是不是附件文件夹被取消了写入的权限,但是,检查后发现写入权限是正确的。

然后以为是网站分区空间用完了,于是用df一看

网站分区的空间倒是没有用完

倒是系统分区的空间用完了,主要是被apache 的日志文件给塞满了

清理一下,然后再试

果然就可以了

难道PHPWIND上传文件要用到/tmp分区吗?很奇怪的一个事情,改天有时间验证一下

今天没有时间了

php中,require(), require_once(), include(), include_once()之间的区别

以前,一直搞不清楚这四个函数之间的区别,今天总算把他们弄明白了。这四个函数,可以说基本上是相同的,只是有一些很细微的差别。

首先,讲一下require()与include()之间区别。
require()与include()之间唯一的区别就是,当引用的文件不存在时,require()在给出错误信息后终止解析,而include()在给出错误信息后,继续后面的解析。换句话说,include()较require()而言,只是给了一个警告。所以,require()一般可以用来引用必需的文件,而include()一般可以用来引用非必需的文件。

而require_once(),include_once与require(),include()的区别只在于,once会检测文件是否加载,如果已经加载则不会重复加载,而没有once的,会直接加载。这样的话如果用没有once的,可能会出现重复加载同一个文件,而可能会导致重复定义函数,或者重复赋值等。

PW强制只能发悬赏帖

这个插件原来我是做过的,但是后来给其他的管理升级时给冲了

现在他们又想要这个功能只好重新再搞了。还好原来的东西还在,花了点时候马上就搞好了

还加了一个功能就是只能发悬赏帖。

呵呵

插件的东西功能就是;

增加了版主对悬赏帖的控制

增加了只能悬赏money的限制

某个区只能发悬赏帖

附件是改动的文件(将后缀改为.rar后解压即可,郁闷自己的blog都不让传这种文件,但好好检查一下设置了),请根据自己需要进行更改,请不要直接覆盖你的原文件

附件:
悬赏帖插件改进

奇怪的php5.2.4

昨天装上5.2.4的windows的zip包,却发现_SERVER["PHP_SELF"]等一系列的函数值返回不正确
具体表现在所有的返回值都重复了
不知道是php5.2.4的问题还是我的配置问题
如果是php5.2.4的问题,为什么网上都没有人说到这个问题
如果是我的配置问题,那到底应该要怎么样配置啊
用默认的配置没有用

试了下php4.4.7没有问题
想下截别的比较经典的版本测试下,
可惜网官方上似乎没有提供下载

继续努力中

接着写
应该是5.2.4的版本问题,
改装5.2.2,只改动了cgi.force_redirect的值,就OK了
然后,把5.2.4中的mysql模块复制到5.2.2的文件夹当中,
5.2.2的mysql就成了5.0.45了,本来好像是5.0.34。
呵呵

呵呵,向PHP反映一下吧

轻松配置windows下IIS + PHP5.2.4 + MySQL5.04

今天晚上很无聊,刚好昨天重装了系统,就想把IIS+PHP+MySQL的环境配好。
其实,这个题目取得太具体了,不过,应该是放置任意新版本都可以的。我这样写,只不过是想让一些新手朋友更容易找到而已,别怪。

PART A: IIS
IIS没有选择,有没有什么好说的,直接用系统的安装方法,如果你是在不知道,就google一把吧。我就不多说了。
当然了如果无法复制文件的问题,可以看下这篇文章IIS安装程序无法复制文件的问题。这是我很久以前转的一篇文章,很实用的。

PART B: Mysql
MySQL其实也没有什么好说的,我的重点也不在这里。对于Windows来说,MySQL的安装实在是太过于简单。建议你直接下载最新的exe文件,然后安装。这里没有任何特别的东西,像普通程序一样安装即可。

PART C: PHP
这个是很多朋友会出问题的地方,也是我的重点。大部分的问题多是这两个方面:1、IIS不能解析PHP,要么就是当文件下载,要么就是直接显示源代码;2、PHP不能连接MySQL数据库。而其中的90%(只是我估计的,不对别拍砖,呵呵),都是第一个原因。
Read More »

phpwind从windows系统转移到Linux下后乱码问题解决

今天,又将班级论坛转入到自己的workstation下
由于访问的人数非常少,所以,数据转移都不是问题,一会儿就搞定了
但是在转移数据库的时候,却出了一点点小麻烦

由于原空间商的问题,我的数据库没法由数据库的备份系统备份
我只好选择下下策,由PW来生成备份
还好我的数据库不大,才几个MB,要是像风云墙那种将近1G的数据,或者更大
天,那我的数据就别想要了
讲问题前,先汗一个,这种空间,以后千万不能买

好了,闲话少说。
数据备份好以后,又由于我的论坛自己开发了不少的插件
而这些插件都没有写install,所以,不想重装PW
便直接用MySQL的导入功能导入了数据,修改/data/sql_config.php文件
打开站点,却发现全部是乱码。
最开始怀疑是apache的编码,但apache2是可以自动选择的,应该不会出现这个问题。
但是,为了安全起见,我还是指定了GBK为默认编码,发现还是不对。
于是怀疑数据库的编码问题,
查看了数据库编码支持
里面明明有GB2312,是支持的
试着将默认语言改为GB2312,结果还是不行
于是,我开始怀疑是文件编码的问题,
很有可能是在windows下生成的sql文件中的中文字符,Linux系统不认识,
所以,当Linux向MySQL写入数据的时候,MySQL根本不知道Linux给他的时候是什么数据
结果,当然是MySQL不能正确的将其还原成中文字符

于是,我会试着让PW来做这个恢复工作
哈哈,结果果然成功
嘿嘿

风云墙论坛群修复

风云墙从上次有人使用修改UID插件失败后
导致一个会员的数据莫名消失
后来不得不重新建立数据

后来,又有会员报说论坛群不能使用
开始没在意,
以为是程序被人修改了
后来,重新修复了一下程序,
会员还是报错

没办法
只好自己测试一下
实际过程,发现只是群主不能通过会员验证
验证的时候,
总是提示“会员 ** 交易币不足,不能通过验斑点”
而这个 ** 会员就是上次操作失误而导致数据丢失的对象

看样子,这个不是程序的问题
还是上次那个操作留下的毛病
问题极有可能出在数据库上
仔细查检了论坛群的程序
发现,应该是在论坛群的表中,存在一个UID为0的用户
而这个用户,就是由于上次的误操作而产生的
删掉这个用户,OK,一切正常

问题的产生大概是这样的
那次误操作
是由于我的那个修改UID插件中的一个小小的BUG
在控制论坛群的语句上,写了一个将旧的UID修改为-1的语句
而这个语句在实际的操作当里,会变成0这样,
这样,在实际的转换当中,在论坛群的表就会产生一个0的UID
而在论坛群验证的时候
每次都会检测到这个uid为0的用户
uid为0的用户,当然是不在存的,所以也不可能有交易所
这就是全部的问题所在

呵呵,说来说去,还是我的错