在很多地方,比如說博客網站。我們經常可以會通過網站提供的配置功能,實現個性化的屬於個人的二級域名,比如說http://cevin15.oschina.net。當然,OSC的博客目前還沒有這個功能。
最近遇到個差不多的需求,網上看了下別人的實現方式,寫得不太清楚,自己第一遍即使看懂了,回頭看第二遍估計還是不懂。還是要自己測試下,然後記錄記錄。於是玩了下本地的Nginx,研究怎麼去實現這種個性二級域名。
首先,我們的思路,是把二級域名轉為程序容易解析的二級目錄形式。舉個例子,用戶輸入http://cevin15.mydomain.com進行訪問,而真實的博客地址是:http://www.mydomain.com/blog/cevin15,之後,再在程序中進行處理就很簡單啦。那我們的做法可以是通過服務器配置,把http://cevin15.mydomain.com轉為真實的訪問路徑http://www.mydomain.com/blog/cevin15。
第一時間想到的是通過Nginx的rewrite來實現。配置如下:
server {
listen 80;
server_name *.mydomain.com;
if ( $host ~* (\b(?!www\b)\w+)\.\w+\.\w+ ) {
set $subdomain $1;
}
location / {
rewrite ^/$ http://www.mydomain.com/blog/$subdomain last;
}
}
其中的if,是用於過濾某些特殊的二級域名,比如www,然後獲取二級域名的變量值。
重載Nginx的配置,測試。發現跳轉是正常了,但是浏覽器的url也跟著變成:http://www.mydomain.com/blog/$subdomain。
這樣就沒用了,起不到我們需求的酷酷的二級域名功能。
浏覽器的url會發生變化的原因是,我們在使用rewrite時,使用了全路徑的配置。
既然下面這種寫法不行:
rewrite ^/$ http://www.mydomain.com/blog/$subdomain last;
那就換回來這種寫法:
rewrite ^/$ /blog/$subdomain last;
再加上nginx的反向代理功能:
proxy_pass http://www.mydomain.com/;
就可以實現很酷的二級域名功能了。
全部配置如下:
server {
listen 80;
server_name *.mydomain.com;
if ( $host ~* (\b(?!www\b)\w+)\.\w+\.\w+ ) {
set $subdomain $1;
}
location / {
rewrite ^/$ /blog/$subdomain last;
proxy_pass http://www.mydomain.com/;
}
}
這樣配置之後,除了if中過濾的二級域名,其他的二級域名{sudomain}.mydomain.com,對於服務器,其真實的路徑都是www.mydomain.com/blog/{sudomain}。
這是目前想到的二級域名實現方式,想法其實很簡單,缺陷當然也有,就是在rewrite上面。如果url有多種路徑規則,則需要一一進行配置。
原文:http://my.oschina.net/cevin15/blog/381033