2012-05-10 21 views
10

muszę te dwa rodzaje przepisuje:nginx subdomeny i przepisać domeny w proxy przekazać

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

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

Mój problem jest, że chcę użytkownikowi zobaczyć subdomain.domain.com i otherdomain.com, a nie przekierowana wersja. Mój obecny przepisać w nginx działa, ale URL użytkownika pokazuje przepisać, i chcę to być niewidoczne dla użytkownika, jakieś pomysły ?:

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

znaleźć coś ciekawego tutaj: http://blog.martinfjordvald.com/2011/02/nginx-primer- 2-from-apache-to-nginx /. Mówi "Inną rzeczą w przepisywaniu Nginx jest to, że domyślnie są one wewnętrznymi przepisywaniami, co oznacza, że ​​nie zmieniają identyfikatora URI, który widzi przeglądarka. Będą to robić tylko po określeniu" przekierowania "lub" stałego "przepisywania flagi lub jeśli przepisujesz na bezwzględny URL zawierający część http: //. ". Próbuję użyć tego, by wymyślić rozwiązanie ... – pyramation

Odpowiedz

24

Z nginx nie trzeba przepisuje w ogóle.

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

Dzięki za wspaniałą odpowiedź, /var/www/domena.com/userdomain/$host nie istnieje, ale URL domain.com/userdomain/$ host robi. Pomysł polegał na przezroczystym pośredniczeniu użytkownika do tego adresu URL, gdy używa on własnej domeny wskazanej na serwerze. – pyramation

+1

Więc użyj po prostu 'proxy_pass http: // serwer_domeny/userdomain/$ host;' – VBart

+0

Zaktualizowałem konfigurację przykład odpowiednio. – VBart

Powiązane problemy