User-agent 字串史(客户端操作系统浏览器识别)

较古的浏览器
1993年,NCSA 发布了首款 web 浏览器 Mosaic。它的 user-agent 字串非常简洁:

Mosaic/0.9
虽然当时由于它对操作系统和平台的依赖性,但是基本格式还是很简单明了。在文本中,斜杠前面是产品名称(可能会显示为 NCSA Mosaic 或是其他类似的字),斜杠后面是产品版本号。

Netscape Communications 开发了 web 浏览器 Mozilla(当时号称“Mosaic 杀手”)。他们首款公开发行版本: Netscape Navigator 2 的user-agent 字串具有如下格式:

Mozilla/Version [Language] (Platform; Encryption)
Netscape 按之前的做法在 user-agent 字串的前半部分使用了产品名称和产品版本,但在后面增加了下列信息:

Language - 表示应用程序用的是哪个语言
Platform - 表示应用程序是在什么操作系统和/或平台中运行
Encryption - 表示应用程序包含了什么安全加密类型。其中的值可能是U(128位加密)、I(40位加密)、N(没加密)。
Netscape Navigator 2 的 user-agent 字串的示例:

Mozilla/2.02 [fr] (WinNT; I)
上面的字串指: Netscape Navigator 2.02 、法语 、Windows NT 、40位加密。在当时,通过 user-agent 字串中的产品名称,可以正确判断使用的是哪个 web 浏览器。

Netscape Navigator 3 、Internet Explorer 3
1996年,Netscape Navigator 3 发布,它远远超过 Mosaic 成为当时最流行的 web 浏览器。而 user-agent 字串只有些小的变化:去掉了语言部分,多了个放操作系统或CPU的可选信息。格式如下:

Mozilla/Version (Platform; Encryption [; OS-or-CPU description])
在 Windows 系统中 Netscape Navigator 3 的 user-agent 字串的示例:

Mozilla/3.0 (Win95; U)
上面的字串指:Netscape Navigator 3 、Windows 95 、128 位加密。在 Windows 系统中,字串里面不会显示 OS 或 CPU 的信息。

Netscape Navigator 3 发布不久,微软公布了它的首款 web 浏览器: IE 3 1,但是 Netscape 是当时首选浏览器,大多数服务器在加载页面前都会检查 user-agent 是否为该款浏览器。IE 如果不兼容Netscape user-agent 字串,使用 IE 的用户就根本打不开这些页面,于是造就了如下格式:

Mozilla/2.0 (compatible; MSIE Version; Operating System)
在 Windows 95 中 IE 3.02 的 user-agent 字串的示例:

Mozilla/2.0 (compatible; MSIE 3.02; Windows 95)
由于当时的浏览器嗅探只查 user-agent 字串中的产品名称部分,结果 IE 摇身一变被识别成了 Mozilla,伪装成 Netscape Navigator。这个做法引发了对浏览器识别的争论。从此以后,浏览器真正的版本埋没在了字串的中间。

Netscape Communicator 4 、Internet Explorer 4至8
1997年8月,Netscape Communicator 4 发布(发布的名称中 Navigator 换成了 Communicator),它的 user-agent 字串格式与 3 版本一致。Windows 98 中 4 版本的 user-agent 字串如下:

Mozilla/4.0 (Win98; I)
Netscape 浏览器在更新时,版本也相应增加。4.79 版本的 user-agent 字串如下:

Mozilla/4.79 (Win98; I)
微软发布 IE 4 时,user-agent 字串更新了版本,格式如下:

Mozilla/4.0 (compatible; MSIE Version; Operating System)
在 Windows 98 中 IE 4 的 user-agent 字串的示例:

Mozilla/4.0 (compatible; MSIE 4.0; Windows 98)
可以看出,Mozilla 的版本与 IE 实际的版本一致,这样就可以识别第4代浏览器了。但遗憾的是,不久 IE 4.5 马上就发布了(只在 Mac 平台),虽然 Mozilla 版本仍是 4,但是 IE 的版本改成如下:

Mozilla/4.0 (compatible; MSIE 4.5; Mac_PowerPC)
此后,IE 的版本一直到 7 都沿用了这个模式。

