本周Apache Rewrite学习小结

今天终于把Apache的.htaccess的Rewrite给搞到差不多了,基本上可以解决四个问题:

  1. 基本的域名规范化
  2. 子目录→子域名重定向问题
  3. 禁止通过路径访问子站点的基本措施
  4. 基本的PHPWind(7.5)伪静态支持

我在这里将这些经验记下来,不管怎么说这也是我辛苦了四天摸索出来的经验,也许哪位朋友刚好会需要。

假想场景

举例说,有PHPWind站点a.com,其主要内容在/phpwind目录下,在/wordpress目录下还有另一个子站点(某版主的个人博客?),域名绑定为b.com。

a.com (www.a.com)
├/phpwind (bbs.a.com)
└/wordpress (www.b.com)

如果不做设置,那么想要访问网站a,可以通过http://(www.)a.com/phpwind进入;如果想要进入某版主的博客,则既可以通过http://(www.)b.com,又可以通过http://(www.)a.com/wordpress进入。

这么一来存在3个问题:

  1. 一个典型的域名规范化问题:既可以通过有www的网址进入,又可以通过没有www的网址进入,不利于SEO。
  2. 一个可能让不少人觉得不爽的问题:a.com下面其实是空的,真正的站点地址后面拖了个长长的/phpwind。
  3. 一个可能触动一些人隐私神经的问题:可以通过a.com/wordpress进入站点b.com,很容易看出两者是在同一台主机上,这可能让这两个站点的所有者感到没有安全感。

注意事项:

