Nginx

如何為proxy_pass指定nginx解析器的搜尋域名

  • April 7, 2019

假設我的伺服器是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/上失敗…**錯誤:

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 參數以便我可以添加域名?

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

引用自:https://serverfault.com/questions/350982