首页 > Internet > Windows主机修改httpd.ini实现wordpress固定链接及原默认链接同时访问

Windows主机修改httpd.ini实现wordpress固定链接及原默认链接同时访问

2011年7月5日 hypo

http://www.tofree.net/posts/209.html在Windows主机空间上安装wordpress系统,最头疼的就是设置固定链接了,如果在服务商配置环境的时候安装了URL Rewrite,那就不需要本文了,直接就可以使用固定链接了,重要的是没有安装,就需要自己去折腾了,前提是你有权限修改httpd.ini文件或者服务商帮你修改。

一、httpd.ini实现域名301重定向:

[ISAPI_Rewrite]
RewriteCond Host: ^utubon\.com$
RewriteRule (.*) http\://www\.tofree.net$1 [R,I,L]

上面这段代码实现了将utubon.com重定向到www.tofree.net。这种方法据说是有利有SEO的,稍作讲解:

[ISAPI_Rewrite]是开启重写能力的意思,每个单词都对应了英文的原意,英语好的朋友可以揣度一下。

RewriteCond提出条件,相当于IF。Host后面跟上域名,即条件内容,域名为utubon.com的情况下,执行下面的规则。^是开始标记,即域名以utubon.com开始,$为结尾标记,即域名以utubon.com结尾。整条语句的意思“重写条件 域名以u开头到com结束的情况下,往下执行”言外之意不符合则不执行。“\”是转义字符,在httpd.ini中需要对这种index.php中间的点加以转义。

RewriteRule则是指执行的规则。(.*)即第一个要匹配的内容,也就是说你的用这个东西将要代替另外一样。“.”指任意字符,“*”指这个字符重复0或更多次,如果是“+”意思为重复1或更多次。那么“(.*)”的意思就是指任意字符而且该字符可以随意重复N次,其实就是任意内容了。后面则是将前面的(.*)代替什么了,用$1表示。实际上这种方法我们只用在域名跳转上,不用在单独网页跳转上,从而实现301重定向。

二、httpd.ini实现wordpress固定链接:

[ISAPI_Rewrite]
RewriteRule /sitemap.xml /sitemap.xml [L]
RewriteRule /favicon.ico /favicon.ico [L]
RewriteRule /wap(.*) /wap$1 [L]
RewriteRule /content/uploads/(.*) /content/uploads/$1 [L]
RewriteRule /wp-(.*) /wp-$1 [L]
RewriteRule ^/$ /index.php [L]
RewriteRule /(.*) /index.php/$1 [L]

将上面的代码保存在一个txt文件中,修改文件名为httpd.ini,上传到web根目录,这样win主机下就能实现wordpress的固定链接了,并且你可以放心大胆的将后台设置固定链接中的“/index.php/”去除掉。

如果你在linux主机下了解过.htacess文件的使用,那么应该对此段代码不会陌生。只不过在httpd.ini中需要排除/sitemap.xml等类似的单独页面,如果不在加上这些相关语句,那么你的wordpress将会返回给用户“页面未找到”的提示,原因正如你想到的一样,因为你做了RewriteRule /(.*) /index.php/$1 [L]的规定,所以当你访问/sitemap.xml实际上已经重写到/index.php/sitemap.xml了,自然没有该页面。如果你还不明白不清楚语句的意思,你可以看本文参考来源,或到网上寻找.htaccess的教程方只其中奥妙。

虽然网上还有其他的办法,但本人认为这是最好的方法。在上传了httpd.ini之后,虽然实现了最初的固定链接网址形式,但有一个不太让人容易注意到的地方是,当你点击某个标签时,会发现找不到该页,原因是你的网址中含有中文字符,需要做如下修改:

修改网站目录下wp-include/classes.php文件(最新3.1版需要修改的文件是wp-include/class-wp.php)

$pathinfo = $_SERVER['PATH_INFO'];
修改为
$pathinfo = mb_convert_encoding($_SERVER['PATH_INFO'], 'UTF-8', 'GBK');

$req_uri = $_SERVER['REQUEST_URI'];
修改为
$req_uri = mb_convert_encoding($_SERVER['REQUEST_URI'], 'UTF-8', 'GBK');

三、使“?p=postid”短连接仍然可以访问

