If statement Nginx';如果';不';我不能正常工作

If statement Nginx';如果';不';我不能正常工作,if-statement,nginx,args,If Statement,Nginx,Args,我对nginx有一些问题。下面是我的简单virtualhost配置,它似乎无法正常工作: server { listen 80; server_name my.site; access_log /home/my.site/www/my.site/log/access.log; error_log /home/my.site/www/my.site/log/error.log error; root /home/my.site/www/my.sit

我对nginx有一些问题。下面是我的简单virtualhost配置,它似乎无法正常工作:

server {
    listen   80;
    server_name my.site;

    access_log /home/my.site/www/my.site/log/access.log;
    error_log /home/my.site/www/my.site/log/error.log error;
    root   /home/my.site/www/my.site/public/;

    charset utf-8;

    location /search/ {
        error_page 418 = @passenger;
        recursive_error_pages on;

        if ( $arg_mode = block ) { return 418; }
        default_type text/html;
        try_files $request_uri @passenger;
    }

    location / {
        try_files $uri @passenger;
    }

    location @passenger {
        root   /home/my.site/www/my.site/public/;
        passenger_enabled on;
    }

}
问题恰恰在于位置/搜索/。如果uri包含参数“mode”和值“block”(即uri看起来像
http://my.site/search/word?mode=block&type=... (其他参数)


但现在它不起作用了。若静态文件/public/search/word存在,即使uri中存在参数mode=block,服务器也会发送它。。。我的错误是什么?

您的配置在Nginx方面很好,对/search/with mode=block的任何请求都将发送到@passenger

一个简单的测试用例是

server {
    listen 80;
    server example.com;  
    location /search/ {
        error_page 418 = @passenger;
        recursive_error_pages on;
        if ( $arg_mode = block ) { return 418; }
        default_type text/html;
        echo "/search/";
    }
    location @passenger {
        echo "@passenger!";
    }
}
使用curl调用此函数

# curl -i http://example.com/search/word/?mode=block&a=b$c=d

HTTP/1.1 200 OK
Server: nginx
Date: Thu, 02 Oct 2014 11:35:50 GMT
Content-Type: application/octet-stream
Transfer-Encoding: chunked
Connection: keep-alive

@passenger!

因此,如果文件得到了送达,那么正如@Alexey Ten在他的评论中推断的那样,@passenger块中发生了这种情况。

你确定不是passenger发送的文件吗?