最近在做一个php商城项目,客户只提供一个虚拟主机,但是他希望每个注册用户都可以得到一个属于自己的
二级域名,通过访问这个二级域名,就可以看到自己的网站。
既然是虚拟主机,那httpd.conf 这个文件肯定是动不了的。于是我用.htaccess来重写url,做成一个伪二级域名
的系统。
首先,需要把你独立ip做一下解析,如:*.paodot.net指向到你的服务器,这样,无论你输入的二级域名是什么
。都同意访问到网站首页。如:test123.paodot.net.
然后,在你服务器的根目录下面建立文件.htaccess文件。重点在下面(汗!这里费了我好多时间,写出来,
免的让你们在浪费时间!)
在网上,有很多关于 .htaccess建立多站点的例子,如:
.htaccess文件内容如下:(以xrnic.cn域名为例)
RewriteEngine on
DirectoryIndex index.php index.html index.htm
#让www.xrnic.cn 访问根目录CMS
RewriteCond %{HTTP_HOST} ^www.xrnic.cn$
RewriteCond %{REQUEST_URI} !^/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /$1
RewriteCond %{HTTP_HOST} ^www.xrnic.cn$
RewriteRule ^(/)?$ /index.php [L]
#让home.xrnic.cn 访问home目录UcenterHome
RewriteCond %{HTTP_HOST} ^home.xrnic.cn$
RewriteCond %{REQUEST_URI} !^/home/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /home/$1
RewriteCond %{HTTP_HOST} ^home.xrnic.cn$
RewriteRule ^(/)?$ home/index.php [L]
#让bbs.xrnic.cn 访问bbs目录论坛
RewriteCond %{HTTP_HOST} ^bbs.xrnic.cn$
RewriteCond %{REQUEST_URI} !^/wap/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /bbs/$1
RewriteCond %{HTTP_HOST} ^bbs.xrnic.cn$
RewriteRule ^(/)?$ bbs/index.php [L]
----------------------------------------------------------------------------------
上面这些是我从网上找的,你去百度搜,90%都是这样的,这样的其实没问题,当对于我的应用来说,不合适
。因为我需要的是,用户一注册就可以得到一个二级域名,且可以访问,如果像上面那里,我需要在htaccess
里不断的添加映射代码。这样一是不方便,二是htaccess文件就会很庞大。好了,来看看我写的吧。
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(.*?)/.paodot/.com$
RewriteCond %{REQUEST_URI} !^/users/%1/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /users/%1/$1 [L]
RewriteCond %{HTTP_HOST} ^(.*)/.paodot/.com$
RewriteRule ^/(.*?)$ /users/%1/$1 [L]
这个是我最初写的,这个是可以用的(是错误的,后面讲),但是有个问题,当根目录有相同文件名的文
件存在时,就不会到你指定的目录去了。比如:我访问http://test222.paodot.net 这样访问,是可以访问到
/users/test222/index.php 这个页面的。但我用http://test222.paodot.net/index.php 这样访问,就访问到首页的
index.php去了。这问题刚开始很郁闷,后来仔细看了映射脚本,原来是
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
这两句导致第一个规则没有被应用,所以
http://test222.paodot.net/index.php 就等于是 http://paodot.net/index.php了。
于是我把这两句去掉,但是服务器却报500错误。这个是为什么,我也不懂。反正是不能去掉。
另外,对于 RewriteCond %{REQUEST_URI} !^/users/%1/,这个其实是个错误的写法。我们先来看看
RewriteCond 的原型: RewriteCond TestString CondPattern [flags]
TestString是一个纯文本的字符串,但是还可以包含反向引用
CondPattern是一个perl兼容的正则表达式
看了原型,才知道,我在CondPattern处写了反向引用语句,这个是错误的。。
进过一番周折,我有写了新的规则脚本,(这个是最终可以用的,哎,走了很多弯路),如下:
RewriteCond %{HTTP_HOST} ^([a-z0-9_]+)/.paodot/.net$ [NC]
RewriteCond %1 !^www
RewriteCond %{REQUEST_URI} !^/users/
RewriteRule ^(.*) /users/%1/$1 [L]