而 IE 8 的 user-agent 字串添加了呈现引擎(rendering engine)版本:

Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)
新增的呈现引擎非常重要!这样 IE8 以 MSIE 7.0 兼容模式运行时,Trident 版本保持不变,而原先 IE7 的 user-agent 字串不包括 Trident 版本。这样可以区分 IE7 与 IE8 运行的兼容模式。

注意:别指望能从 Mozilla 版本中得到什么靠谱的信息。

Gecko
Gecko 是 Firefox 的呈现引擎。Gecko 首次开发是作为 Mozilla 浏览器 Netscape 6 的一部分。Netscape 6 的 user-agent 字串的结构是面向未来的,新版本反应出从 4.x 版本的简单变得较为复杂,它的格式如下:

Mozilla/MozillaVersion (Platform; Encryption; OS-or-CPU; Language; PrereleaseVersion)Gecko/GeckoVersion ApplicationProduct/ApplicationProductVersion
为了更好的理解上面的 Gecko user-agent 字串格式,下面来看看各种从基于 Gecko 浏览器中取得的字串。

在 Windows XP 中的 Netscape 6.21:

Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:0.9.4) Gecko/20011128 Netscape6/6.2.1
在 Linux 中的 SeaMonkey 1.1a:

Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1b2) Gecko/20060823 SeaMonkey/1.1a
在 Windows XP 中的 Firefox 2.0.0.11 :

Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11
Mac OS X 中的 Camino 1.5.1:

Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en; rv:1.8.1.6) Gecko/20070809 Camino/1.5.1
上面都是基于 Gecko 的浏览器所取得的 user-agent 字串,区别只是版本有所不同。Mozilla 版本 5.0 是自从首款基于 Gecko 发布后就一直不变,而且以后有可能也不会变2。

WebKit
2003年,Apple 宣布发布首款他们自主开发的 web 浏览器:Safari。它的呈现引擎叫 WebKit。它是 Linux 中的 web 浏览器 Konqueror 呈现引擎 KHTML 的一个分支,几年后,WebKit 的开源吸引了呈现引擎的开发人员。

这款新浏览器和呈现引擎的开发人员也遇到了曾经 IE 3.0 类似的问题:怎样才能溶入主流而不被踢出局?答案是:在 user-agent 字串中放详尽的信息,以便骗取网站的信任使它与其它流行的浏览器兼容。user-agent 字串格式如下:

Mozilla/5.0 (Platform; Encryption; OS-or-CPU; Language) AppleWebKit/AppleWebKitVersion (KHTML, like Gecko) Safari/SafariVersion
下面是示例:

Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/124 (KHTML, like Gecko) Safari/125.1
这又是个挺长的 user-agent 字串,其中包括的信息既有 Apple WebKit 的版本,也有 Safari 的版本。凡是基于 WebKit 的浏览器都将自己伪装成了 Mozilla 5.0,与基于 Gecko 浏览器完全一样。但 Safari 的版本是浏览器的构建版本号(build number)。Safari 1.25 在 user-agent 字串中号为 125.1(如上所示)。Safari 版本 3 的 user-agent 字串包括了实际的 Safari 版本:

Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/522.15.5 (KHTML, like Gecko) Version/3.0.3 Safari/522.15.5
其中的“(KHTML, like Gecko)”在 Safari 1.0 预览版本中就有了,这字串部分是最耐人寻味又饱受诟病。Apple 的野心是为了让开发人员把 Safari 当成 Gecko,所以采取了当初微软 IE user-agent 的类似做法:Safari 是兼容 Mozilla 的,否则 Safari 用户会认为用的浏览器不受支持。

而其它基于 WebKit 的浏览器与 Safari 不同的是,没有上面说的这个情况,所以检测断定浏览器是否基于 WebKit 比看有没有明确标 Safari 更有用。

Konqueror
Konqueror 是款在 KDE Linux 桌面环境中的浏览器,基于 KHTML 开源呈现引擎。它只发布了在 Linux 的版本,但是拥有活跃的用户群。为了兼容性最大化,user-agent 字串的格式也紧跟 IE 的后尘:

