利用.htaccess搭建无限子站点

来源:互联网 发布:软件系统上线实施方案 编辑:程序博客网 时间:2024/05/10 01:50

 最近在做一个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]

这个里面需要注意的是,RewriteCond %{REQUEST_URI} !^/users/ 这句话必须要,也不知道问什么,去掉后
 
就出现500错误。
 
有了上面这个规则,你就可以无限建立动态子站点。
原创粉丝点击