如果nginx模块返回ngx_declined,则尝试Try_files

时间:2014-11-18 16:01:00

标签: c nginx

我公司的网站服务器主要是用C语言制作的Nginx模块。我们收到了一个从模块回退到PHP的任务,模块返回NGX_DECLINED,如果它无法连接某些服务,后备工作正常如果uri是主页'/',但如果网址是/ XXX / YYYY,则nginx会尝试查找root / XXX / YYY文件夹并失败。

我尝试使用带有@rewrite方法的try_files来解决这个问题,但是使用这个指令模块完全被忽略了,我只需要在模块返回NGX_DECLINED时使用try_files,我该怎么办?

这是位置配置

location ~ ^/(casas|coches|ropa|otros-anuncios)/ {
        #petra is the module name
        petra on;
        petra_conf_file /etc/nginx/petra.cfg;
        petra_tmpl_loc /var/www/vhost/htdocs/app/webroot/petra/listing;
        petra_mobile_tmpl_loc /var/www/vhost/htdocs/app/webroot/petra/mobile_listing;
        petra_mobile on;
        custom_url off;
        error_log   /var/log/nginx/petra.log;
}

更多信息:

使用自定义方法解析url以使用Sphinxsearch进行搜索,如果Sphinx守护程序关闭,则返回NGX_DECLINED,如果它已启动,则会将搜索结果注入某些模板并使用ngx_http_output_filter发送缓冲区链。该模块在NGX_HTTP_CONTENT_PHASE

中调用 事先提前

2 个答案:

答案 0 :(得分:0)

您应该使用错误的nginx核心方法,而不是试图获得一个不稳定的解决方法,您应该更正您的C代码。

您需要使用ngx_parse_url代替ngx_http_map_uri_to_path - 就像。

答案 1 :(得分:0)

我以一种相当肮脏的方式解决了这个问题......

在返回NGX_DECLINED之前,我更改了请求uri,所以它指向框架index.php,这样:

void set_url_to_home(ngx_http_petra_request_t* preq)
{
    preq->r->uri.len = 1;
    preq->r->uri.data = (u_char*)"/";
}


/* Handler */
    if(search_client_create_and_init(preq) == NGX_ERROR){
        ndk_request_log_err(r, "petra_mod: unable to create sphinx search client, send the petition to php!");
        set_url_to_home( preq );
        return NGX_DECLINED;
    }