我对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,服务器也会发送它...我的错误是什么?
答案 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。