Nginx "если" не работает должным образом
У меня есть некоторые проблемы с 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;
}
}
Проблема именно с местоположением / поиском /. Я хочу, чтобы nginx немедленно передал запрос бэкэнду, если uri включает параметр mode со значением block (то есть uri выглядит так: http://my.site/search/word?mode=block&type=... (other parameters)
)
Но сейчас это не работает. Если статический файл / public / search / word существует, сервер отправляет его, даже если параметр mode=block существует в uri... В чем моя ошибка?
1 ответ
Ваша конфигурация подходит для 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 в своем комментарии.