Mozilla/5.0 (compatible; Konqueror/Version; OS-or-CPU)
Konqueror 3.2 为了与 WebKit user-agent 字串变化保持一致,它将 KHTML 作为它的标识:

Mozilla/5.0 (compatible; Konqueror/Version; OS-or-CPU) KHTML/KHTMLVersion (like Gecko)
如下所示:

Mozilla/5.0 (compatible; Konqueror/3.5; SunOS) KHTML/3.5.0 (like Gecko)
Konqueror 和 KHTML 的版本号比较一致,唯一的区别就是下点处不同,比如Konquerer 3.5、KHTML 3.5.1。

Chrome
Google Chrome 浏览器以 WebKit 作为呈现引擎,JavaScript 引擎却用了另一种。最初发布的版本是 0.2,它的 user-agent 字串格式是在 webKit 信息的基础上又增加了如下:

Mozilla/5.0 (Platform; Encryption; OS-or-CPU; Language) AppleWebKit/AppleWebKitVersion (KHTML, like Gecko) Chrome/ChromeVersion Safari/SafariVersion
Chrome 0.2 user-agent 信息的示例如下:

Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.29 Safari/525.13
虽我不敢完全保证,但很可能 WebKit 版本和 Safari 版本总会保持同步。

Opera
Opera 浏览器默认 user-agent 字串是现代浏览器中最合理的--正确的标识了它自己及其版本。 在 Opera 8.0 前,它的 user-agent 字串格式如下:

Opera/Version (OS-or-CPU; Encryption) [Language]
在 Windows XP 中 Opera 7.54 user-agent 字串示例:

Opera/7.54 (Windows NT 5.1; U) [en]
Opera 8 user-agent 字串的语言部分移到了括号内。

Opera/Version (OS-or-CPU; Encryption; Language)
在 Windows XP 中 Opera 8 user-agent 字串示例:

Opera/8.0 (Windows NT 5.1; U; en)
当时 Opera 做为主流浏览器之一,它的 user-agent 字串是唯一使用产品名称和版本完全真实的标识了它自己。但是由于大量的浏览器嗅探代码在 Internet 上像蝗虫飞过般只吃标 Mozilla 产品名的 user-agent 字串,造成了 Opera 的 user-agent 字串发生了完全的改变。

Opera 9 user-agent 字串有两种修改的方式:一种方式是将自己标识为 Firefox 或 IE 浏览器。在这种方式下,user-agent 字串与 Firefox 或 IE 的几乎一样,只不过末尾附加了“Opera”及版本号。如下所示:

Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.50
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.50
前一字串将 Opera 9.5 标识为 Firefox 2。后一字串将 Opera 9.5 标识为 IE 6,在两个字串中都带有 Opera 版本信息。虽然这种方式是作为 Firefox 或 IE 打开的,但也能识别出 Opera。另一种方法则是浏览器 user-agent 字串标识伪装成 Firefox 或 IE,同时也找不到“Opera”字串及其版本信息。这样从字面上去区分 Opera 浏览器便成了“不可能完成的任务”。3

结论
user-agent 字串史可以说明曾对 user-agent 嗅探说不的原因:IE 想要将自己识别为 Netscape 4,Konqueror 和 WebKit 想要识别为 Firefox,Chrome 想要识别为 Safari。这样使得除 Opera 外所有浏览器的 user-agent 嗅探区别很小,想要从一堆茫茫浏览器海洋中找出有用的标识太少了。关于嗅探要记住:一款浏览器与其它浏览器是兼容的,这样造成了不能完全准确的断定是哪款浏览器。

比如说 Chrome ,它声称任何可以在 Safari 3 访问的网站 Chrome 也都可以访问,但是对检测 Chrome 没有一点用。为了浏览器的兼容--这便是这个声明的理由。

(完)

译注1:IE 3 不是微软首款浏览器,请参考 wiki 的 Timeline of web browsers。

译注2:这个是原作者的想法,译者不敢保证。

译注3:Opera 10 的 user-agent 字串大家自己去看吧。

博客访问日志尝试分析

下班了,突然想来看博客今天有哪些人访问,连上数据库,直接查看之前wordpress访客追踪插件的访问追踪记录表,今天的访问照样大多是来自google,然也有一些其它搜索引擎的,加起来也没有google的多。里面有几个“人”访问的,习惯性的查一下ip地址是哪里的。前两天查时,有几个使用win2003的用户访问,查看一些技术文章的,也有使用linux的,这次突然见有一个用fedora的linux用户:

Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.6) Gecko/20091216 Fedora/3.5.6-1.fc11 Firefox/3.5.6

访问来源是google搜索 (mysql procedure myisam )结果的第一页,前面有几条,都是mysql.com的结果,下面就是我的页面,从别处搜集来的信息,也没有进行修改加工,也没有进行优化,居然排名还能这么靠前!当然这样的关键词组合相当冷僻,很少人会这么搜索。

这个访问者是玩linux的,当然更要查一下是哪里的,ip138显示
<ul>
<li>本站主数据:北京市 电信</li>
<li>参考数据一:北京市 电信</li>
<li>参考数据二:北京市 理想国际大厦</li>
</ul>
理想国际大厦,查一下是什么单位,google结果,中关村的,好像还挺大的样子,其中一个结果页显示,该楼盘的信息

<span>http://data.dichan.com/OfficeDetails.aspx?OfficeID=&amp;Caption=%E7%90%86%E6%83%B3%E5%9B%BD%E9%99%85%E5%A4%A7%E5%8E%A6</span>
下面来有里面入驻的单位:新浪,17-20整层;华旗资讯,10-11整层;百度,12整层;还有其它几个。
看来百度也没有多大,才点了一层,又在里面查一层多大面积,2800m<sup>2</sup>;貌似这个页面里的信息比较老一点了。
对面积大小没有多少概念,问别的同事公司办公室有多大页面,感觉一个百度的办公区域大小。同事不解,为什么要问办公室面积,从博客的ip追踪说起,简要解释一下,然而他们是更不解,“根本不知道你在说什么”,看来差不多是袋鼠式的跳跃思维了。
又突然看到这个页面是新浪地产的页面,但域名根本不是sina.com.cn,进入该地址主页,自动跳转到新浪页面了,看来也是个老的站点,或者分站点,但新浪这些大网站一般不搞一大堆不同的域名的,都是单一域名+子域名的;估计这是并购别的网站了,而这是个老页面,只改了个网站logo,实际上是不是就不知道了,也没必要推究,又不是搞情报工作的。
至于这个访问者究竟是谁,大概很难知道了,ip地址,查这么专业的问题,而且看了两个页面“mysql 表种类 MyISAM,innodb详解”,“mysql 索引管理:SHOW INDEX语法 查看索引状态”,应该确实是在查找技术资料,而且使用linux,大概是一家搞网络的公司的员工,而且有可能是个当从事mysql相关技术不久的,不然不会查找这些比较浅显的东西,而且使用中文google搜索。
使用的可能是英文版搜索系统(语言环境),是fedora11,版本比较老一点,可能是公司行为,没有统一升级版本。
两次访问时间是中午2010-02-25 13:18:00, 2010-02-25 13:18:02访问时间非常积,看来这老兄的网速相当快,而且所看到页面信息不是自己所要的。

[user-agent并不可靠,但一般情况下,还是准确的,很少人去修改它,事实上好像也没有什么意思]

AJAX辅助调试利器:LiveHTTPHeaders

[20161011更新] 该扩展的原始版本长期没有维护、而不再支持最新的firefox;但有一个克隆分支在正常维护中 Live HTTP Headers (clone) . https://addons.mozilla.org/zh-Cn/firefox/addon/live-http-headers-clone/

----- 以下是原始文章 -----------------

LiveHTTPHeaders,一个firefox插件,非常强大的http请求抓取、重发、模拟工具,可有筛选的监测所关心的http请求。

官方网站:http://livehttpheaders.mozdev.org/

极简单/简陋的wordpress插件:网站访客追踪记录

提醒:有了个新版本,照样很简陋,默认将追踪记录表放到单独的数据库里;如果表访问失败会给出简单的消息提示。 传送门: 极简单/简陋的wordpress插件:网站访客追踪记录 v0.0.2

