真的后悔当初选了个Windows主机安放CppLive编程在线,各种麻烦啊,从当初不能用Wordpress自带的mail函数发邮件到最近超麻烦的301重定向设置,浪费了我不少时间去折腾。不过在折腾的同时自己也学了很多新知识,这样想想也还就没那么沮丧了。早几天把Wordpress固定链接格式简化以后,百度的拔毛让我心慌慌,为了亡羊补牢,以至于我今天花了几乎一天时间去尝试利用web.config实现Windows空间的301重定向。
昨天那篇日志“巧用404页面重定向WordPress固定链接”虽然可以通过访问旧的固定链接利用JS跳转到新的固定链接页面,但因为是在已经产生了404错误以后借助404.php页面实现的跳转,旧的固定链接的http头信息里依然保存着404错误,网络爬虫毕竟不是浏览器,不会跟随着JS跳转,所以搜索引擎的网络爬虫沿着老的固定链接抓取页面时,发现404错误,也就是告诉它页面被删除或者找不到了,这不等于欺骗我们小爬虫的感情麽?所以现在的后果是,百度小爬虫伤心了,基本上不过来抓页面了。
但是如果做了真正意义上的301重定向,网页服务器会在http头中自动加上形于“HTTP/1.1 301 Moved Permanently”的语句告诉搜索引擎或者浏览器,该网址永久转移到新的地址上去了,新的网址用形于“Location:新地址”的语句表示。搜索引擎或浏览器收到这条301重定向信息便会自动抓取或访问新新地址。这种实现方式相对于昨天那篇文章中提到的方式,兼容性更好,几乎是个浏览器就支持,最重要的对搜索引擎很友好,便于搜索引擎更新链接地址,不至于因为内容重复而降权。
看来Windows这只螃蟹我是不吃不行了,查了一天的资料,问题还是没解决彻底,有部分页面暂时只能实现302重定向(即临时重定向,而301是永久重定向)了。只怨小的不才,完全实现301重定向还得请教高人,今天先小结一下,免得过两天又忘了。
从基本的开始弄,先把cpplive.com重定向到www.cpplive.com,到底要不要www,众说纷纭,各有各的道理,由于本人的域名C开头,要是不加www,看上去极不美观,所以决定使用www.cpplive.com作首页。在网站空目录下新建web.config文件,这是IIS7默认会调用的配置文件,贴入以下代码。
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <rewrite> <rules> <rule name="Canonical Host Name" stopProcessing="true"> <match url="(.*)" /> <conditions> <add input="{HTTP_HOST}" pattern="^cpplive\.com$" /> </conditions> <action type="Redirect" url="https://www.cpplive.com/{R:1}" redirectType="Permanent" /> </rule> </rules> </rewrite> </system.webServer> </configuration>
如果您的网站空间跟目录下已经有了web.config文件,并且已经有了以上类似结构,只需要将上面一段代码中<rule></rule>标签以及它们之间的内容拷贝到<rules></rules>之间便可。别忘了把cpplive\.com跟www.cpplive.com替换为您的对应域名。
现在只剩下固定链接需要重定向了,而这才是最难实现了,因为涉及到URL内容识别以及分割,用web.config文件实现我到目前为止还未弄成功过,如果哪位高人会的话,麻烦分享一下哈。就拿我的新旧固定链接来说吧,旧的格式形如“https://www.cpplive.com/html/883_wordpress-post-copyright.html”,新的格式形如“https://www.cpplive.com/html/883.html”,我有考虑过用正则表达式在web.config文件中实现301重定向如下。
<rule name="post url changed by taoz" stopProcessing="true"> <match url="^(.*)\/html\/(\d+)_(.*)\.html" /> <action type="Redirect" url="https://www.cpplive.com" redirectType="Permanent" /> </rule>
但不知是因为IIS7的问题还是空间提供商限制了,始终没有成功。无赖之下我只好选择在PHP中实现301重定向,但由于PHP修改好以后的带有301标志的http头最终还得经过WEB服务器转发,这样一转以后,301永久重定向就变成302临时重定向了,鄙人表示真的很无奈。在网站跟目录下找到index.php,在“<?”后面贴上如下代码。
$URIRedirect=$_SERVER['REQUEST_URI']; if (strpos($URIRedirect, "_") !== false) { $pageURL = 'http://'; // 只取 _ 前面的内容 $this_page = reset(explode("_", $URIRedirect)); $pageURL .= $_SERVER["SERVER_NAME"] . $this_page . '.html'; header('HTTP/1.1 301 Moved Permanently'); header('Location:'.$pageURL); exit(); }
即以下划线“_”作为分割标志,取分割后的前半截网址接上“.html”就把旧的固定链接地址转化成了新的固定链接地址。然后通过header函数设置301永久重定向,小遗憾是IIS7最终还是将这一改变降低成了302临时重定向。
除非注明,文章均为CppLive 编程在线原创,转载请注明出处,谢谢。
请教一下,怎么将一篇文章跳转到另一个目录下。例如
原地址 x.com/a.htm
能否跳转到
新地址 x.com/news/a.htm
求解答。
抱歉,这个我也不是很在行,我想你搜“伪静态”应该可以解决这个问题~