2014-10-02 103 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在他的評論中推斷的那樣。