`
jone33
  • 浏览: 26459 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

网站多用户二级域名配制

 
阅读更多

使用Apache的URL Rewrite配置多用户虚拟服务器 二级域名

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的虚拟主机的设定。

  1. #*.com,*.osall.net  
  2. <VirtualHost *:80 >  
  3.     ServerAdmin webmaster@osall.com  
  4.     DocumentRoot /home/www/www.osall.com  
  5.     ServerName dns.osall.com  
  6.     ServerAlias dns.osall.net osall.com osall.net *.osall.com *.osall.net  
  7.     CustomLog "|/usr/sbin/rotatelogs /var/log/httpd/osa/a_wosa_log.%Y%m%d 86400" common  
  8.     ErrorLog "|/usr/sbin/rotatelogs /var/log/httpd/osa/e_wosa_log.%Y%m%d 86400"  
  9.     <Directory  /home/www/www.osall.com >  
  10.           AllowOverride None  
  11.           Order deny ,allow  
  12.           #AddDefaultCharset GB2312  
  13.     </Directory>  
  14.     <IfModule mod_rewrite.c >  
  15.         RewriteEngine on  
  16.         RewriteCond %{HTTP_HOST}        ^[^.]+\.osall\.(com|net)$  
  17.         RewriteRule ^(.+)               %{HTTP_HOST}$1  [C]  
  18.         RewriteRule ^([^.]+)\.osall\.(com|net)(.*)$ /home/www/www.osall.com/sylvan$3?un=$1&%{QUERY_STRING}      [L]  
  19.     </IfModule>  
  20. </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服务器,测试一下,就大功告成了!

 

_______________________________________________________________________________

http://wenku.baidu.com/view/7e3bfd94dd88d0d233d46ad4.html

_______________________________________________________________________________

 

weblogic 10二级域名 配置

 

weblogic配置二级域名:

 

1 有多个工程,比如说工程abc,工程def,如果直接部署到开发模式的domain里,有一个是主工程,另一个要以abc.com:7001/def访问,而且其他工程里要在weblogic.xml文件里加上<context-root>/def</context-root>你的应用名称,现在我们想abc.yourname.com,def.yourname.com这样访问。

 

2 首先将weblogic.xml文件里上面的语句改成<context-root>/</context-root>

host文件里对应成127.0.0.1

127.0.0.1   abc.yourname.com

127.0.0.1   def.yourname.com

 

3 现在开始配置

 

////创建虚拟主机路径

 

1) 首先:weblogic建一个domainproducts mode模式的

 

2) 启动该域,进入到console,http://localhost:7001/console

 

3) 域名--》Environment--》Virtual Hosts -->lock & edit -->new

 

4) Name : abc,点进去 configuration-->Virtual Host Names:abc.yourname.com-->Targets -->选上 Admain Server

 

5) save ===> activate changes

 

其他类似,可以建多个,如,def.yourname.com

 

////部署工程

 

1)Deployments-->lock & edit

 

2) install--》 选择你的工程 ,选择对应的Virtual Host

 

3)直接在这里的控制台启动

 

就可以访问了http://abc.yourname.com:7001,http://def.yourname.com:7001

 

///配置文件信息

\bea\user_projects\domains\test_domain\config

<virtual-host>
    <name>def</name>
    <target>AdminServer</target>
    <virtual-host-name>def.yourname.com</virtual-host-name>
  </virtual-host>
  <virtual-host>
    <name>www</name><!--主工程-->
    <target>AdminServer</target>
    <virtual-host-name>www.yourname.com</virtual-host-name>
  </virtual-host>

 <app-deployment>
    <name>abc</name>
    <target>www</target>
    <module-type>war</module-type>
    <source-path>D:\workspace\abc\WebRoot</source-path>
    <security-dd-model>DDOnly</security-dd-model>
  </app-deployment>
  <app-deployment>
    <name>def</name>
    <target>def</target>
    <module-type>war</module-type>
    <source-path>D:\workspace\def\WebRoot</source-path>
    <security-dd-model>DDOnly</security-dd-model>
  </app-deployment>

 

将默认端口改为80

 

<server>
    <name>AdminServer</name>
    
<listen-port>80</listen-port>加上这句就可以了
    <listen-address></listen-address>
  </server>

 

 

其他设置:

 

 

D:\bea\user_projects\domains\test_domain\bin\stopWebLogic.cmd文件中

找到   SETLOCAL

在这行之下加上:

set userID=weblogic

 set password=weblogic

每次停止weblogic的时候就不用输入用户名,密码

 

同理

 

D:\bea\user_projects\domains\test_domain\bin\startWebLogic.cmd文件中

找到   set SAVE_CLASSPATH=

在这行之下加上:

set WLS_USER=weblogic

 set WLS_PW=weblogic

 

每次启动weblogic的时候就不用输入用户名,密码

 

——————————————————————————————————————————————

http://www.wojilu.com/Common/Page/86

二级域名配置

二级域名一般情况下不需要,但在某些情况下,比如模拟网站群,比如作为一项附加功能给用户,让用户有独立家园的感觉……这些时候,可能有一定的商业价值。

 

要给“我记录网站综合系统”开启网站配置功能,请看下面的教程。

 

第一部分:效果预览

--------------------------------------

本来你的个人空间的网址是 www.wojilu.com/zhangsan.aspx ,现在是 zhangsan.wojilu.com

本来你的博客链接是 www.wojilu.com/space/lisi/Blog1/Post/3.aspx ,现在是 lisi.wojilu.com/Blog1/Post/3.aspx

……

依次类推。 

 

 

第二部分:准备工作

------------------------------------------

 

第一步:配置IIS以支持泛域名映射

 

你需要打开IIS,检查其中的默认网站是否正确设置——

1)端口必须是80

2)主机头必须是留空,如下图所示。

 

 

通过这一步,这就意味着IIS打开了泛域名映射,任何通过***.abc.com 这种非特定的域名或二级域名来访的时候,都会映射到此网站。

 

3)因为IIS只支持一个泛域名映射,所以请关闭IIS中其他所有网站。

非常可惜,本来你的IIS可以放多个网站的,现在你只能放一个。没有办法,IIS本身如此。
如果你的网站不使用域名,而是直接使用ip+端口访问,那倒是可以,不用关闭。

 

第二步:配置DNS,将所有二级域名指向你的ip地址

 

请访问域名服务商给你的域名DNS配置网址,在A记录中,

增加一条 *.abc.com 指向到你的ip(其中abc请换成你的域名)

 

 

 

第三部分:让wojilu支持二级域名

-------------------------------------------------

 

第一步,请登录你的网站,然后注销

如果没有注销,因为下面的步骤会更改cookie配置,从而导致你无法正常使用,无法注销也无法登录。

当然,如果已经是未登录状态,那自然最好。

 

第二步,请打开网站根目录的 web.config 文件,在forms这一块中增加你网站的域名

<forms name="wojiluASPXAUTH" />

增加为

<forms name="wojiluASPXAUTH" domain=".mytest.com"loginUrl="/Main/Login.aspx" />

另外,如果你的网站没有设置后缀名,那么 Main/Login.aspx 也相应去掉后缀名

 

这一步的作用是:让所有二级域名和主站共享cookie状态,避免无法正常登录的问题。

 

第三步,打开/framework/config/mvc.config 文件,增加两行配置

 

// 是否启用域名映射

isDomainMap : true

 

// 二级域名通配符对应的 owner类型

subdomainWildcardType : wojilu.Members.Users.Domain.User

 

其中的通配符映射的意思是——

 

如果 subdomainWildcardType 是用户类型(wojilu.Members.Users.Domain.User),那么

zhangsan.abc.com 这种二级域名都会映射到 ww w.abc.com/space/zhangsan.aspx

 

如果 subdomainWildcardType 是群组类型(wojilu.Members.Groups.Domain.Group),那么

zhangsan.abc.com 这种二级域名都会映射到 ww w.abc.com/group/zhangsan.aspx

 

目前“我记录网站综合系统”支持两种类型的“会员类型”(IMember),所以只能填写两个值之一,或者是wojilu.Members.Users.Domain.User ,或者是wojilu.Members.Groups.Domain.Group 
当然,如果你将来扩展了
IMember类型,则此处还可以填写其他数据。

 

第四步,重启网站,访问网站首页,即可看到二级域名效果。

 

【常见问题】

1)一定要关闭页面缓存,否则不经过路由解析。当然这个限制会尝试解决TODO

2)为了让用户cookie失效,也可以修改web.configcookie名称

3为了二级域名方便使用,网址配置成必须有后缀名.aspx换句话说,如果开启二级域名功能,需要网站建立之初就开启,如果在使用一段时间之后再开启,有些链接就成了死链。

4)在二级域名下无法请求主域名网址的js,因为js不能跨域,在开发过程中必须注意这方面的问题。

 

 

 

_______________________________________________________________________________

 

 

 

 

 

分类: web

 

在httpd.conf中,对某个主机进行以下操作:

<VirtualHost ip:80>
        rewriteengine on
        rewritecond %{HTTP_HOST} [^.]+\.域名\.com$
        rewriterule ^(.+) %{HTTP_HOST}$1 [C]
        rewriterule ([^.]+)\.域名\.com(.*) /$1$2
        其他配置文件
</VirtualHost>

接着在DNS中开设一个泛解析到对应的IP地址。
就可以实现下面的方案。

 

  •  
    •  
      • 域名:domain.com
      • 绝对路径:/home/domain.com/
      • www.domain.com 自动解析到 /home/domain.com/www/
      • abc.domain.com 自动解析到 /home/domain.com/abc/
      • 等等子域名都可以自动解析到 /home/domains.com/对应子域名名称的文件夹

 

直接建立子域名名称的文件夹即可使用。不需重启apache。

 

泛域名解析就是将客户的域名全部解析到同一个IP地址。
例如客户的域名a.com,之下所设的*.a.com全部解析到同一个IP地址上去。 
比如客户设b.a.com就会自已自动解析到与a.com同一个IP地址上去。

泛域名是指  *  IN  A   123.123.123.123 或  *   IN  CNAME www.aaa.com

泛域名解析的用途:

1.可以让域名支持无限的子域名(这也是泛域名解析最大的用途)。
2.防止用户错误输入导致的网站不能访问的问题。

在DNS服务器里面设置泛域名解析有2种方式

1. 在域名解析里面设置 *.a.com的A记录或者CName 记录指向某一个IP/服务器名(这种方式 虚拟主机用户是不支持的)
2. 在域名转发里面设置 *.a.com 转发到 http://www.a.com( 虚拟主机可以支持这种转发方式,用户在自己的程序中可以判断访问者要访问的域名),我们会在程序技术文档里面讲解

例子二:
 

实现动态二级域名解析的一个关键就是,把特有的名字怎么能够提出来,因为RewriteRule中的匹配,是不包括域名的匹配的,其实这其中就是一层窗户纸,把域名先重写放到“路径”中,再对“路径”重写一次就可以了,也就是说加一步过渡。这样说大概还一头雾水,给个实例。

首先按我上次写的文章的那个需求写一个,假设动态解析*.iecn.cn。

注意要先做一个所谓的范域名解析,就是说把所有*.iecn.cn解析到某个IP上去,这不是本文章讨论范围就不细说了。

Apache中相关配置如下:

<VirtualHost _default_:80>
ServerAdmin yourmail@domain.com
DocumentRoot /YourWwwRoot/.default
ServerName all-sites
ErrorLog logs/all-sites-error_log
CustomLog logs/all-sites-access_log common
# 下面三行实现动态解析
RewriteCond %{HTTP_HOST} ^[a-z0-9\-]+\.iecn\.cn$
RewriteRule ^/(.*)$ /%{SERVER_NAME}/$1 ##注##
RewriteRule ^/([a-z0-9\-]+)\.iecn\.cn/(.*)$ /YourWwwRoot/$1/$2 [L]
# 没有解析到的情况下扔到自己的一个PHP中做一下处理
RewriteRule ^.*$ /index.php [L]
</VirtualHost>

注意我标注的地方,那一步就是一个过渡,说一下过程吧,假设现在访问:
http://zhong.iecn.cn/xxx
经第一步重写,变成 /zhong.iecn.cn/xxx
经第二步重写就是 /YourWwwRoot/zhong/xxx 了,其他的操作与我行前说的基本就差不多了。

再举一个可能更常见的实例,假设一个博客系统,要求把
http://xxx.iecn.cn
隐式的重写成
http://blog.iecn.cn/blog.php?u=xxx
这里面的xxx可以看做是一个用户名,想必类似这样的需求大家一定都见过很多了,不过多解释了。

同意先做范域名解析这里不多说。在Apache中做如下重写(只写Rewrite部分了):

RewriteCond %{HTTP_HOST} ^[a-z0-9\-]+\.iecn\.cn$
RewriteRule ^/?$ /%{HTTP_HOST}
RewriteRule ^/([a-z0-9\-]+)\.iecn\.cn/?$ /blog.php?u=$1 [L]

zz from http://blog.iecn.net/blog.php?do=showone&tid=1013


Apache的mod_rewrite模块功能非常强大,我以后会写更多的实例出来。

关于mod_rewrite的使用,不想多说,提供两个相关文档的地址:
http://w.yi.org/ftp/FAPM/apache/Apache2/zh/mod/mod_rewrite.html
http://man.chinaunix.net/newsoft/Apache2.2_chinese_manual/mod/mod_rewrite.html

如果你只是想用一个现成的你可以直接把我的copy过去改改,如果想从技术上搞清楚,那么首先要掌握两方面的技术:
Apache下mod_rewrite的使用(可参照我上面提供的两个地址)
正则表达式(这是一门在很多地方都非常有用的技术)

废话不多说,说一下我在IECN.NET服务器的实际配置。

我习惯使用NameVirtualHost,如果你的服务器中只想用这种动态的解析,直接在配置文件中做是一样的,如果想保留自己一些特殊站点的配置,还是用NameVirtualHost吧。

在Apache中,如果启用了NameVirtualHost,在没有匹配到的解析的情况下,会默认到第一组VirtualHost中,所以我们的动态解析自然是放到第一组VirtualHost(有关apache的一些配置这里就不多说,自己查阅相关文档。),如下:
<VirtualHost _default_:80>
    ServerAdmin yourmail@domain.com
    DocumentRoot /YourWwwRoot/.default
    ServerName all-sites
    ErrorLog logs/all-sites-error_log
    CustomLog logs/all-sites-access_log common
    # 下面两行实现动态解析
    RewriteCond /YourWwwRoot/%{SERVER_NAME} -d
    RewriteRule ^/(.*)$ /YourWwwRoot/%{SERVER_NAME}/$1 [L]
    # 没有解析到的情况下扔到自己的一个PHP中做一下处理
    RewriteRule ^.*$ /index.php [L]
</VirtualHost>

把YourWwwRoot换成你自己的路径,注意这里的ServerName没有让它起作用,关建看这两行:
RewriteCond /YourWwwRoot/%{SERVER_NAME} -d
RewriteRule ^/(.*)$ /YourWwwRoot/%{SERVER_NAME}/$1 [L]

第一行是一个rewrite条件,这里的条件是:如果存在路径/YourWwwRoot/%{SERVER_NAME},%{SERVER_NAME}就是你访问站点的域名,-d就表示存在这个路径的意思(如果是文件则是-f);
第二行是一个rewrite规则,这个规则执行的前提是:符合规则的正则表达式匹配;符合它前面(也就是刚才说的第一行)rewrite条件。这里面是的匹配的是.*,也就是所有了,也就是说只要第一行的条件成立,它就会被重写到/YourWwwRoot/%{SERVER_NAME}/$1,% {SERVER_NAME}是站点的域名,$1则是匹配到的.*。

OK,现在就很清楚了,假设现在有www.domain.com指向到这个服务器,当你访问它时(这里假设没有在其他VirtualHost解析这个域名),看看它是如何工作的:
首先它在没有找到匹配的解析时,就来到了这组默认的VirtualHost;
判断 /YourWwwRoot/www.domain.com 是否存在;
如果存在,重定向到 /YourWwwRoot/www.domain.com。

假设你访问 http://www.domain.com/test.html,就会重定向到系统的 /YourWwwRoot/www.domain.com/test.html。

那也就是说你在 YourWwwRoot 下建一个与域名同名的目录(并具备apache访问的权限),就实现了这个域名的解析。

说起来似乎有点难懂,其实很简单的。

这是一个对任意域名的动态解析,哪天有空再写一下对同一域名下二级域名的解析,其实对这个略做改动就可以了。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics