2014-10-02 90 views
0

我有一些nginx的问题。这里是我的简单的虚拟主机配置,似乎并没有正常工作: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; 
    } 

} 

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

但现在它不起作用。如果静态文件/公共/搜索/字存在服务器发送它,即使参数mode =块存在于uri中...什么是我的失误?

+0

你确定它不是乘客发送文件? – 2014-10-02 09:33:47

回答

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在他的评论中推断的那样。