Предполагая, что мой сервер 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 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;
}
вы можете установить домен как переменную ,, например:
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;
}