windows+IIS下完美设置wordpress伪静态

2009-12-26 22:30| 分类:wordpress 博客维护| 标签: | 7,835 次点击

不得已把wordpress迁移到了wimp平台下,seo强迫的我自然要求链接友好,但IIS6没有自带rewrite功能(据说IIS7会好点,wordpress可默认支持IIS7下的URL重写)。如果用ISAPI Rewrite得自己写正则匹配,还不一定能匹配的成功,于是我找到了一个更方便的方法,堪称完美。

这个方法是通过IIS的自定义404页面实现,首先在wordpress根目录下新建一个wp-404rewrite.php,然后把下面的代码复制到里面去:

<?php
// This is the default file for the site. Usually index.php
$default = 'index.php';

// The name of this file.
// Set this value for the URL in Custom Error Properties of your website in IIS.
// Goto: IIS Manager > Websites > [Site Name] > Properties > Custom Errors >
// 404 & 404;2 & 404;3 > URL (Requires a '/' prefix in IIS).
$thisfile = '404-handler.php';

$_SERVER['ORIG_PATH_TRANSLATED'] = str_replace($thisfile, $default, $_SERVER['ORIG_PATH_TRANSLATED']);
$_SERVER['SCRIPT_FILENAME'] = str_replace($thisfile, $default, $_SERVER['SCRIPT_FILENAME']);
$_SERVER['ORIG_PATH_INFO'] = str_replace($thisfile, $default, $_SERVER['ORIG_PATH_INFO']);
$_SERVER['SCRIPT_NAME'] = str_replace($thisfile, $default, $_SERVER['SCRIPT_NAME']);
$_SERVER['PHP_SELF'] = str_replace($thisfile, $default, $_SERVER['PHP_SELF']);
$_SERVER['PATH_INFO'] = false;

$qs =& $_SERVER['QUERY_STRING'];
$ru =& $_SERVER['REQUEST_URI'];
$pos = strrpos($qs, '://');
$pos = strpos($qs, '/', $pos + 4);
$_SERVER['URL'] = $ru = substr($qs, $pos);
$qs = trim(stristr($ru, '?'), '?');

// Required for WordPress 2.8+
$_SERVER['HTTP_X_ORIGINAL_URL'] = $ru;

// Fix GET vars
foreach ( $_GET as $var => $val ) {
  if ( substr($var, 0, 3) == '404') {
    if ( strstr($var, '?') ) {
      $newvar = substr($var, strpos($var, '?') + 1);
      $_GET[$newvar] = $val;
    }
    unset($_GET[$var]);
  }
  break;
}
include($default);
?>
在IIS里的“自定义错误”Tab处添加修改404的错误指向,“消息类型”选择“URL”,地址填上:/wp-404rewrite.php(我的是/wp-404-handler.php),然后访问博客主页,看看各个页面是不是可以了?

我用firebug和google webmastertools查看状态,都是200,并非404,所以不用担心google不收录这样的页面。

以上方法参见这里(英文):

http://www.ikailo.com/94/url-modrewrite-workaround-iis-60/

http://tech.einaregilsson.com/2007/07/30/pretty-wordpress-permalinks-on-iis/

(以下是写给自己看的):这个方法对我来说还会有点问题,我配置好后发现三个博客的categary不管是否中文都可以访问,比如“http://blog.linggan.com/tag/电子商务”,但日期分类页面和分页页面均无法访问。后来发现其他人用这个方法,却可以访问日期分类。观察了下原来他们的链接里多了一个斜杠号“/”,只要我在日期分类和分页链接后加个斜杠,也可以访问了。但发现有个人的博客用http://wp.feiyan.info/page/1 这样的链接也可以访问,我意识到不是斜杠不斜杠的问题。而是自己的配置问题,突然意识到有可能是以前写的rewrite规则冲突!原来我以前写过facepk.com的rewrite规则,凡是后面是数字结尾的都会进行匹配,而免费的rewrite是全局生效的,会让所有IIS下的网站都生效,所以就导致这个404的问题了!

解决办法,去掉facepk.com的rewrite规则,facepk.com流量很低,也不需要seo,不过这里做个备份:

RewriteRule /facepk/(\d{1,5})$ /facepk/facepk\.asp\?id=$1

RewriteRule /(\d{1,5})$ /facepk\.asp\?id=$1

另外,之所以前面tag/xxx可以访问,也是因为以前就在httpd.conf中加了以下两句,现在可以删了!

RewriteRule /tag/(.*) /index\.php\?tag=$1

RewriteRule /cat/(.*) /index\.php\?category_name=$1

现在httpd.conf里就没有东西了。

之前我还试过用ISAPI组件的方法来设置友好链接,但一直没设置成功。

IIS下的Wordpress URL重写组件:URL Rewriting for WordPress wp_url_rewriting:URL Rewriting for WordPress under IIS (V 2.1)

WordPress URL Rewrite | WP URL 重写组件WordPress URL Rewrite v1.0 for 32bit Windows (x86)

WordPress在Win-iis中的完美rewrite实现方法http://code.google.com/p/wp-url-rewriting-on-iis/downloads/list

新版ISAPI Rewrite (Rewrite3_0067_Lite)无效的原因

2009-11-12 16:31| 分类:web开发| 标签: | 5,514 次点击

以前我用的是ISAPI_Rewrite3_0058_Lite.msi 版的,这次用了新的0067版。但安装完后发现并没有启动,安装完后在网站右键-属性那的状态处并无绿色的成功标识。按之前写的那篇《ISAPI Rewrite/IIS Rewrite无效的可能原因》,我就猜测是目录无everyone权限的原因,但改为everyone权限,并重启IIS服务,甚至重启电脑后都不行。后来看到了下图中的Web服务器扩展,把“所有未知ISAPI扩展设为允许”,就可以了。

image

但以前的服务器上并无允许这个“未知ISAPI扩展”,但却可以使用ISAPI,猜测是因为ISAPI Rewrite更新版本之后,就变成“未知”的了,所以需要这里做个允许。看来服务器软件还是不要一昧追求最新的,可用和稳定最重要。

如果想为某个网站启用这个ISAPI服务,可以在网站属性的ISAPI筛选器那边自己添加。如下图所示:

image

偏执wordpress seo教程之一——永久链接permalink的搜索引擎优化

2008-01-23 21:54| 分类:wordpress| 标签: | 11,107 次点击

wordpress seo第一步,我认为就是设定好合适的永久链接(permalinks),因为其他的优化都是在wordpress内部,以后修改也可以,而永久链接以后是出现在各个网站和搜索引擎上的,更换链接会造成page 404,成本就很高,所以本教程首先从permalinks入手。

本篇深入讨论wordpress日志页的永久链接(permalinks)问题,permalink可在“管理后台-设置-永久链接(Customize Permalink Structure)”里设置。这里的permalink指的是你发表的日志页面的永久固定链接,比如这篇文章的permalink是:http://www.chenfangyi.com/wordpress-seo-permalinks-customize-permalink-structure.html,wp有强大的自定义链接功能,几乎可以实现定制任何形式的文章链接。现在分析下如何选择适合自己的链接结构。

一、目录式结构还是html伪静态?

1、目录式URL会导致存在domain.com/post-name/和domain.com/post-name的两个URL,搜索引擎对这两个URL是分开对待的,两个URL相同内容,可能导致搜索引擎误判为复制网页,并且两个URL的PR也不会一致,总之不利于SEO。而如果是html就不会有这个问题。
2、从实际例子上看:google的博客服务blogger和百度的博客服务百度空间都是使用html静态化而不是使用目录式结构。搜索引擎本身当然可以对自己旗下的网站提高权重,而不需要通过seo来实现良好的排名,但不止他一个搜索引擎,blogger会想从yahoo搜索中拉些流量,百度知道和百度空间也需要针对google做一些优化,所以搜索引擎自身的服务seo也很重要。显然我们看到百度这这两个服务的seo做的非常好,在google中排名很高,这已很能说明问题,html静态化比目录式结构更有利于SEO。

所以我的建议是URL采用html伪静态而非目录式结构。

二、要不要把文章分类存放(从URL上看去)?

