Как указать поисковое доменное имя для nginx resolver для proxy_pass

Предполагая, что мой сервер www.mydomain.com, на Nginx 1.0.6

Я пытаюсь перенаправить все запросы на http://www.mydomain.com/fetch на другие хосты, целевой URL указывается в качестве параметра GET с именем "url".

Например, когда пользователь запрашивает один из них:

http://www.mydomain.com/fetch?url=http://another-server.mydomain.com/foo/bar

http://www.mydomain.com/fetch?url=http://another-server/foo/bar

это должно быть прокси

http://another-server.mydomain.com/foo/bar

Я использую следующую конфигурацию nginx, и она работает нормально, только если параметр URL содержит доменное имя, например http://another-server.mydomain.com/...; но не удается на http://another-server/... в случае ошибки:

another-server could not be resolved (3: Host not found)

nginx.conf это:

http {
...
# the DNS server
resolver 171.10.129.16;
server {
    listen       80;
    server_name  localhost;
    root /path/to/site/root;

    location = /fetch {            
        proxy_pass $arg_url;
    }
}

Здесь я хотел бы разрешить все URL без доменного имени в качестве имени хоста на mydomain.com, в /etc/resolv.conf, можно указать имя поискового домена по умолчанию для всей системы Linux, но это не влияет на nginx распознаватель:

search mydomain.com

Возможно ли это в Nginx? Или, в качестве альтернативы, как "переписать" параметр url, чтобы я мог добавить доменное имя?

2 ответа

Решение

nginx выполняет собственное разрешение DNS и не использует библиотеку libc, поэтому /etc/resolv.conf не имеет эффекта. Я не могу найти ни одной опции для указания поискового домена, поэтому перезапись URL-адреса - ваша единственная опция. Нечто подобное должно сделать свое дело:

location /fetch {
    # Don't rewrite if we've already rewritten or the request already contains the full domain
    if ($arg_url !~ mydomain.com) {
        rewrite ^/fetch?url=http://([^/]+)(/?.*)$ /fetch?url=http://$1.mydomain.com$2;
    }
    proxy_pass $arg_url;
}

Вы можете установить домен как переменную, например:

location /panel {                                                                    
#rewrite ^/panel(.*)$ http://10.252.97.140:31021/main/develop$1 permanent;    
#rewrite ^/panel(.*)$ $1 permanent;                                                                  
resolver 10.96.0.2;                                                                        
#resolver 10.252.97.139;                                                                   
set $dns_domain  ".dev-env.svc.cluster.local";                                                       
proxy_pass    http://panel-frontend$dns_domain/main/develop$1;               
#  proxy_pass http://panel-frontend.dev-env.svc.cluster.local/main/develop$1;
proxy_redirect    off;                                                                     
proxy_set_header  Host              $http_host;   # required for docker client's sake      
proxy_set_header  X-Real-IP         $remote_addr; # pass on real client's IP               
proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;                            
proxy_set_header  X-Forwarded-Proto $scheme;                                               
proxy_read_timeout                  900;                                                   
}         
Другие вопросы по тегам