http://strangebank.bokee.com/viewdiary.16292545.html
前两天为了让Sylvan的用户能够更方便的记忆自己的个人空间的地址,研究了一下Apache的URL Rewrite功能,实现了每个用户可以把自己的用户名作为二级域名的虚拟主机的设定。
其实,之前也用过URL Rewrite模块,只不过只是用来转换URL中传入的参数的。这次用它来做虚拟主机,其实原理是一样的。
先说一下目的。我想做到的是用户在浏览器中输入类似 http://wells .osall.com/test.php?a=1&b=2 这样的URL地址时,把蓝色部分的用户名作为一个参数并转到页面在服务器上的真正的实际地址 /path/to/file/test.php?un=wells &a=1&b=2 ,并且要让用户在浏览器中看到的URL地址不发生改变。
要实现这个功能,首先要在DNS服务器上打开域名的泛域名解析(自己做或者找域名服务商做)。比如,我就把 *.osall.net 和 *.osall.com全部解析到了我的这台Linux Server上。
然后,看一下我的Apache中关于*.osall.com的虚拟主机的设定。
- #*.com,*.osall.net
- <VirtualHost *:80 >
- ServerAdmin webmaster@osall.com
- DocumentRoot /home/www/www.osall.com
- ServerName dns.osall.com
- ServerAlias dns.osall.net osall.com osall.net *.osall.com *.osall.net
- CustomLog "|/usr/sbin/rotatelogs /var/log/httpd/osa/a_wosa_log.%Y%m%d 86400" common
- ErrorLog "|/usr/sbin/rotatelogs /var/log/httpd/osa/e_wosa_log.%Y%m%d 86400"
- <Directory /home/www/www.osall.com >
- AllowOverride None
- Order deny ,allow
- #AddDefaultCharset GB2312
- </Directory>
- <IfModule mod_rewrite.c >
- RewriteEngine on
- RewriteCond %{HTTP_HOST} ^[^.]+\.osall\.(com|net)$
- RewriteRule ^(.+) %{HTTP_HOST}$1 [C]
- RewriteRule ^([^.]+)\.osall\.(com|net)(.*)$ /home/www/www.osall.com/sylvan$3?un=$1&%{QUERY_STRING} [L]
- </IfModule>
- </VirtualHost>
在这段设定中,我把*.osall.net和*.osall.com 的Document Root都设定到了 /home/www/www.osall.com
但是,继续看下去,看到 <IfModule mod_rewrite.c >...</IfModule> 配置了吗?在这里我就配置了URL Rewrite规则。
RewriteEngine on #打开URL Rewrite功能
RewriteCond %{HTTP_HOST} ^[^.]+.osall.(com|net)$ #匹配条件,如果用户输入的URL中主机名是类似 xxxx.osall.com 或者 xxxx.osall.net 就执行下面一句
RewriteRule ^(.+) %{HTTP_HOST}$1 [C] #把用户输入完整的地址(GET方式的参数除外)作为参数传给下一个规则,[C]是Chain串联下一个规则的意思
RewriteRule ^([^.]+).osall.(com|net)(.*)$ /home/www/dev.osall.com/sylvan$3?un=$1&%{QUERY_STRING} [L] # 最 关键的是这一句,使用证则表达式解析用户输入的URL地址,把主机名中的用户名信息作为名为un的参数传给 /home/www /dev.osall.com目录下的脚本,并在后面跟上用户输入的GET方式的传入参数。并指明这是最后一条规则([L]规则)。注意,在这一句中指明 的重写后的地址用的是服务器上的绝对路径,这是内部跳转。如果使用http://xxxx这样的URL格式,则被称为外部跳转。使用外部跳转的话,浏览着 的浏览器中的URL地址会改变成新的地址,而使用内部跳转则浏览器中的地址不发生改变,看上去更像实际的二级域名虚拟服务器。
这样设置后,重起Apache服务器,测试一下,就大功告成了!