用ISAPI Rewiter代替虚拟主机,实现一个空间多个域名共用
域名续费时被告知可以以半价买一个空间。于是就买一个来玩玩。一年130,400M,也算不错了哇?
由于不能直接在DNS解析里实现隐藏转发,所以就打算采用url rewrite来实现多个域名共用一个空间。空间里面各个站点再放到相应的文件夹里,如此一来虚拟主机里又不会显得混乱,又能实现搜索引擎友好的链接。
折腾了两天,最终选定的URL重写配置文件(httpd.ini)如下。
—————————————————–
[code lang="shell"][ISAPI_Rewrite]
# 3600 = 1 hour
CacheClockRate 3600
RepeatLimit 20
#拒绝访问httpd.ini和httpd.parse.errors
RewriteRule /httpd(?:.ini|.parse.errors) / [F,I,O]
#拒绝访问特定后缀名的文件
RewriteRule .*.isrwhlp / [F,I,O]
#小小地抵抗一下蠕虫攻击
RewriteRule .*(?:global\.asa|default\.ida|root\.exe|\.\.).* . [F,I,O]
#给末尾不带"/"的的地址添加上"/"
#RewriteCond是Rewrite Conditions的意思,给下面的规则添加应用条件。(.*)代表任意匹配。
RewriteCond Host: (.*)
RewriteRule ([^.?]+[^.?/]) http://$1$2/ [I,R]
#方括号中的I和R分别代表“忽略(ignore)大小写”和“转接(redirect)[即显性跳转。地址栏看得到地址变化。]”
RewriteCond Host: portfolio.benhuoer.com
RewriteRule .* http://blog.benhuoer.com/portfolio [I,R,L]
RewriteCond Host: benhuoer.com
RewriteRule (.+)\.(jpg|png|jpeg|bmp|gif|xml|pdf) http://blog.benhuoer.com/blog$1\.$2 [I,R,L]
RewriteCond Host: blog.benhuoer.com
RewriteRule /wp(.*) /blog/wp$1
RewriteRule /sitemap\.xml /blog/sitemap\.xml
#标签tag
RewriteRule /post/tag/(.*)/?$ /index\.php\?tag=$1 [L]
RewriteRule /tag/(.*)/page/([0-9]+)/?$ /index\.php\?tag_name=$1&paged=$2 [L]
RewriteRule /tag/(.*)/?$ /index\.php\?tag=$1 [L]
#页面page (在后台与“文章”相对应那个东西)
RewriteRule /(contact|about|feedback|copyright|favor|archives|tags|sitemap) /index\.php\?pagename=$1 [L]
#分类目录
RewriteRule /category/(.*)/page/([0-9]+)/?$ /index\.php\?category_name=$1&paged=$2 [L]
RewriteRule /category/?(.*)/?$ /index\.php\?category_name=$1 [L]
#作者
RewriteRule /author/(.*)/(feed|rdf|rss|rss2|atom)/?$ /wp-feed\.php\?author_name=$1&feed=$2 [L]
RewriteRule /author/?(.*) /index\.php\?author_name=$1 [L]
#rss
RewriteRule /rss.xml /wp-feed\.php/\?feed=rss2 [L]
RewriteRule /feed/?$ /wp-feed\.php/\?feed=rss2 [L]
RewriteRule /comments/feed/?$ /wp-feed\.php/\?feed=comments-rss2 [L]
# RewriteRule /([0-9]+)/?([0-9]+)?/?$ /index\.php\?p=$1&page=$2
# RewriteRule /post/([0-9]+)/?([0-9]+)?/?$ /index\.php\?p=$1&page=$2 [L]
#分页查看文章
RewriteRule /post/([0-9]+).html /index\.php\?p=$1 [L]
RewriteRule /page/(.*)/?s=(.*) /index\.php\?s=$2&paged=$1 [L]
RewriteRule /page/(.*) /index\.php\?paged=$1 [L]
#按日期存档
RewriteRule /([0-9]{4})/([0-9]{1,2})/page/?([0-9]+)?/?$ /index\.php\?m=$1$2&paged=$3 [L]
RewriteRule /([0-9]{4})/([0-9]{1,2})/?$ /index\.php\?m=$1$2&paged=$3 [L]
#页面们
RewriteRule /(about|browse|portfolio|)/?([0-9]+)?/?$ /index\.php\?pagename=$1&paged=$2 [L]
# #以前我使用过/%year%/%monthnum%/%postname%.html作为文章链接
# #网站更新后采用了/%year%/%monthnum%/%postname%/ 的形式
# #为了链接形式的统一,同时使老链接保持可用
# #下面的代码将 /%year%/%monthnum%/%postname%.html 重定向到 /%year%/%monthnum%/%postname%/
# #注意:重定向到的网址“/$1/$2/$3/$4”没有添加blog前缀,因为重定向之后会从头开始再来验证Rewrite规则。
# #于是域名里面的blog(blog.benhuoer.com)又会添加到路径(blog.benhuoer.com/blog)中。
RewriteRule /([0-9]{4})/([0-9]{1,2})/([^/]+).html/?$ /$1/$2/$3 [I,R]
RewriteRule /([0-9]{4})/([0-9]{1,2})/([^/]+)/?([0-9]+).html/?$ /$1/$2/$3/$4 [I,R]
# # 重写 /%year%/%monthnum%/%postname%/ 形式的链接
RewriteRule /([0-9]{4})/([0-9]{1,2})/([^/]+)/\?(*.)$ /index\.php\?m=$1$2&name=$3&$4 [L]
RewriteRule /([0-9]{4})/([0-9]{1,2})/([^/]+)/?([0-9]+)?/?$ /index\.php\?m=$1$2&name=$3&paged=$4 [L]
RewriteRule /([0-9]{4})/([0-9]{1,2})/([^/]+)/(feed|rdf|rss|rss2|atom)/?$ /index\.php\?m=$1$2&name=$3&feed=$4 [L]
RewriteRule /([0-9]{4})/([0-9]{1,2})/([^/]+)/trackback/?$ /wp-trackback\.php\?m=$1$2&name=$3&tb=1[/code]
今天下午没去上课,就是因为发现貌似还有更简单便宜的方法:http://wordpress.org/support/topic/36214
结果一直在企图实现按照这种操作实现干净链接,结果一直没搞出来。整得我逃了四节课呀!
他的原理是利用404页面传递参数给index.php。我这虚拟主机是WIN的,貌似“index.php/参数/参数”这样的地址无法处理。又不能直接用rewriter隐藏转发到这个地址,必须在404页面里通过php函数和服务器变量来传递参数。他这个方法,如果我的WordPress直接放在虚拟主机的根目录下的话,应该能用。可我现在是放在子目录下,通过url rewrite实现了子域名而非子目录链接,用这种方法的时候就会有地址错误的问题。转发过来转发过去,传递过来传递过去,很是混乱。我自己是看不清楚服务器里面到底发生了什么,如果有人能搞清楚这里面的玄妙,可一定要留言告诉我呀!
UPDATE:这种方法还是没有完全解决问题,RSS种子等都有问题。其实可以在url rewriter里面更改规则的,但是还是哪句话,跳过去调过来,头都晕了,为了RSS能用,我又换回把WP的index.php放到根目录下的方式了。
© 笨活儿 允许转载,但请以链接形式保留出处。也欢迎您使用RSS订阅本博客。
N个人不厚道地悄悄飘走...