有的博客的永久链接为:domain.com/wordpress/wordpress-seo.html,看链接就像是把每篇文章放在所属的专辑里。
这种把文章永久链接放在各个category的子目录下的作法,在我看来是很没道理的。因为在windows下的惯性思维使我们觉得categoryname是一个个文件夹,把文章统一放在存档的文件夹里或者归类了存放似乎理所当然,但其实:

1、在apache上的wp中categoryname/完全只是一种分类方式,与2008/1/或者tag/tagname/没有本质区别,都是一种虚拟目录形式的归类方式,并不是实际的文件夹。

2、既然这只是一个归类方式,那就可以把它当成是一个文件(url格式的文件)清单列表。只不过这个清单的自身url看起来很友好,后面连html都没有!

3、更形象点的比喻,这个清单就是一个简易的自己站点上的hao123,或者是供访客查看的sitemap。提供各个博文的链接。

4、从wp自带的程序框架上看(wp的编程过程中其实已经自建了一个php框架),域名后跟的那个categoryname其实只是类似于ruby on rails中的反斜杆后的参数。有的人却把categoryname理解为文件夹。

所以没有理由让存档的日志保存在分类的文件夹里。
再逆向思考一下,假设这么做了:

1、就等于认同了在分类下放文章的作法。因为前面说了,tag和category同是分类系统。
既然跟据categoly的分类规则有:domain.com/wordpress/wordpress-seo.html
那么跟据tag又要有:domain.com/tags/wordpress/wordpress-seo.html
而跟据日期又要有:domain.com/2008/1/wordpress-seo.html
显然这是不可能的。想想tag系统都没让日志保存在各个tag下,为何就要保存在自建的category中呢?(而且还不是默认的/category/categoryname/下)如果一定要保存,也应该保存在更具永久性的时间文件夹中啊。(就像wp官方博客服务那样)

2、在用tag或者日期检索时,打开文章却跑到categoryname/里,莫名其妙,违背了分类的初衷,分类是为了找到文章,而不是让你再分类。

3、就是用category检索,也会由category/categoryname/跑到上一级目录:categoryname/wordpress-seo.html,更容易让人混崤。

加上一些主观的原因:

1、你可能哪天想更改某个分类,那就得改动URL
2、你可能喜欢把文章归为多个分类,那会造成混乱,所以我说这种分类不及时间分类永久。
3、你可能觉得分类有助于SEO,比如分类在/wordpress下的文章就都有了天生的wordpress关键字。但想想,你写关于wordpress的文章的标题中不会含有wordpress吗?这样反而会造成重复。而且分类常常是大范围的,如technology,这样的关键字并不会被拿来搜索,对SEO无用。

所以我不赞成使用从URL看上去分类存放的方式(暂时也没看到哪家大的博客托管商用这种方式组织URL)。

三、要不要把发表的日志归档到一个文件夹里,比如archives文件夹?

应该说这是超级流行的做法,甚至我在搜索引擎里辨别是否blog就是看这个blog文章的地址是否有archives目录。但有必要启用吗?还是就像我这里的,直接放在根目录下?

这里涉及到个人的建站哲学和生活方式。就我而言:
1、既然选择了www.chenfangyi.com直接作为blog,那么就等于认同了此顶级域名(也可把域名YY成一个目录)以下的每篇文章就是博文,所以可以直接放在这个根目录下,没有必要再用一个存档文件夹。
2、在我看来,如果建一个archives目录,就像是建了一个blog目录。这样就出了问题:一边你用了一个blog文件夹,一边却又让人访问你的域名即为访问blog首页,让人感觉思维不够清晰。
3、如果启用archives目录,那么archives也可理解为一个分类了,而既然只有一个分类,何必还要分类?
4、不过如果启用archives目录或者blog目录,从其他的分类进博文时,跳到archives分类下的文件,而不是根目录下的文件,就这点倒是更符合博客的分类规则。
5、类似于我在生活中的组织文件的方式,在一个页面内,只要是站内的链接,尽量追求只进到下一级的目录,而不是N级深的目录。
6、SEO考虑:直接把html放在根目录比放在archives目录少了一级,有人认为google是不在意目录层次的,而只在意“链接到层次”,即从首页通过几次链接然后到达此页面。但我可以证明google和其他搜索引擎是在意目录层次的,以后的SEO文章中会阐述。所以从SEO上考虑,也是不归档,直接放在根目录占优。
7、从wordpress本身程序架构上考虑:Wordpress作为一个博客程序(如果你是把wp当成cms来用,那另当别论),其实在最终对外浏览的数据结构上只有一层树状结构,内容也只有两样,即管理页面里发表的“文章”和“页面”,所有的内容均来自这里,没有任何其他的内容了。访客看到的那么多其他的链接都是围绕着这些页面的归类连接。所以把文章放在根目录下合情合理(从数据结构层面上看,很符合wp的数据结构模式)。

