上回RainEggplant 给大家带来的是OpenShift最简单的添加子域名(子站)的教程:OpenShift添加子域名子站教程(一)最原始的手段 ,不过我们说它有利也有弊。所以这篇下一篇(OpenShift添加子域教程(三)适用于nginx)才是RainEggplant真正推荐的。

今天带来的方法,可以让你只用一个应用,便近乎完美地拥有多个子域(理论无上限)。当然,不推荐在一个应用内创建过多的子域,这会导致服务器性能低下。当你的子域过于庞大时,还得增加应用数量来扩展。

原理是:将各子域的域名绑定至你的应用,再利用强大的.htaccess文件对请求的URI进行重写,使各域名对应各个目录。

步骤:

再次以 raineggplant.com 为例,本次需要建立三个子域(www,bbs,app),站点根目录下有对应目录www,bbs,app,里面即为网站内容。

首先请ping得服务器IP(因为OpenShift的IP地址几乎不变),我的是 54.235.22.201 (也可以不这样,但就只能做CNAME解析了)。到你的DNS服务提供商处,添加(或更改为)如下记录,如图(原谅我换了域名但懒得换图了):

dns

@ A 54.235.22.201
www A 54.235.22.201
bbs A 54.235.22.201
app A 54.235.22.201

 

登录到你的OpenShift应用控制台,为你的应用绑定如下域名,如图:

alias
raineggplant.com; www.raineggplant.com; bbs.raineggplant.com; app.raineggplant.com

现在你会发现,所有的域名都指向了根目录。所以,URI操作的瑞士军刀——.htaccess文件就要登场了。

→什么是.htaccess文件? .htaccess文件(或者"分布式配置文件")提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置。

在你的根目录下建立.htaccess文件,注意保存为ANSI编码,内容如下:

 

在www,bbs,app目录下分别建立.htaccess文件,这里以app目录为例:

 

做到这一步时,你会发现各域名已经正确地指向了对应的目录。先别急着高兴,因为这还不够。为什么呢?因为在实际使用过程中,你会发现访问 app.raineggplant.com/app/ 时没有进行重写,指向的目录为 /app/ ,而不是 /app/app/ 。app.raineggplant.com/www/ 亦指向 /www/ ,而不是 /app/www/ 。

怎么解决这个问题呢?我分析得到了访问 app.raineggplant.com/和 app.raineggplant.com/app/ 的不同之处。两者的服务器变量 %{THE_REQUEST} 有差别。前者为"GET / HTTP1.1",后者为"GET /app/ HTTP1.1"。GET是HTTP请求的方法之一(还有POST、HEAD、OPTIONS、PUT、DELETE和TRACE),于是我们从此入手, 在各目录下再添加如下代码,仍以app目录为例。

 

现在基本能够正常使用了,但是还是有问题:假如app目录下有一目录 qr ,访问 app.raineggplant.com/qr/ 一切正常,但访问 app.raineggplant.com/qr 便出现了错误,REQUEST_URI 被重写为 /app/app/qr/ 。分析得,少了一个斜杠,使后者的 THE_REQUEST 变为 “GET app/qr/ HTTP 1.1”。于是我们来解决这个问题。

把上面的这一段

 

替换为

 

这里我也要请教大家几个问题了。一是按理来说,可以将两块的重写语句合并,即不考虑URL的前部分,统一用%{ENV:sdn} 来表示,但使用时出现了500错误。二是关于重写应该停止的判断标准,这里用的是RewriteCond %{REQUEST_URI} !^/app/app/ ,但这也有明显不合理的地方。如访问 app.raineggplant.com/app/ 和 app.raineggplant.com/app/app/ 的效果又是一样的了,这很类似于前面刚解决的问题。希望知道解决方法的朋友告诉我,感激不尽!

好了,现在试着访问你的网站,你会发现:大功告成了!


由于时间有限,拖了很久才发,抱歉了!另外下次再分享一下如何分析 服务器变量。敬请期待!


RainEggplant原创文章,转载请注明来自:OpenShift添加子域名子站教程(二).htaccess文件法


0