wordpress本身没有用户访问记录的功能,甚至连文章点击次数都没有记录,当然可以借助google analytics之类的工具进行站点访问的分析,但对于极小访问量的站点来说,GA似乎显得太大材小用了,要是能够精确记录下每一个访客的活动情况,是最好不过的,但并没有找到相关的插件,所以就临时查阅资料,草草完成了这个访问活动记录的插件,功能极其简陋,今天-严格地说是昨天、现在已经1:57分,已经是"明天"了-才真正开始了解一点wp插件的开发

-------------------------------------------
插件源程序\wordpress\wp-content\plugins\fstrace\fstrace.php
 <?php
/*
Plugin Name: fs trace
Plugin URI: http://www.path8.net/
Description: This plugin will trace all visitor's visit action.
Version: 0.0.1
Author: fengyqf
Author URI: http://www.path8.net/
*/

/*
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/

function fstrace_by_fengyqf(){
global $wpdb;
$url=mysql_escape_string(substr($_SERVER["REQUEST_URI"],0,200));
$referer=mysql_escape_string(substr($_SERVER["HTTP_REFERER"],0,200));
$cookie=mysql_escape_string(substr($_SERVER["HTTP_COOKIE"],0,250));
$client=mysql_escape_string(substr($_SERVER["HTTP_USER_AGENT"],0,200));
$ip=mysql_escape_string(substr($_SERVER["REMOTE_ADDR"],0,16));
$wpdb->query("insert into `my_wpplg_trace`(`referer`,`url`,`ip`,`client`,`cookie`)
values('{$referer}','{$url}','{$ip}','{$client}','{$cookie}')");

}
add_action('wp_footer','fstrace_by_fengyqf');

?>
-------------------------

需要有一张表存储追踪到的记录,插件本身没有创建数据表的功能,需要手工创建该表,语句如下:
-- phpMyAdmin SQL Dump
-- version 3.2.3
-- http://www.phpmyadmin.net
--
-- 主机: localhost
-- 生成日期: 2010 年 01 月 30 日 17:35
-- 服务器版本: 5.0.18
-- PHP 版本: 5.2.6

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

--
-- 数据库: `wordpress`
--

-- --------------------------------------------------------

--
-- 表的结构 `my_wpplg_trace`
--

CREATE TABLE IF NOT EXISTS `my_wpplg_trace` (
`id` int(11) NOT NULL auto_increment,
`referer` varchar(200) character set utf8 NOT NULL default '',
`url` varchar(200) character set utf8 NOT NULL default '',
`time` timestamp NOT NULL default CURRENT_TIMESTAMP,
`ip` varchar(16) character set utf8 NOT NULL default '',
`client` varchar(200) character set utf8 NOT NULL default '',
`cookie` varchar(300) character set utf8 NOT NULL default '',
PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=gbk AUTO_INCREMENT=4 ;

本来设置的是`cookie` varchar(300),但mysql服务器是4.1版本,varchar类型只能支持到255,在服务器mysql建表时只好改成`cookie` varchar(250)  ;比较无奈,购买虚拟主机附送的数据库,比较小,而且是4.1版,还不能用phpMyAdmin3.x连接——什么时间买个大点的5.x版的

---------------------------------
以前的追踪记录程序,一并列在这里,可能有点参考价值

之前借助在页面里插入以下这样代码的JS文件,籍以记录访客的记录,但对于搜索引擎的抓取,是无能为力了

$url=addslashes($_SERVER['HTTP_REFERER']);
$time=addslashes(date('Y-m-d H-n-s'));
$ip=addslashes($_SERVER["REMOTE_ADDR"]);
$client=addslashes($_SERVER["HTTP_USER_AGENT"]);
$cookie=substr(addslashes($_SERVER["HTTP_COOKIE"]),0,500);

$trace_table='fstrace';

$link = mysql_connect($mysql_host, $mysql_user,$mysql_pwd)
or die("Could not connect: " . mysql_error());
#print ("Connected successfully");
mysql_select_db($mysql_db);
$sql="insert into `{$trace_table}` (`url`,`time`,`ip`,`client`,`cookie`) values('{$url}','{$time}','{$ip}','{$client}','{$cookie}')";
mysql_query($sql,$link);
#echo $sql.''.mysql_affected_rows($link);
mysql_close($link);

或许您在阅读这篇文章时,您的IP地址、请求页面、cookie等信息已经记录在数据库里了,呵呵.

固定链接: http://www.path8.net/tn/archives/145

iis 404不用url rewrite组件也可以实现rewrite功能:原来不是很新鲜的技术

前不久无意中看到说iis服务器,即使不用rewrite组件,也可以实现rewrite功能,是借助404页面的一个巧妙应用,把所有页面都导向404页面,再由404载入相应的重写目标文件请求,因为使用linux+apache主机,没必要搞这东西,就没有仔细看这个功能的具体实现代码,但还是感觉到很新奇。而且那篇帖子的作者说是看到某个国外技术文章里讲的,借鉴来。

刚才,十分钟前,偶然看wordpress官方网站里的说明文档,发现了在wordpress里早就应用这一技术了:

wordpress管理后台-设置-固定链接

“WordPress 允许您更改默认的链接形式,以此提高 URLs 的可读性和对搜索引擎的友好程度。参考

 这里的“参考”链接里面就有以下一段:

  • Apache web server with the mod_rewrite module
  • Microsoft IIS 7+ web server with the URL Rewrite 1.1+ module and PHP 5 running as FastCGI
  • possibly Microsoft IIS 6+ using a 404 handler or Mod-Rewrite Pro
  • Lighttpd using a 404 handler or mod_rewrite or mod_magnet (see External sources)
  •  讲得很明白,404 handler 也可以实现,

    1 <?php
    2 $qs = $_SERVER['QUERY_STRING'];
    3 $pos = strrpos($qs, '://');
    4 $pos = strpos($qs, '/', $pos + 4);
    5 $_SERVER['REQUEST_URI'] = substr($qs, $pos);
    6 $_SERVER['PATH_INFO'] = $_SERVER['REQUEST_URI'];
    7 include('index.php');
    8 ?>

    看来还是老外的技术牛人多,老外的文章很多时候更有借鉴价值

    linux 下媒体播放器mplayer+kmplayer

    在fedora12下安装mplayer总是有很多问题,好几年前就用Linux,但仅仅是安装一下,草草用用,并没真正深入学习,很多地方都是一知半解,最近在fedora12下安装了官方svn最新的mplayer,但总是出一些这样那样的问题,装了kmplayer,设置播放核心为mplayer,很多问题都没有了,而且kmplayer在很多操作方面更容易上手一点,不你mplayer那样让人感觉到怪怪的。

    搞了老半天,凌晨1:22分,算是把数据导到wp里了(百度空间搬到wordpress)

    百度空间数据导入wordpress 2.9.1, 初步完成。 使用php数据采集器,hmjcj_1.3 采集数据,主要包括文章标题,分类,时间等。很简单的采集工具,称不上多好,但在这里够用了。 采集得到的数据整理,distinct得到所有文章分类,导入一个新表里,原始文章表里,加分类id号字段,update;时间整理出来。 本地新安装wp,把分类导入wp_terms,文章导入 wp_posts,在wp_term_taxonomy表,为分条wp_terms创建一条记录,直接使term_id与term_taxonomy_id相等,以免导文章分类号对应时麻烦。 导入文章与分类关系数据wp_term_relationships 几条主要语句: insert into `wp_posts` (post_author, post_date, post_date_gmt,  post_content, post_title, post_status , comment_status, ping_status, post_name, post_modified, post_modified_gmt , post_parent, post_type, comment_count, post_excerpt, to_ping, pinged, post_content_filtered) select 1, `time`, `time`, `body`, `title`, 'publish', 'open', 'open', `title`, `time`, `time`, 0, 'post', 0, '', '', '', '' from `fei5` insert into `wp_term_relationships`(term_taxonomy_id, object_id) SELECT `fei5`.cate_id, wp_posts.`id` FROM `fei5` inner join wp_posts on wp_posts.post_title=fei5.title SELECT wp_posts.`id`, wp_posts.post_title, `fei5`.cate_id, `fei5`.cate FROM `fei5` inner join wp_posts on wp_posts.post_title=fei5.title

    Pages: Prev 1 2 3 ... 38 39 40 41 42 43 44 45 46 47 48 Next