Nginx — Как передать статический файл конкретному пользовательскому агенту?

#nginx #nginx-config

#nginx #nginx-config

Вопрос:

Я пытаюсь ограничить доступ к определенному файлу json для определенного пользовательского агента, используя файлы конфигурации в Nginx.

 server {
listen       80;
server_name  localhost;

location / {
    root      /usr/share/nginx/html;
    try_files $uri$args $uri$args/ /index.html;
}

location /v1/ {
    proxy_pass http://127.0.0.1:8118;
    proxy_pass_header Server;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

location = /v1/apischema {
    root    /usr/share/nginx/json;
        if ($http_user_agent ~ useragentname) {
            try_files /openapi.json;
            break;
        }
}
  

}

Идея состоит в том, чтобы ограничить доступ к openapi.json для внутреннего пользователя.

Пожалуйста, дайте мне знать, где я ошибаюсь.

Ответ №1:

try_files может использоваться в server location блоке или. См. Контекст: в этом документе.

Для достижения этой цели существует несколько способов.

Использование if :

 location = /v1/apischema {
    if ($http_user_agent ~ useragentname) {
        rewrite ^ /openapi.json last;
    }
}
location = /openapi.json {
    internal;
    root    /usr/share/nginx/json;
}
  

internal Директива запрещает прямой доступ к этому URI. См . Это предостережение по использованию if .


Или map с помощью try_files :

 map $http_user_agent $apischema {
    ~useragentname  /openapi.json;
    default         /nonexistant;
}
server {
    ...

    location = /v1/apischema {
        root    /usr/share/nginx/json;
        try_files $apischema =404;
    }
}
  

Подробности см. В этом документе.