Economy 型主机是 Godaddy 最便宜的主机,最近的优惠价格是首年 12 美金,送一个免费域名。
这个类型的基本配置是无限带宽,100GB空间,10个数据库,1个站点。
这篇文章将主要讨论这1个站点有关的内容。
.htaccess
文件中使用 rewrite 指令达到这个目的。
.htaccess
文件,内容如下:
<IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{HTTP_HOST} ^(www.)?a.com${'$'} RewriteCond %{REQUEST_URI} !^/a/ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule (.*) /a/${'$'}1 [L] RewriteCond %{HTTP_HOST} ^b.com${'$'} RewriteCond %{REQUEST_URI} !^/b/ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule (.*) /b/${'$'}1 [L] </IfModule>
至于子域名,Godaddy 主机管理的 Hosted Domains 界面中就可以管理,创建子域名是可以指定到特定的子目录。当然这些要在空间中使用的子域名都必须在您的域名解析添加 A 记录。如果您的域名是在 Godaddy 购买的或者是 Godaddy 赠送的免费域名,则省去了设置域名解析的步骤,Hosted Domains 里添加子域名后,域名解析也自动做好了。
博主在 Godaddy Economy 空间的演示站点:
博 客: http://www.alexcn.com/ http://blog.alexcn.com/ 短网址: http://ssi.pw/
对于有强迫症的人来说,可能这种方式不是一个好主意,因为目录级的 rewrite (.htaccess)不是一种特别高效的方式,当部署的站点越多,.htaccess
文件会越长,rewrite 引擎遍历的时间会越长。当然这点时间对于计算机来说算不了什么,特别是当你安装 WordPress 等产品时,都已经使用了 .htaccess 文件。
2. URL 整洁问题
对于有“洁癖”的人来说不是一个好消息,就拿我们的例子来说,假设存在文件 /a/index.txt,那么我们希望的访问方式是 http://a.com/index.txt,这没有问题,但实际上通过 http://a.com/a/index.txt 也能访问同一个文件。
这是因为 http://a.com/ 实际上是指向 WEB 根目录(/)的,而 a/ 是 WEB 根目录中的一个子目录,从重新规则 RewriteCond %{REQUEST_URI} !^/a/
可以看出重写时排出了这个目录,所以上述的 URL 是可访问的。
为什么在重新规则中必须排出对 /a/ 目录的重写呢?因为 .htaccess 对当前目录及其所有下级目录都是有效的,如果 /a/ 进行了重写,那么在访问 /a/index.txt 时,根据 /a/ 上级目录 / 中的 .htaccess 的规则,重写 (.*) 到 /a/${'$'}1 即 /a/index.txt -> /a/a/index.txt,然后依次类推 /a/a/index.txt -> /a/a/a/index.txt -> ... ,将形成一个嵌套死循环。
本博主也是一个有小小洁癖的人,曾试图通过类似 RewriteRule a/(.*) - [F] 的方式禁止外部直接访问 /a/ 这样的目录,而只允许重写引擎内部访问,但无奈 Apache Rewrite 知识有限,没有成功。
有路过的高人还望不吝赐教!
更新(2013-04-26)
至于文中最后提到的第二点中涉及的循环重写问题,主要还是自己理解不够深刻,发现只要在被转发到的目录中放置.htaccess
文件,并加上 RewriteBase /当前目录名/
即可解决,都不用使用规则 RewriteCond %{REQUEST_URI} !^/a/
来排除。
仍以文中的例子,根目录的 .htaccess
如下
<IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{HTTP_HOST} ^(www.)?a.com${'$'} RewriteRule (.*) /a/${'$'}1 [L] </IfModule>
/a
目录的 .htaccess
如下
<IfModule mod_rewrite.c> RewriteEngine on RewriteBase /a/ </IfModule>
Source |
|