再逆向思考下,假设文章放在了domain.com/archive或者article/的目录下,则:

1、访客会认为domain.com/archive也可以访问,但默认wp不自动构建这个存档页面的管理页面,会提示404。
2、当然你可以新建一个名为archive的页面,页面就是显示所有存档文章的标题,这样就不会404了。但是这样这个页面与主页类似,又成了一个博客,只不过这个博客是标题输出的,而不像根目录下的那个博客是全文输出或者摘要输出的。这样又会让人感觉思维混乱。
3、如果一定要有一个显示所有文章标题的article目录,则可以加一个参数来表达“阅读方式”:domain.com/?readingmethod=articles ,并设置为此页面不被收录,比加个/archive归类阅读的方法要清晰的多。

所以我的建议是:除非你以后还想发布自己的摄影集之类的另外形式的博客,那时需要一个博客归类还有一个图片归类(photoarchives),否则既然顶级域名就是博客,那么直接使用http://www.chenfangyi.com/wordpress-seo-permalinks-customize-permalink-structure.html 的URL形式。

四、要不要以日期形式组织文章URL?

类似于这样http://www.chenfangyi.com/2008/01/13/wordpress-seo.html
blogger.com 就是类似这样

1、日志url的格式是按月归档,我看到很多国外的seo专家推荐这种格式,他们认为google可以跟据url中的日期参数而得知网页的更新时间,而网页地址能提供给google的信息越多,google就越喜欢。
2、不过就我看来,google不需要日期格式的url也能得知网页的更新时间的,对wp这么流行的博客程序,google在收录时,应该可以从文章页面的代码中得知发布时间。
3、使用包含日期的url会造成目录层次过深,在国内,对百度等其他搜索引擎就不够友好。
4、google对url中关键字的态度类似于对文章中关键字的态度,也会考察"皮配度"。比如搜索wordpress seo时,domain.com/123/wordpressseo就不如domain.com/wordpressseo权重,因为前者url中除了wordpressseo关键字外,还有其他关键字"123"(虽然看起来123不像是关键字,但这这是一个例子),皮配度不如后者。所以url尽量短,目录层次尽量低,是有道理的。

综上,我的建议是:
1,写文章的url时,要注意这就像写网页的meta属性,也不能堆砌关键字。
2,不用日期归档文章的URL形式。

最终我选择的链接格式是在根目录下直接存放每篇文章的html格式的链接,即在永久链接里选择第四个选项(自定义),并加上这个规则:/%postname%.html,效果可见本文的地址栏。

参考资料:
雪山飞猪:WP SEO 技巧:结构化永久链接(译文)
nicky: SEO for WordPress 完全指南
十大WordPress的SEO优化技巧-月光博客
Sheawey:关于Wordpress自定义Permalink
雪山飞猪:WordPress 2.3 SEO 优化
Blog的目录结构优化 (车东[Blog^2])
如何设置WP的友好链接(Permalinks) – Nicky’s blog
Sparanoid:WordPress 更换永久链接不完美解决方案
WordPress的SEO技巧完全指南 at catch the digital flow 北极冰仔部落格
seo之url优化篇-seo草根优化
5月设计–目录与html格式的权重
titan » Blog Archive » 伪装的谬论——论网站URL静态化
网站不一定要静态化才是好的SEO – 网站策划
升级到WordPress 2.2后permalink的反斜杠问题