许多人也许首先会尝试照着步骤一步一步照猫画虎,结果却发现卡在其中某一步无法继续了,非常沮丧地放弃了,而事实上在文章的最后其实写有备注,解决这些问题,因此为了尽可能避免这种情况,我将备注写在这里。希望尽早进入正文的朋友可以先跳过这里。

  1. 非常重要:如果.htaccess文件同时存在于子目录与根目录下,当访问子目录时,根目录下的.htaccess会被!!忽略!!(不是“优先”,而是根目录下的彻底无效。)由于一些程序为实现一些功能自带有.htaccess(如WordPress),因此许多人会因为没有注意到这一点而绕圈。

  2. 重要:尽可能避免在子目录中使用.htaccess,如果无法避免,始终记得!RewriteRule中的匹配条件是针对根目录的,包含子目录!哪怕.htaccess文件是放在/wordpress目录下,用的www.b.com地址访问,RewriteCond行中写的是^www.b.com$,在RewriteRule行中还是必须写^wordpress/(.*)$而不是^(.*)$。

    在个别情况下,请求地址可能会包括进整个站点的根地址,可以用类似如下的方法解决:


    RewriteCond %{HTTP_HOST} ^www.b.com$ [NC]
    RewriteRule ^(.*)wordpress/(.*)$ http://www.b.com/$2 [R=301,L]

    这样一来,由于第一个(.*)被忽略掉了,只使用了$2而没有$1,哪怕前面多了再多乱七八糟的东西,也可以被过滤掉,除非RP很好刚好前面也有个目录叫wordpress……

  3. 网上很多教程里看到的转义符“”,有的时候并不是必要的,甚至可能引发问题,这个需要针对不不同的服务器版本自行尝试了。

  4. 在RewriteRule中使用了[R]参数后,浏览器的地址栏会被改写,如果不用则不会改写,如果要加上[R],千万记得在目标地址中写上完整的头(http://www.a.com/)。

  5. 不同的服务器版本,加不加[R]的情况下,目标规则中对于特殊字符的转码要求是不同的,比如“?”字符,在PHP论坛静态化时是不可或缺的,如果发现直接输入“?”报错,试试看%3F。

一、域名规范化

想要将b.com直接转到www.b.com,不管是搜索引擎还是用户,可以试试这么写:

RewriteCond %{HTTP_HOST} ^b.com$ [NC]
RewriteRule ^wordpress/(.*)$ http://www.b.com/$1 [R=301,L]

别忘了子目录啊!

二、子域名重定向

想要将http://www.a.com/phpwind统一到http://bbs.a.com?

RewriteCond %{HTTP_HOST} ^www.a.com$ [NC]
RewriteRule ^phpwind(.*)$ http://bbs.a.com$1 [R=301,L]

如果外面还有更多层子目录也别忘记啊!

三、禁止通过子目录访问

不想让用户通过a.com/wordpress访问到b.com?

一种比较“补丁”式的方法是:

RewriteCond %{HTTP_HOST} ^www.a.com$ [NC]
RewriteRule ^wordpress(.*)$ "" [F,L]

使用了[F]参数,强制服务器返回一个403 Forbidden……

其实还有一种更绝的方法,绑定域名的时候就将a.com绑定成子目录/phpwind的域名……至于主机域名,随便给个什么乱七八糟的asdf.a.com就行。这样bbs.a.com这个子域名就省了,把www.a.com/phpwind跳转到bbs.a.com也可以免了。之后在.htaccess里这么写:

RewriteCond %{HTTP_HOST} ^asdf.a.com$ [NC]
RewriteRule ^(.*)$ "" [F,L]

这种情况下,哪怕别人有意无意进入了asdf.a.com,不管后面是什么文件或者目录,都会看到一个403 Forbidden。有一种情况例外:这人输入了asdf.a.com/123 AND 刚好站点中有/123这个目录 AND /123目录中刚好有.htaccess AND 这个.htaccess中没有做同样的配置。所以说,如果每个文件夹都要弄个.htaccess会带来一些麻烦,尽量统一管理吧。

PHPWind 7.5的伪静态

PHPWind的后台伪静态设置页面给了一个代码:

RewriteRule ^(.*)-htm-(.*)$ $1.php?$2

但是这个设置其实是不够的,如果发现这样还是失败,可以尝试这么写:

RewriteCond %{HTTP_HOST} ^bbs.a.com$ [NC]
RewriteRule ^phpwind/(.*)-htm-(.*)-(.*).html$ http://bbs.a.org/$1.php?$2=$3 [L]

如果想要更改地址栏显示,可以加上[R],这样用户们看起来就好像没有伪静态一样。

注意:这个情况非常容易遭遇上文“注意事项”中提到的2、3、4、5点情况……

小结

嗯,今天的文章就写到这里。对于Web服务器配置这种深奥的东西,我自己也只是刚刚入门四天,还在摸索阶段,以上文章只是将我个人的经历做了总结,希望能够帮到和我一样正陷入困难的朋友。其中难免还会有一些错误(毕竟是菜鸟),还请多多指点,感激不尽~~

开始制作入口页面

从今天开始设计入口页面。

前几天对于这个站点的总体结构已经有所规划,基本上准备是以一个博客 + 一个设计历程站为主。其中后者将记录下我从最早最烂的设计,到未来可能出现的最好的设计,一路走来的轨迹。但是不管怎样,我需要一个入口页面。

事实上在之前尝试独立设计自主站点的时候,以及尝试原创WordPress皮肤的时候,我都知道以我自己现在的美术功底,完全是不够格的。小小的入口页面的设计,对我来说也许是一个更容易入门及热手的挑战。

目前正在设计的入口页,其总体风格延续了现在我所选用的这个WordPress主题(确实是个不错的主题),虽然在创意上对我造成了限制,不过倒是也避免了一堆不相干的效果堆放在一起造成的混乱感,有得有失吧。

放眼未来 编织现在

4.4 结束语

好了,我们已经到了这本书的结尾,接下来是什么?

是未来!

如果你和我一样享受着网页设计的话,你将会发现美好的时光等待着你。你拥有各种机会——几年前我们无法想象的机会——去创造人们喜欢访问的网站。

在CSS刚刚诞生的几年里,网站设计产业就发生了巨大的变化:辅助功能、表意的标签,已经目前Web专家每天都会碰到的CSS。一个真正的专家从来不会停止学习。如果没有不辞劳苦找寻各种解决方案并在休息的时候将这些解决方案慷慨地分享出来的人们,今天的CSS也不可能得到如此广泛的使用。我希望在未来,CSS开发人员能够找出更多令人激动的解决方案,你也可以追随他们的步伐,分享你所学到的东西。

开发和设计网站是一项创意无限的工作,无论你是在写代码,创建数据库,还是进行平面设计,你做的每一件事情都是创造性的。我拥有W3C CSS工作小组的受邀专家的身份,我能够帮助一个具有创造力的设计师,把他的声音带到会议桌,我非常欢迎大家分享自己的想法。如果未来的CSS版本是能同时满足视觉设计师和开发人员的需要的,那么它需要我们所有的人都参与到它朝哪里发展,怎么发展的讨论和争辩中,一起明确它的未来。因此我希望大家都尽力而为,不管贡献大小。

现在可以停止听我唠叨了,去开创未来吧!

——Andy Clarke(“Transcending CSS: The Fine Art of Web Design”)

《超越CSS:Web设计艺术精髓》,英国Web设计大师Andy Clarke所著的这本有着357页正文的经典著作,没有采用国内常见出版物的那种非常紧凑的布局,而有着较大的段间距,大量的各级标题都有特大号的字体与行距(就如Web中常见的那样),每一页都有近半的外边距用于插图和注释,可说文字量并不大,而且读起来绝对不会感觉枯燥。然而,我在一年半前购买的这本书,却到今天才读完(因为中途又去学习了其他的书籍,如《CSS禅意花园》)。

这本书并不是面向Web设计初学者的教材,它更多地在努力引导那些已经知道如何创建“看起来”很好的页面的Web设计师们去了解Web设计的灵魂,去理解怎样编写合理而简练的HTML,理解为何要去努力做到样式与内容分离,以及体验将在不久的未来来到我们身边的CSS3技术。

然而,对我来说,我却把它当成了网页设计的入门书籍给买了下来。

当时的我几乎一个HTML标签也不认识,完全不知道如何在Web页面中书写内容,甚至连“CSS”这个名词都刚刚从同学那里听说。为了完成“软件类课程设计”这门课的期末设计(我使用了PHP语言编写程序),我必须拥有一本教材引导我入门网页设计。然而,在没有仔细阅读前言和目录的情况下,我就因为这本书本身精美脱俗的设计而“无谋”地买下了它。

最后的事实证明,我是幸运的。

在中国买实体教材最容易遇到的问题是,几乎所有的教材的内容都是陈旧的,至少其思想是陈旧的,而且大量的泡沫产品也导致它们的内容是庸俗而千篇一律的。我是幸运的,因为我的起点就在许多人超前。《超越CSS:Web设计艺术精髓》讲述的是当今最先进、甚至是超前的思想,并且不是像说明书那样去讲解每一个HTML标签或每一个CSS属性的功能,而是在试图引导读者领悟如何正确地去思考:“这种内容上应该使用什么元素?”而不是“元素可以使用在哪种内容上”,这使得“思想”这种抽象的东西变得很容易领会。

对我而言,网页设计只是刚刚起步。等待着我去学习的东西还很多,比如我完全没有美术基础,比如我还很不擅长制作自适应宽度的布局,比如对于IE6这些原先已经快从我的记忆中被淡忘的浏览器的支持,比如我对于额外的标签还是非常依赖的(尤其是公司里做网页出的效果图特别喜欢圆角边框,并且几乎要求每一个页面都能适应从800×600到FullHD的所有分辨率)等等。

我身边那些设计网页的人,他们做出的效果图本身就是一个表格的体现,所有的东西全部长得方方正正,并且被按行按列整齐地排列在一起。我曾经设计过一个简单的两列布局,在页面的上半部分(大约700px),左列显示一些重要的文章的链接,右列则是滚动图片和联系方式等小Tips,他们的宽度比大约是3:2,而页面的下半部分则是左右对称1:1的两列不怎么重要的文章链接。结果当我把这个设计提交后,几乎整个办公室的人都诧异地问我:为什么上下两行的列不等宽的?

而我现在要去做的,就是打破这种表格布局时代留下的惯性思维。虽然我没有美术基础,然而对于从未接触过表格布局的我来说,从最初就建立一种不同的思维相对于转换思维要容易得多。尽管我只是不起眼的年轻人,但我将尽我最大的努力去影响我身边的人,让他们明白如何摆脱旧时代的束缚,为何要将样式与内容分离,为何要学习并遵循国际规范,为何要重视特殊人群等。

今天我在这里写下这篇读后感,是为了给自己设立一个标志,从这里开始,前方是新的世界。尽管你可能还是在我那用了他人现成设计的博客上,甚至是我的QZone上阅读到这篇文章,但是我已经开始制作真正属于我个人的主页了。尽管我还是从修改现有博客的样式开始着手(Blogbus的HTML结构非常漂亮,而QZone则是难以修改的表格布局),也许等明年我自己的网站正式上线时它还非常简陋甚至丑陋,但是我相信我可以克服这种艰辛,因为我已经无法也不需要去体验我的前辈们在那些连表格布局都困难重重、CSS甚至都不能正常显示的Netscape3上体验到的艰辛了。

在不久的将来,这篇文章将会如约成为我个人网站的建站序言,而且它的出现将会比HTML5和CSS3普及要更早一些。而我也将继续我的人生旅途,从迈向未来开始。