2015-08-03 2 views
0

Я сейчас в ситуации, когда мне нужно получить/поймать поддомен и передать это значение поддомена в proxy_pass в конфигурации Nginx.Как передать субдомен как значение proxy_pass в nginx?

например.

, если пользователь вводит

http://google.com.mydomain.com 

, то он должен делать прокси проход, как

proxy_pass http://www.google.com/; 

в приведенном выше примере является google.comsub-domain

это может быть выполнимо? Как я могу достичь чего-то подобного в nginx?

В настоящее время я использую конфигурацию, где значения поддоменов жестко закодированы в конфигурационных файлах, но есть много поддоменов, поэтому мне нужно сделать это так, но не знаю правильного синтаксиса.

server { 
    listen  80; 
    server_name subdomain.domain.com; 
    charset utf-8; 

    location/{ 
     proxy_pass http://www.subdomain/; 
    } 
} 

Я использую * как запись для перенаправления всех поддоменов на моем веб-хоста, то есть подстановочные DNS.

обновление:

я нашел фрагмент кода из https://stackoverflow.com/a/22774520/1642018

server {   
    listen  80;            
    # this matches every subdomain of domain. 
    server_name .domain.com;           

    location/{             

    set $subdomain ""; 

    if ($host ~* "^(.+)\.domain.com$") {        
     set $subdomain $1;           
    }                

    proxy_pass http://$subdomain; 

    }                
} 

но запрос показывает мою страницу по умолчанию, которая находится в моем веб-корень по умолчанию.

+0

Это похоже, что это может быть случай задачи XY: http://xyproblem.info/. Это необычный запрос. Почему бы просто не обслуживать субдомен? Что такое ситуация? Скорее всего, это гораздо лучшее решение, чем то, о чем вы думаете. – Dayo

+0

@ Дайо благодарит за ваш ответ, я хотел использовать nginx в качестве обратного прокси для любого домена, который я хочу, поэтому, если я введу http: //ebay.com.mydomain. com он должен сделать прокси-пропуск на ebay.com и действовать как reverese proxy и получить страницу ebay.com. надеюсь это поможет. – AMB

+0

Это не будет работать практически с любым доменом. Особенно с «большими», такими как google или ebay –

ответ

2

Две вещи.

1- Резольвер (сервер DNS для Nginx, чтобы разрешить google.com, вы можете добавить в ваших хостах или вы можете добавить распознаватель заявление)

2- Вам нужно будет решить, как ваш клиент имеет дело с различными доменами, я имею в виду google.com отличается google.com.ar или google.fr)

в этом примере я сделал работу его для вашего примера google.com

worker_processes 4; 

error_log /var/log/nginx/error.log; 

events { 
    worker_connections 1024; 
} 

http { 

    server { 
    listen  80; 

    location/{ 
     set $subdomain ""; 

     if ($host ~* "^(.+)\.domain.com$") { 
     set $subdomain $1; 
     } 
     resolver 8.8.8.8; 
     proxy_pass "http://$subdomain.com"; 

    } 
    } 
} 

Я надеюсь, что эта конфигурация поможет вам.

+0

Do ** NOT ** использовать общедоступный DNS-сервер, такой как '8.8.8.8'. [Чтобы предотвратить спуфинг DNS, рекомендуется настроить DNS-серверы в правильно защищенной доверенной локальной сети.] (Http://nginx.org/en/docs/http/ngx_http_core_module.html#resolver) – Tim

+0

Хорошая точка!, это был пример и должен работать на него, но если вы хотите избежать подмены спутников dns, лучший способ - иметь собственные DNS –

1

Я хотел бы захватить поддомен, используя карту, то прокси-пропуск, если переменная определена:

map $host $subdomain { 
    ~^(?<sub>.+)\.[^\.]+\.[^\.]+$ $sub; 
} 

server {   
    listen 80 default_server; 
    server_name _; 

    location/{ 
     if ($subdomain) { 
      proxy_pass http://$subdomain; 
     }        
    }                
}