Nginx'如果'不能正常工作

时间:2014-10-02 09:14:43

标签: if-statement nginx args

我对nginx有些问题。这是我的简单虚拟主机配置似乎无法正常工作:

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;
    }

}

问题恰恰在于location / search /。我希望nginx立即将请求传递给后端,如果uri包含参数'mode'且值为'block'(即uri看起来像http://my.site/search/word?mode=block&type=... (other parameters)

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

1 个答案:

答案 0 :(得分:0)

你的配置是明智的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!

因此,如果文件正在提供服务,那么@passenger块中就会发生这种情况,因为他的评论中推断出@Alexey Ten。