2012-05-10 2 views
10

мне нужны эти два типа переписывает:Nginx субдомен и домен переписывают ж прокси передать

subdomain.domain.com => domain.com/website/subdomain

otherdomain.com => domain.com/userdomain/otherdomain.com

Моя проблема заключается в том, что я хочу, чтобы пользователь видел subdomain.domain.com и otherdomain.com, не перенаправленная версия. Мой текущий переписывают в Nginx работает, но URL пользователя показывает переписывают, и я хочу, чтобы это было прозрачно для пользователя, любые идеи ?:

upstream domain_server { server localhost:8000 fail_timeout=0; }  

server { 
     listen 80; 
     root /var/www/domain.com; 

     server_name domain.com ~^(?<subdomain>.*)\.domain\.com$ ~^(?<otherdomain>.*)$; 
     if ($subdomain) { 
       rewrite^http://domain.com/website/$subdomain break; 
     } 
     if ($otherdomain) { 
       rewrite^http://domain.com/userdomain/$otherdomain break; 
     } 

     location/{ 
       proxy_redirect off; 
       proxy_buffering off; 
       proxy_set_header Host $http_host; 
       proxy_set_header X-forwarded-for $proxy_add_x_forwarded_for; 
       if (!-f $request_filename) { 
         proxy_pass http://domain_server; 
         break; 
       } 
     } 

} 
+0

нашел что-то интересное здесь: http://blog.martinfjordvald.com/2011/02/nginx-primer- 2-из-апаша к Nginx /. В нем говорится: «Еще одна проблема с перезаписью Nginx заключается в том, что по умолчанию они являются внутренними переписями, что означает, что они не изменят URI, который видит браузер. Они будут делать это только в том случае, если вы укажете флаг« перенаправление »или« постоянный »переписать или если вы переписываете абсолютный URL, включая http: // part. ". Попытка использовать это, чтобы придумать решение ... – pyramation

ответ

24

С Nginx вам не нужно перезаписывать вообще.

upstream domain_server { server localhost:8000 fail_timeout=0; } 

proxy_set_header Host domain.com; 
proxy_set_header X-forwarded-for $proxy_add_x_forwarded_for; 

server { 
    listen 80 default_server; 

    location/{ 
     proxy_pass http://domain_server/userdomain/$http_host; 
    } 
} 

server { 
    listen 80; 
    server_name domain.com; 

    root /var/www/domain.com; 

    location/{ 
     try_files $uri @backend; 
    } 

    location @backend { 
     proxy_pass http://domain_server; 
    } 
} 

server { 
    listen 80; 
    server_name ~^(?<subdomain>.+)\.domain\.com$; 

    location/{ 
     proxy_pass http://domain_server/website/$subdomain$request_uri; 
    } 
} 
+0

Спасибо за отличный ответ, однако, /var/www/domain.com/userdomain/$host не существует, но URL domain.com/userdomain/$ хост делает. Идея состояла в том, чтобы прозрачно проксировать пользователя на этот URL-адрес, когда они используют свой собственный домен, на который указывает сервер – pyramation

+1

Итак, просто используйте 'proxy_pass http: // domain_server/userdomain/$ host;' – VBart

+0

Я обновил мою конфигурацию пример соответственно. – VBart

Смежные вопросы