如何为proxy_pass指定nginx解析器的搜索域名

如何为proxy_pass指定nginx解析器的搜索域名

假设我的服务器是www.mydomain.com,在 Nginx 1.0.6 上

我正在尝试将所有请求代理到http://www.mydomain.com/fetch对于其他主机,目标 URL 被指定为名为“url”的 GET 参数。

例如,当用户请求其中一个时:

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 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我的域名在/etc/resolv.conf中,可以为整个Linux系统指定默认的搜索域名,但这不会影响nginx解析器:

search mydomain.com

在 Nginx 中可以吗?或者,如何“重写”url 参数以便我可以添加域名?

答案1

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;
}

答案2

你可以将domain设置为变量,例如:

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;                                                   
}         

相关内容