现在的位置: 首页 > IT运维 > 正文

statusnet的Nginx修正

2012年03月30日 IT运维 ⁄ 共 1602字 暂无评论 ⁄ 被围观 346+

最近需要用statusnet做点东西,但是发现statusnet的默认参数传递方式在Nginx下无法正常运行,只能正常工作于Apache下,主要的问题在形如 index.php/main/login 这样的url解析上,Nginx中默认对此url解析为 index.php/main/login 目录或文件,会报404错误,我们希望的结果是解析为:index.php?p=main/login,搜索+摸索之后,总结如下两个方法,推荐方法2。

方法一:按照网传方法修改Nginx的Rewrite规则,然后修正lib/router.php文件

网传Nginx Rwrite方法:

if (!-e $request_filename) {
        rewrite  ^(.*)$  /index.php?p=$1  last;
        break;
}

按照此方法修改后,形如 http://www.opensoce.com/index.php/main/login 仍无法正常解析,分析发现,rewrite之后的url形如: index.php?p=http://www.opensoce.com/index.php/main/login, router类中的map函数仍无法正确解析p参数,需要修改map函数

原map函数定义如下:

function map($path)
    {
        try {
            $match = $this->m->match($path);
        } catch (Exception $e) {
            common_log(LOG_ERR, "Problem getting route for $path - " .
                       $e->getMessage());
            // TRANS: Client error on action trying to visit a non-existing page.
            $cac = new ClientErrorAction(_(\'Page not found.\'), 404);
            $cac->showPage();
        }

        return $match;
    }

需要对其path参数进行修正,才能解析出正确结果,修正后的map函数如下:

function map($path)
    {
    	if (strpos($path,\'.php/\')!==false) {
    		$pp = strpos($path,\'.php/\')+5;
    		$path=substr($path, $pp);
    	}
        try {
            $match = $this->m->match($path);
        } catch (Exception $e) {
            common_log(LOG_ERR, "Problem getting route for $path - " .
                       $e->getMessage());
            // TRANS: Client error on action trying to visit a non-existing page.
            $cac = new ClientErrorAction(_(\'Page not found.\'), 404);
            $cac->showPage();
        }

        return $match;
    }

方法二:修改Nginx的Rewrite正则

if (!-e $request_filename) {
	#例如status安装目录为 http://www.opensoce.com/sns/statusnet
	rewrite ^.*\\.php/(.*)$ /sns/statusnet/index.php?p=$1 last; #增加这条rewrite规则,处理形如index.php/main/login请求
	rewrite ^/sns/statusnet/(.*)$ /sns/statusnet/index.php?p=$1  last; #仍要处理形如 http://www.opensoce.com/sns/statusnet/login 的请求形式
}

方法二无需修正router类的map函数。

给我留言

您必须 [ 登录 ] 才能发表留言!

×
#