解决nginx跨站浏览有两种方法:
1、为每一个网站定义一个pool,然后使用chroot指令,但这种方法的缺点是,当你需要建立很多虚拟主机时,消耗的内存是非常大的。
2、修改php源代码。这种通过修改php源代码的方法可以很好的解决这个问题而不必像第一种额外的内存消耗。
下面开始介绍第二种方法。
下载php源码,执行./configure命令,然后开始修改main/fopen_wrappers.c文件
- /* {{{ php_check_open_basedir
- */
- PHPAPI int php_check_open_basedir_ex(const char *path, int warn TSRMLS_DC)
- {
- /* Only check when open_basedir is available */
- if (PG(open_basedir) && *PG(open_basedir)) {
- char *pathbuf;
- char *ptr;
- char *end;
- // add by anxsoft.com
- char *env_doc_root;
- if(PG(doc_root)){
- env_doc_root = estrdup(PG(doc_root));
- }else{
- env_doc_root = sapi_getenv("DOCUMENT_ROOT", sizeof("DOCUMENT_ROOT")-1 TSRMLS_CC);
- }
- if(env_doc_root){
- int res_root = php_check_specific_open_basedir(env_doc_root, path TSRMLS_CC);
- efree(env_doc_root);
- if (res_root == 0) {
- return 0;
- }
- if (res_root == -2) {
- errno = EPERM;
- return -1;
- }
- }
- // add by anxsoft.com
- pathbuf = estrdup(PG(open_basedir));
- ptr = pathbuf;
- while (ptr && *ptr) {
- end = strchr(ptr, DEFAULT_DIR_SEPARATOR);
- if (end != NULL) {
- *end = '\0';
- end++;
- }
- if (php_check_specific_open_basedir(ptr, path TSRMLS_CC) == 0) {
- efree(pathbuf);
- return 0;
- }
- ptr = end;
- }
- if (warn) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "open_basedir restriction in effect. File(%s) is not within the allowed path(s): (%s)", path, PG(open_basedir));
- }
- efree(pathbuf);
- errno = EPERM; /* we deny permission to open it */
- return -1;
- }
- /* Nothing to check... */
- return 0;
- }
- /* }}} */
两个 add by anxsoft.com 中间的是修改加上去的,然后保存,退出。之后make 和make install 即可。
然后修改php.ini文件:
- open_basedir = "/tmp/:/var/tmp/"
经测试php5.2和php5.3同样适用。
参考:http://www.hostloc.com/thread-6546-1-1.html