你可能对这种rewrite规则比较熟悉,国内的程序基本上都是用这种Rewrite。请注意这时WP的内部过程完全不同,WP的query vars值均来源于$_GET(Apache直接rewrite生成的),但Request_uri或Path_Info仍会被解析并且生成的$perma_query_vars完全正确,只是不会被用于query vars而已。因为$_GET优先级高于对url rewrite获得的值,因此在windows下IIS的httpd.ini里加入rewrite规则,后台permalink设置为默认后rewrite后友好地址仍可以访问。为了使网站更有利于SEO,减少不同网址却内容相同的情况,我们对文章页、分类页、单独页面做如下处理:

在wordpress主题文件头部文件或能够被全局访问的文件内加入如下代码

if($_GET['p']||$_GET['page_id']){
if($_GET['p'])$id=$_GET['p'];
if($_GET['page_id'])$id=$_GET['page_id'];
$post= get_post($id);
$name=$post->post_name;
header('HTTP/1.1 301 Moved Permanently');//发出301头部
header('Location: '.bloginfo('url').'/'.$name.'/');
exit();}
else if($_GET['cat']){
$id=$_GET['cat'];
$cat=get_category($id);
$name=$cat->slug;
header('HTTP/1.1 301 Moved Permanently');
header('Location: '.bloginfo('url').'/cat/'.$name.'/');
exit(); }
else if($_GET['tag']){
$name=$_GET['tag'];
header('HTTP/1.1 301 Moved Permanently');
header('Location: '.bloginfo('url').'/tag/'.$name.'/');
exit(); }

这段代码根据网址中是否包含p,page_id,cat,tag参数进行跳转,进入其别名为网址的页面。你也可以根据这种方法,来跳转更多的页面。当然这只是简单的处理方法,如果你的要求不是很高,可以使用该方法,如果你使用了其他的插件导致网址中出现p等参数,则需要写更多的代码来排除它。 由于win主机在这方面的严重缺陷,故建议使用wordpress建站的朋友尽量选择U主机,这样对各种自定义功能的实现更加直接。

如果你有权限或者是服务器配置员,最好在配置系统的时候就安装上URL RewriteWinCacheForPHP,这样使用者就会省事很多,没有必要去折腾服务器或麻烦服务商了。

转载自:便宜吧

转载敬请注明出处
本文链接地址:http://www.tofree.net/posts/209.html

分类: Internet 标签: , 6,204 views
  1. 2011年10月29日01:46 | #1

    非常感谢,我就是用你的方法实现的。
    找了很多的方式,有说用404的,有说用添加.htaccess文件的,结果都没有成功。

  2. 2011年11月28日14:31 | #2

    你好!我就是遇到上面的问题:在上传了httpd.ini之后,虽然实现了最初的固定链接网址形式,但有一个不太让人容易注意到的地方是,当你点击某个标签时,会发现找不到该页,原因是你的网址中含有中文字符,需要做如下修改:
    这个问题,能否指导一下,我这个网站www.zrjsc.com用以上方法,能否实现,万分感谢!
    能说一下你QQ号吗?

  3. 2011年12月29日10:02 | #3

    还是不会用。。。纠结。。怎么都出错。。。

  4. 2012年3月5日19:03 | #4

    你好,我又要重定向又要伪静态,两个写在一起就行了吗

  5. 2013年5月27日22:43 | #5

    [ISAPI_Rewrite]
    # 3600 = 1 hour
    CacheClockRate 3600
    RepeatLimit 32
    #解决中文tag无法访问的问题
    RewriteRule /tag/[^/]+)/([^/]+)/?([0-9]+)?/ /index.php?tag=$1&paged=$3 [L]
    # Protect httpd.ini and httpd.parse.errors files
    # from accessing through HTTP
    # Rules to ensure that normal content gets through
    RewriteRule /sitemap.xml /sitemap.xml [L]
    RewriteRule /favicon.ico /favicon.ico [L]
    # For file-based wordpress content (i.e. theme), admin, etc.
    RewriteRule /wp-(.*) /wp-$1 [L]
    # For normal wordpress content, via index.php
    RewriteRule ^/$ /index.php [L]
    RewriteRule /(.*) /index.php/$1 [L]

  6. 2013年8月31日09:58 | #6

    现在发现好用

本文的评论功能被关闭了.