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

statusnet的Nginx修正

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

最近需要用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方法:

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

按照此方法修改后,形如 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函数定义如下:

[php]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;
}[/php]

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

[php]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;
}[/php]

方法二:修改Nginx的Rewrite正则

[php]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 的请求形式
}[/php]

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

给我留言

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

×
#