2012-05-10 22 views
10

tôi cần hai loại viết lại:nginx subdomain và viết lại miền w Proxy vượt qua

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

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

Vấn đề của tôi là tôi muốn người dùng xem subdomain.domain.com, và otherdomain.com, không phải là phiên bản được chuyển hướng. viết lại hiện tại của tôi trong nginx hoạt động, nhưng URL của người dùng cho thấy sự viết lại, và tôi muốn điều này được minh bạch cho người dùng, bất kỳ ý tưởng ?:

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

tìm thấy một cái gì đó thú vị ở đây: http://blog.martinfjordvald.com/2011/02/nginx-primer- 2-từ-apache-to-nginx /. Nó nói "Một điều nữa về việc viết lại Nginx là mặc định chúng được viết lại nội bộ, có nghĩa là chúng sẽ không thay đổi URI mà trình duyệt nhìn thấy. Chúng sẽ chỉ làm điều đó nếu bạn chỉ định cờ viết lại" chuyển hướng "hoặc" vĩnh viễn "hoặc nếu bạn viết lại một URL tuyệt đối bao gồm cả phần http: //. ". Đang cố gắng sử dụng điều này để đưa ra giải pháp ... – pyramation

Trả lời

24

Với nginx bạn không cần phải viết lại cả.

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

Cảm ơn bạn đã trả lời tuyệt vời, tuy nhiên, /var/www/domain.com/userdomain/$host không tồn tại, nhưng URL domain.com/userdomain/$ máy chủ lưu trữ. Ý tưởng là để minh bạch proxy người dùng đến URL đó khi họ sử dụng tên miền riêng của họ được trỏ đến máy chủ – pyramation

+1

Vì vậy, sau đó chỉ cần sử dụng 'proxy_pass http: // domain_server/userdomain/$ host;' – VBart

+0

Tôi đã cập nhật cấu hình của mình ví dụ cho phù hợp. – VBart

Các vấn đề liên quan