最近遇到个差不多的需求,网上看了下别人的实现方式,写得不太清楚,自己第一遍即使看懂了,回头看第二遍估计还是不懂。还是要自己测试下,然后记录记录。于是玩了下本地的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 转载请保留固定链接: https://linuxeye.com/configuration/2223.html |