iptables详细教程:基础、架构、清空规则、追加规则、应用实例

iptables防火墙可以用于创建过滤(filter)与NAT规则。所有Linux发行版都能使用iptables,因此理解如何配置iptables将会帮助你更有效地管理Linux防火墙。如果你是第一次接触iptables,你会觉得它很复杂,但是一旦你理解iptables的工作原理,你会发现其实它很简单。

首先介绍iptables的结构:iptables -> Tables -> Chains -> Rules. 简单地讲,tables由chains组成,而chains又由rules组成。如下图所示。


图: IPTables Table, Chain, and Rule Structure

一、iptables的表与链

iptables具有Filter, NAT, Mangle, Raw四种内建表:

1. Filter表

Filter表示iptables的默认表,因此如果你没有自定义表,那么就默认使用filter表,它具有以下三种内建链:

  • INPUT链 – 处理来自外部的数据。
  • OUTPUT链 – 处理向外发送的数据。
  • FORWARD链 – 将数据转发到本机的其他网卡设备上。

2. NAT表

NAT表有三种内建链:

  • PREROUTING链 – 处理刚到达本机并在路由转发前的数据包。它会转换数据包中的目标IP地址(destination ip address),通常用于DNAT(destination NAT)。
  • POSTROUTING链 – 处理即将离开本机的数据包。它会转换数据包中的源IP地址(source ip address),通常用于SNAT(source NAT)。
  • OUTPUT链 – 处理本机产生的数据包。

3. Mangle表

Mangle表用于指定如何处理数据包。它能改变TCP头中的QoS位。Mangle表具有5个内建链:

  • PREROUTING
  • OUTPUT
  • FORWARD
  • INPUT
  • POSTROUTING

4. Raw表

Raw表用于处理异常,它具有2个内建链:

  • PREROUTING chain
  • OUTPUT chain

5.小结

下图展示了iptables的三个内建表:

图: IPTables 内建表

二、IPTABLES 规则(Rules)

牢记以下三点式理解iptables规则的关键:

  • Rules包括一个条件和一个目标(target)
  • 如果满足条件,就执行目标(target)中的规则或者特定值。
  • 如果不满足条件,就判断下一条Rules。

目标值(Target Values)

下面是你可以在target里指定的特殊值:

  • ACCEPT – 允许防火墙接收数据包
  • DROP – 防火墙丢弃包
  • QUEUE – 防火墙将数据包移交到用户空间
  • RETURN – 防火墙停止执行当前链中的后续Rules,并返回到调用链(the calling chain)中。

如果你执行iptables --list你将看到防火墙上的可用规则。下例说明当前系统没有定义防火墙,你可以看到,它显示了默认的filter表,以及表内默认的input链, forward链, output链。

# iptables -t filter --list
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

查看mangle表:

# iptables -t mangle --list

查看NAT表:

# iptables -t nat --list

查看RAW表:

# iptables -t raw --list

/!\注意:如果不指定-t选项,就只会显示默认的filter表。因此,以下两种命令形式是一个意思:

# iptables -t filter --list
(or)
# iptables --list

以下例子表明在filter表的input链, forward链, output链中存在规则:

# iptables --list
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    RH-Firewall-1-INPUT  all  --  0.0.0.0/0            0.0.0.0/0

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination
1    RH-Firewall-1-INPUT  all  --  0.0.0.0/0            0.0.0.0/0

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

Chain RH-Firewall-1-INPUT (2 references)
num  target     prot opt source               destination
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
2    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           icmp type 255
3    ACCEPT     esp  --  0.0.0.0/0            0.0.0.0/0
4    ACCEPT     ah   --  0.0.0.0/0            0.0.0.0/0
5    ACCEPT     udp  --  0.0.0.0/0            224.0.0.251         udp dpt:5353
6    ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:631
7    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:631
8    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
9    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
10   REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

以上输出包含下列字段:

num – 指定链中的规则编号
target – 前面提到的target的特殊值
prot – 协议:tcp, udp, icmp等
source – 数据包的源IP地址
destination – 数据包的目标IP地址

三、清空所有iptables规则

在配置iptables之前,你通常需要用iptables --list命令或者iptables-save命令查看有无现存规则,因为有时需要删除现有的iptables规则:

iptables --flush
或者
iptables -F

这两条命令是等效的。但是并非执行后就万事大吉了。你仍然需要检查规则是不是真的清空了,因为有的linux发行版上这个命令不会清除NAT表中的规则,此时只能手动清除:

iptables -t NAT -F

四、永久生效

当你删除、添加规则后,这些更改并不能永久生效,这些规则很有可能在系统重启后恢复原样。为了让配置永久生效,根据平台的不同,具体操作也不同。下面进行简单介绍:

1.Ubuntu

首先,保存现有的规则:

iptables-save > /etc/iptables.rules

然后新建一个bash脚本,并保存到/etc/network/if-pre-up.d/目录下:

#!/bin/bash
iptables-restore < /etc/iptables.rules

这样,每次系统重启后iptables规则都会被自动加载。
/!\注意:不要尝试在.bashrc或者.profile中执行以上命令,因为用户通常不是root,而且这只能在登录时加载iptables规则。

2.CentOS, RedHat

# 保存iptables规则
service iptables save

# 重启iptables服务
service iptables stop
service iptables start

查看当前规则:

cat  /etc/sysconfig/iptables

五、追加iptables规则

可以使用iptables -A命令追加新规则,其中-A表示Append。因此,新的规则将追加到链尾。
一般而言,最后一条规则用于丢弃(DROP)所有数据包。如果你已经有这样的规则了,并且使用-A参数添加新规则,那么就是无用功。

1.语法

iptables -A chain firewall-rule
  • -A chain – 指定要追加规则的链
  • firewall-rule – 具体的规则参数

2.描述规则的基本参数

以下这些规则参数用于描述数据包的协议、源地址、目的地址、允许经过的网络接口,以及如何处理这些数据包。这些描述是对规则的基本描述。

-p 协议(protocol)

  • 指定规则的协议,如tcp, udp, icmp等,可以使用all来指定所有协议。
  • 如果不指定-p参数,则默认是all值。这并不明智,请总是明确指定协议名称。
  • 可以使用协议名(如tcp),或者是协议值(比如6代表tcp)来指定协议。映射关系请查看/etc/protocols
  • 还可以使用–protocol参数代替-p参数

-s 源地址(source)

  • 指定数据包的源地址
  • 参数可以使IP地址、网络地址、主机名
  • 例如:-s 192.168.1.101指定IP地址
  • 例如:-s 192.168.1.10/24指定网络地址
  • 如果不指定-s参数,就代表所有地址
  • 还可以使用–src或者–source

-d 目的地址(destination)

  • 指定目的地址
  • 参数和-s相同
  • 还可以使用–dst或者–destination

-j 执行目标(jump to target)

  • -j代表”jump to target”
  • -j指定了当与规则(Rule)匹配时如何处理数据包
  • 可能的值是ACCEPT, DROP, QUEUE, RETURN
  • 还可以指定其他链(Chain)作为目标

-i 输入接口(input interface)

  • -i代表输入接口(input interface)
  • -i指定了要处理来自哪个接口的数据包
  • 这些数据包即将进入INPUT, FORWARD, PREROUTE链
  • 例如:-i eth0指定了要处理经由eth0进入的数据包
  • 如果不指定-i参数,那么将处理进入所有接口的数据包
  • 如果出现! -i eth0,那么将处理所有经由eth0以外的接口进入的数据包
  • 如果出现-i eth+,那么将处理所有经由eth开头的接口进入的数据包
  • 还可以使用–in-interface参数

-o 输出(out interface)

  • -o代表”output interface”
  • -o指定了数据包由哪个接口输出
  • 这些数据包即将进入FORWARD, OUTPUT, POSTROUTING链
  • 如果不指定-o选项,那么系统上的所有接口都可以作为输出接口
  • 如果出现! -o eth0,那么将从eth0以外的接口输出
  • 如果出现-i eth+,那么将仅从eth开头的接口输出
  • 还可以使用–out-interface参数

3.描述规则的扩展参数

对规则有了一个基本描述之后,有时候我们还希望指定端口、TCP标志、ICMP类型等内容。

–sport 源端口(source port)针对 -p tcp 或者 -p udp

  • 缺省情况下,将匹配所有端口
  • 可以指定端口号或者端口名称,例如”–sport 22″与”–sport ssh”。
  • /etc/services文件描述了上述映射关系。
  • 从性能上讲,使用端口号更好
  • 使用冒号可以匹配端口范围,如”–sport 22:100″
  • 还可以使用”–source-port”

–-dport 目的端口(destination port)针对-p tcp 或者 -p udp

  • 参数和–sport类似
  • 还可以使用”–destination-port”

-–tcp-flags TCP标志 针对-p tcp

  • 可以指定由逗号分隔的多个参数
  • 有效值可以是:SYN, ACK, FIN, RST, URG, PSH
  • 可以使用ALL或者NONE

-–icmp-type ICMP类型 针对-p icmp

  • –icmp-type 0 表示Echo Reply
  • –icmp-type 8 表示Echo

4.追加规则的完整实例:仅允许SSH服务

本例实现的规则将仅允许SSH数据包通过本地计算机,其他一切连接(包括ping)都将被拒绝。

# 1.清空所有iptables规则
iptables -F

# 2.接收目标端口为22的数据包
iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT

# 3.拒绝所有其他数据包
iptables -A INPUT -j DROP

六、更改默认策略

上例的例子仅对接收的数据包过滤,而对于要发送出去的数据包却没有任何限制。本节主要介绍如何更改链策略,以改变链的行为。

1. 默认链策略

/!\警告:请勿在远程连接的服务器、虚拟机上测试!
当我们使用-L选项验证当前规则是发现,所有的链旁边都有policy ACCEPT标注,这表明当前链的默认策略为ACCEPT:

# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
DROP       all  --  anywhere             anywhere            

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

这种情况下,如果没有明确添加DROP规则,那么默认情况下将采用ACCEPT策略进行过滤。除非:
a)为以上三个链单独添加DROP规则:

iptables -A INPUT -j DROP
iptables -A OUTPUT -j DROP
iptables -A FORWARD -j DROP

b)更改默认策略:

iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

糟糕!!如果你严格按照上一节的例子配置了iptables,并且现在使用的是SSH进行连接的,那么会话恐怕已经被迫终止了!
为什么呢?因为我们已经把OUTPUT链策略更改为DROP了。此时虽然服务器能接收数据,但是无法发送数据:

# iptables -L
Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
DROP       all  --  anywhere             anywhere            

Chain FORWARD (policy DROP)
target     prot opt source               destination         

Chain OUTPUT (policy DROP)
target     prot opt source               destination

七、配置应用程序规则

尽管5.4节已经介绍了如何初步限制除SSH以外的其他连接,但是那是在链默认策略为ACCEPT的情况下实现的,并且没有对输出数据包进行限制。本节在上一节基础上,以SSH和HTTP所使用的端口为例,教大家如何在默认链策略为DROP的情况下,进行防火墙设置。在这里,我们将引进一种新的参数-m state,并检查数据包的状态字段。

1.SSH

# 1.允许接收远程主机的SSH请求
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

# 2.允许发送本地主机的SSH响应
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
  • -m state: 启用状态匹配模块(state matching module)
  • –-state: 状态匹配模块的参数。当SSH客户端第一个数据包到达服务器时,状态字段为NEW;建立连接后数据包的状态字段都是ESTABLISHED
  • –sport 22: sshd监听22端口,同时也通过该端口和客户端建立连接、传送数据。因此对于SSH服务器而言,源端口就是22
  • –dport 22: ssh客户端程序可以从本机的随机端口与SSH服务器的22端口建立连接。因此对于SSH客户端而言,目的端口就是22

如果服务器也需要使用SSH连接其他远程主机,则还需要增加以下配置:

# 1.送出的数据包目的端口为22
iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

# 2.接收的数据包源端口为22
iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

2.HTTP

HTTP的配置与SSH类似:

# 1.允许接收远程主机的HTTP请求
iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT

# 1.允许发送本地主机的HTTP响应
iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

3.完整的配置

# 1.删除现有规则
iptables -F

# 2.配置默认链策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

# 3.允许远程主机进行SSH连接
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

# 4.允许本地主机进行SSH连接
iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

# 5.允许HTTP请求
iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

References

[1] Linux Firewall Tutorial: IPTables Tables, Chains, Rules Fundamentals
[2] IPTables Flush: Delete / Remove All Rules On RedHat and CentOS Linux
[3] Linux IPTables: How to Add Firewall Rules (With Allow SSH Example)
[4] Linux IPTables: Incoming and Outgoing Rule Examples (SSH and HTTP)
[5] 25 Most Frequently Used Linux IPTables Rules Examples
[6] man 8 iptables

Source:
http://lesca.me/archives/iptables-tutorial-structures-configuratios-examples.html

 

发表在 article | 标签为 | 71条评论

windows下使用Bind9做DNS智能解析解决电信网通双线

现在中国互联网的特殊国情是南电信北网通,两家为了竞争,造成了电信和网通间互相访问速度让人不能忍受,对于提供互联网服务的服务器来说只能顾了电信顾不了网通,有没有好的解决方法呢?回答是有,下面介绍最容易实现的方式。
服务器的要求是:
机房有电信和网通的双线,双网卡分别接电信和网通的线路,然后自己用Bind9 自己做DNS解析,实现根据用户的网络IP来自动选择电信和网通线路。
配置安装方式如下:
1、BIND 9.4.2
http://ftp.isc.org/isc/bind9/9.4.2/BIND9.4.2.zip


2、安装BIND 9.4.2
解压到一个临时目录,而后运行 BINDInstall.exe,一直默认安装就行了,不需要更改什么设置。默认安装到 \windows\system32\dns目录下

3.配置
运行CMD进入安装目录(\windows\system32\dns)下面的bin目录,而后运行
rndc-confgen -a   (运行完成后会在etc目录下生成rndc.key)
rndc-confgen > ..\etc\rndc.conf
  进入etc目录,用 notepad 新建 named.conf 复制下面的内容,注意把rndc.conf中# Use with the following in named.conf, adjusting the allow list as needed: 以后的内容复制到named.conf文件中,去掉前面的#。

named.conf
######################named.conf############################
acl “trust-lan” { 127.0.0.1/8; 10.0.0.0/24;};
options {
        directory “C:\WINDOWS\system32\dns\etc”;
        recursion no;
        version “0.0.0″;
        allow-transfer { “trust-lan”;};
        allow-notify { “trust-lan”; };
        auth-nxdomain no;
        forwarders { 60.171.45.171;60.171.45.150;};  
};
#这一段内容拷贝来自rndc.conf
key “rndc-key” {
        algorithm hmac-md5;
        secret “p30d5VTh6iP+QBiVsEI0lw==”;
};
controls {
        inet 127.0.0.1 port 953
                allow { 127.0.0.1; } keys { “rndc-key”; };
};
#注意在C:\WINDOWS\system32\dns\log\ 下建dns_warnings.txt dns_logs.txt
logging {
channel warning
{ file “C:\WINDOWS\system32\dns\log\dns_warnings.txt” versions 3 size 1240k;
severity warning;
print-category yes;
print-severity yes;
print-time yes;
};
channel general_dns
{ file “C:\WINDOWS\system32\dns\log\dns_logs.txt” versions 3 size 1240k;
severity info;
print-category yes;
print-severity yes;
print-time yes;
};
category default { warning; };
category queries { general_dns; };
};
#将网通的地址范围数据
include “cnc.conf”;
# 判断如果是网通的地址范围,则会执行此处,调用网通的解析
view “view_cnc” {
match-clients { CNC; };
zone “.” {
type hint;
file “named.root”;
};
zone “0.0.127.IN-ADDR.ARPA” {
type master;
file “localhost.rev”;
};
include “master/cnc.def”;
};
view “view_any” {
match-clients { any; };
zone “.” {
type hint;
file “named.root”;
};
zone “0.0.127.IN-ADDR.ARPA” {
type master;
file “localhost.rev”;
};
include “master/telecom.def”;
};

 

###################### named.conf############################
用notepad 新建 cnc.conf复制下面的内容
###################### cnc.conf############################
# jul/14/2006 09:44:25 by coolice
# software id = EFTB-IZN
#
acl “CNC” {
58.16.0.0/16;
58.17.0.0/17;
58.17.128.0/17;
58.18.0.0/16;
58.19.0.0/16;
58.20.0.0/16;
58.21.0.0/16;
58.22.0.0/15;
58.240.0.0/15;
58.242.0.0/15;
58.244.0.0/15;
58.246.0.0/15;
58.248.0.0/13;
60.0.0.0/13;
60.8.0.0/15;
60.10.0.0/16;
60.11.0.0/16;
60.12.0.0/16;
60.13.0.0/18;
60.13.128.0/17;
60.14.0.0/15;
60.16.0.0/13;
60.24.0.0/14;
60.30.0.0/16;
60.31.0.0/16;
60.208.0.0/13;
60.216.0.0/15;
60.218.0.0/15;
60.220.0.0/14;
61.48.0.0/13;
61.133.0.0/17;
61.134.96.0/19;
61.134.128.0/17;
61.135.0.0/16;
61.137.128.0/17;
61.138.0.0/17;
61.138.128.0/18;
61.139.128.0/18;
61.148.0.0/15;
61.156.0.0/16;
61.158.0.0/16;
61.159.0.0/18;
61.161.0.0/18;
61.161.128.0/17;
61.162.0.0/16;
61.163.0.0/16;
61.167.0.0/16;
61.168.0.0/16;
61.176.0.0/16;
61.179.0.0/16;
61.180.128.0/17;
61.181.0.0/16;
61.182.0.0/16;
61.189.0.0/17;
125.32.0.0/16;
125.40.0.0/13;
202.96.0.0/18;
202.96.64.0/21;
202.96.72.0/21;
202.97.128.0/18;
202.97.224.0/21;
202.97.240.0/20;
202.98.0.0/21;
202.98.8.0/21;
202.99.64.0/19;
202.99.96.0/21;
202.99.128.0/19;
202.99.160.0/21;
202.99.168.0/21;
202.99.176.0/20;
202.99.208.0/20;
202.99.224.0/21;
202.99.232.0/21;
202.99.240.0/20;
202.102.128.0/21;
202.102.224.0/21;
202.102.232.0/21;
202.106.0.0/16;
202.107.0.0/17;
202.108.0.0/16;
202.110.0.0/17;
202.111.128.0/18;
203.93.8.0/24;
203.93.192.0/18;
210.13.128.0/17;
210.14.160.0/19;
210.14.192.0/19;
210.15.32.0/19;
210.15.96.0/19;
210.15.128.0/18;
210.16.128.0/18;
210.21.0.0/16;
210.51.0.0/16;
210.52.128.0/17;
210.53.0.0/17;
210.53.128.0/17;
210.74.96.0/19;
210.74.128.0/19;
210.82.0.0/15;
211.152.0.0/13;
218.7.0.0/16;
218.8.0.0/14;
218.12.0.0/16;
218.21.128.0/17;
218.24.0.0/14;
218.28.0.0/15;
218.56.0.0/14;
218.60.0.0/15;
218.62.0.0/17;
218.67.128.0/17;
218.68.0.0/15;
218.104.0.0/14;
219.154.0.0/15;
219.156.0.0/15;
219.158.0.0/17;
219.158.128.0/17;
219.159.0.0/18;
220.252.0.0/16;
221.0.0.0/15;
221.2.0.0/16;
221.3.0.0/17;
221.3.128.0/17;
221.4.0.0/16;
221.5.0.0/17;
221.5.128.0/17;
221.6.0.0/16;
221.7.0.0/19;
221.7.32.0/19;
221.7.64.0/19;
221.7.96.0/19;
221.7.128.0/17;
221.8.0.0/15;
221.10.0.0/16;
221.11.0.0/17;
221.11.128.0/18;
221.11.192.0/19;
221.12.0.0/17;
221.12.128.0/18;
221.13.0.0/18;
221.13.64.0/19;
221.13.96.0/19;
221.13.128.0/17;
221.14.0.0/15;
221.192.0.0/15;
221.194.0.0/16;
221.195.0.0/16;
221.196.0.0/15;
221.198.0.0/16;
221.199.0.0/19;
221.199.32.0/20;
221.199.128.0/18;
221.199.192.0/20;
221.200.0.0/14;
221.204.0.0/15;
221.206.0.0/16;
221.207.0.0/18;
221.207.64.0/18;
221.207.128.0/17;
221.208.0.0/14;
221.212.0.0/16;
221.213.0.0/16;
221.216.0.0/13;
222.128.0.0/14;
222.132.0.0/14;
222.136.0.0/13;
222.160.0.0/15;
222.162.0.0/16;
222.163.0.0/19;
222.163.32.0/19;
222.163.64.0/18;
222.163.128.0/17;
219.235.56.194;
};

 

###################### cnc.conf############################
用notepad 新建 named.root复制下面的内容
###################### named.root############################

;       This file holds the information on root name servers needed to
;       initialize cache of Internet domain name servers
;       (e.g. reference this file in the "cache  .  <file>"
;       configuration file of BIND domain name servers).
;
;       This file is made available by InterNIC
;       under anonymous FTP as
;           file                /domain/named.root
;           on server           FTP.INTERNIC.NET
;       -OR-                    RS.INTERNIC.NET
;
;       last update:    Dec 12, 2008
;       related version of root zone:   2008121200
;
; formerly NS.INTERNIC.NET
;
.                        3600000  IN  NS    A.ROOT-SERVERS.NET.
A.ROOT-SERVERS.NET.      3600000      A     198.41.0.4
A.ROOT-SERVERS.NET.      3600000      AAAA  2001:503:BA3E::2:30
;
; FORMERLY NS1.ISI.EDU
;
.                        3600000      NS    B.ROOT-SERVERS.NET.
B.ROOT-SERVERS.NET.      3600000      A     192.228.79.201
;
; FORMERLY C.PSI.NET
;
.                        3600000      NS    C.ROOT-SERVERS.NET.
C.ROOT-SERVERS.NET.      3600000      A     192.33.4.12
;
; FORMERLY TERP.UMD.EDU
;
.                        3600000      NS    D.ROOT-SERVERS.NET.
D.ROOT-SERVERS.NET.      3600000      A     128.8.10.90
;
; FORMERLY NS.NASA.GOV
;
.                        3600000      NS    E.ROOT-SERVERS.NET.
E.ROOT-SERVERS.NET.      3600000      A     192.203.230.10
;
; FORMERLY NS.ISC.ORG
;
.                        3600000      NS    F.ROOT-SERVERS.NET.
F.ROOT-SERVERS.NET.      3600000      A     192.5.5.241
F.ROOT-SERVERS.NET.      3600000      AAAA  2001:500:2F::F
;
; FORMERLY NS.NIC.DDN.MIL
;
.                        3600000      NS    G.ROOT-SERVERS.NET.
G.ROOT-SERVERS.NET.      3600000      A     192.112.36.4
;
; FORMERLY AOS.ARL.ARMY.MIL
;
.                        3600000      NS    H.ROOT-SERVERS.NET.
H.ROOT-SERVERS.NET.      3600000      A     128.63.2.53
H.ROOT-SERVERS.NET.      3600000      AAAA  2001:500:1::803F:235
;
; FORMERLY NIC.NORDU.NET
;
.                        3600000      NS    I.ROOT-SERVERS.NET.
I.ROOT-SERVERS.NET.      3600000      A     192.36.148.17
;
; OPERATED BY VERISIGN, INC.
;
.                        3600000      NS    J.ROOT-SERVERS.NET.
J.ROOT-SERVERS.NET.      3600000      A     192.58.128.30
J.ROOT-SERVERS.NET.      3600000      AAAA  2001:503:C27::2:30
;
; OPERATED BY RIPE NCC
;
.                        3600000      NS    K.ROOT-SERVERS.NET.
K.ROOT-SERVERS.NET.      3600000      A     193.0.14.129
K.ROOT-SERVERS.NET.      3600000      AAAA  2001:7FD::1
;
; OPERATED BY ICANN
;
.                        3600000      NS    L.ROOT-SERVERS.NET.
L.ROOT-SERVERS.NET.      3600000      A     199.7.83.42
L.ROOT-SERVERS.NET.      3600000      AAAA  2001:500:3::42
;
; OPERATED BY WIDE
;
.                        3600000      NS    M.ROOT-SERVERS.NET.
M.ROOT-SERVERS.NET.      3600000      A     202.12.27.33
M.ROOT-SERVERS.NET.      3600000      AAAA  2001:DC3::35
; End of File

###################### named.root############################
新建master文件夹 并在里面新建cnc 和 telecom 文件夹
进入masrer文件夹 用notepad 新建cnc.def 和telecom.def
###################### cnc.def############################
zone “dnsany.com” {
type master;
file “C:\WINDOWS\system32\dns\etc\master\cnc\dnsany.com.txt”;
};
###################### cnc.def############################
###################### telecom.def############################
zone “dnsany.com” {
type master;
file “C:\WINDOWS\system32\dns\etc\master\telecom\dnsany.com.txt”;
};

 

###################### telecom.def############################
分别进入cnc和telecom文件夹建立dnsany.com.txt文件
#########################cnc\dnsany.com.txt##############################
$TTL 3600
$ORIGIN dnsany.com.
@ IN SOA ns.hhmap.com. root. hhmap.com.(
2006111520 ;Serial
3600 ; Refresh ( seconds )
900 ; Retry ( seconds )
68400 ; Expire ( seconds )
15 );Minimum TTL for Zone ( seconds )
;
@ IN NS ns.hhmap.com.
@ IN A 220.248.236.152
www IN A 220.248.236.152
* IN A 220.248.236.152
;
;end
#########################cnc\dnsany.com.txt##############################
#########################telecom\dnsany.com.txt##############################
$TTL 3600
$ORIGIN dnsany.com.
@ IN SOA ns.hhmap.com. root. hhmap.com.(
2006111520 ;Serial
3600 ; Refresh ( seconds )
900 ; Retry ( seconds )
68400 ; Expire ( seconds )
15 );Minimum TTL for Zone ( seconds )
;
@ IN NS ns.hhmap.com.
@ IN A 60.171.45.152
www IN A 60.171.45.152
* IN A 60.171.45.152
;
;end
#########################telecom\dnsany.com.txt##############################

全部配置完成后,可以进入Windows 服务管理器,找到那个叫 ISC Bind的服务,而后属性更改登陆为本地系统用户选择启动,如果出现错误,请打开你的事件查看器,到应用程序部分看看什么错误。如果没有问题,则已经运行起来了。
3.测试
运行CMD,而后输入: nslookup
C:\>nslookup
Default Server:  ns.ahhfptt.net.cn
Address:  202.102.192.68
> server 60.171.45.152
Default Server:  [60.171.45.152]
Address:  60.171.45.152
> set type=any
> dnsany.com
Server:  [60.171.45.152]
Address:  60.171.45.152
dnsany.com
        primary name server = ns.hhmap.com
        responsible mail addr = root.592365.com
        serial  = 2005121213
        refresh = 3600 (1 hour)
        retry   = 900 (15 mins)
        expire  = 68400 (19 hours)
        default TTL = 15 (15 secs)
dnsany.com      nameserver = ns.hhmap.com
dnsany.com      internet address = 60.171.45.152
说明DNS服务器解析正常!
说明下dnsany.com.txt

#########################cnc\dnsany.com.txt##############################
$TTL 3600
$ORIGIN dnsany.com.
@ IN SOA ns.hhmap.com. root.hhmap.com.(
2006111520 ;Serial
3600 ; Refresh ( seconds )
900 ; Retry ( seconds )
68400 ; Expire ( seconds )
15 );Minimum TTL for Zone ( seconds )
;
@ IN NS ns.hhmap.com.
@ IN MX 0 mail.
@ IN A 220.248.236.152
www IN A 220.248.236.152
webserver IN CNAME www
mail IN A 220.248.236.152
* IN A 220.248.236.152
;
;end
#########################cnc\dnsany.com.txt##############################

第一行是TTL设定,生存时间记录字段。它以秒为单位定义该资源记录中的信息存放在高速缓存中的时间长度。这里定义为604800秒,也就是1周.
第二行是$ORIGIN设定,说明下面的记录出自何处.请您加倍留意最后的一个小小数点”.”
然后,第三行,是一个 SOA 记录的设定,在这里我们看到一个特殊字符 @ ,它就是 ORIGIN 的意思,也就是刚刚所定义的$ ORIGIN dnsany.com. 的内容,您可以写成 dnsany.com. 也可以用 @ 来代替。
假如这个文件前面没有定义 $ ORIGIN 的话, 那這个 @ 的值就以 named.conf 里的 zone .
接着 SOA 后面,指定了这个区域的授权主机和管理者的信箱,这里分别是”hhmap.com.” 和”root.hhmap.com.”。我们平时使用的信箱通常是[email=]“user@host
[/email]“这样的格式,但因为@在 DNS 记录中是个保留字符,所以在 SOA 中就用”.”来代替了@。目前这个信箱是 “root@hhmap.com

.”。
接下来的 SOA 设置,是被括在”( )”之间的 5 组数字,主要作为和 slave 服务器同步 DNS 资料所使用的资料:
Serial:其格式通常会是”年月日+修改次序”(但也不一定如此,您自己能够记得就行)。当 slave 要进行资料同步的时候,会比较这个号码。如果发现在这里的号码比它那边的数值”大”,就进行更新,否则忽略。不过设 serial 有一个地方您要留意:不能超过 10 位数字!
Refresh:这里是是告诉 slave 要隔多久要进行资料同步(是否同步要看 Serial 的比较结果)。
Retry:如果 slave 在进行更新失败后,要隔多久再进行重试。
Expire:这是记录逾期时间:当 slave 一直未能成功与 master 取得联系,那到这里就放弃 retry,同时这里的资料也将标识为过期(
expired )。
Minimum:这是最小默认 TTL 值,如果您在前面没有用”$TTL”来定义,就会以此值为准。
请注意:SOA 记录中这对 ” ( ) “符号之第一个 ” (“括号一定要和 SOA 写在同一行,而不能用 Enter 断行到下一行去,而且其左边最好有一个空格键或 tab 建。而最后一个 ” )”括号也不能写在注解符号 ” ;”的右边。 置 DNS 的 RR 记录档,其格式要求非常严格,我们丝毫不能掉以轻心。比方说:如果句子不是以空格键、Tab 键、 或注解符号 ( ; )开头,也不在 SOA 的 ” ( ) “之内, 则表示要定义一个”新记录项 (Entry) “;如果句子是以空格键或 tab 键开始的话,其设置被视为上一个”记录项”的内容。所以,如果您要为”同一个记录项”定义多个记录设置,而不想重复打字,您倒可以偷懒:在接着它的后面几行用空白或 Tab 来缩排就可以了。
NS表明负责dnsany.com.这个域的Name Server是ns.hhmap.com这台主机
MX记录标明发往mail域的邮件由mail.dnsany.com这台服务器接收
A记录标明了IP地址和域名之间的对应关系

—————————————————————————————————————–

BIND
配置文件详解(二)

 
6.options
语句

options
语句的定义和使用:
options语句用来设置可以被整个BIND使用的全局选项。这个语句在每个配置文件中只有
一处。如果出现多个options语句,则第一个options的配置有效,并且会产生一个警告信息。
如果没有options语句,则每个选项使用缺省值。
options {
[ version version_string; ]
[ directory path_name; ]
[ named-xfer path_name; ]
[ tkey-domain domainname; ]
[ tkey-dhkey key_name key_tag; ]
[ dump-file path_name; ]
[ memstatistics-file path_name; ]
[ pid-file path_name; ]
[ statistics-file path_name; ]
[ zone-statistics yes_or_no; ]
[ auth-nxdomain yes_or_no; ]
[ deallocate-on-exit yes_or_no; ]
[ dialup dialup_option; ]
[ fake-iquery yes_or_no; ]
[ fetch-glue yes_or_no; ]
[ has-old-clients yes_or_no; ]
[ host-statistics yes_or_no; ]
[ minimal-responses yes_or_no; ]
[ multiple-cnames yes_or_no; ]
[ notify yes_or_no | explicit; ]
[ recursion yes_or_no; ]
[ rfc2308-type1 yes_or_no; ]
[ use-id-pool yes_or_no; ]
[ maintain-ixfr-base yes_or_no; ]
[ forward ( only | first ); ]
[ forwarders { ip_addr [port ip_port] ; [ ip_addr [port ip_port] ; … ] }; ]
[ check-names ( master | slave | response )( warn | fail | ignore ); ]
[ allow-notify { address_match_list }; ]
[ allow-query { address_match_list }; ]
[ allow-transfer { address_match_list }; ]
[ allow-recursion { address_match_list }; ]
[ allow-v6-synthesis { address_match_list }; ]
[ blackhole { address_match_list }; ]
[ listen-on [ port ip_port ] { address_match_list }; ]
[ listen-on-v6 [ port ip_port ] { address_match_list }; ]
[ query-source [ address ( ip_addr | * ) ] [ port ( ip_port | * ) ]; ]
[ max-transfer-time-in number; ]
[ max-transfer-time-out number; ]
[ max-transfer-idle-in number; ]
[ max-transfer-idle-out number; ]
[ tcp-clients number; ]
[ recursive-clients number; ]
[ serial-query-rate number; ]
[ serial-queries number; ]
[ transfer-format ( one-answer | many-answers ); ]
[ transfers-in number; ]
[ transfers-out number; ]
[ transfers-per-ns number; ]
[ transfer-source (ip4_addr | *) [port ip_port] ; ]
[ transfer-source-v6 (ip6_addr | *) [port ip_port] ; ]
[ notify-source (ip4_addr | *) [port ip_port] ; ]
[ notify-source-v6 (ip6_addr | *) [port ip_port] ; ]
[ alsonotify { ip_addr [port ip_port] ; [ ip_addr [port ip_port] ; … ] }; ]
[ max-ixfr-log-size number; ]
[ coresize size_spec ; ]
[ datasize size_spec ; ]
[ files size_spec ; ]
[ stacksize size_spec ; ]
[ cleaning-interval number; ]
[ heartbeat-interval number; ]
[ interface-interval number; ]
[ statistics-interval number; ]
[ topology { address_match_list }];
[ sortlist { address_match_list }];
[ rrset-order { order_spec ; [ order_spec ; ... ] } };
[ lame-ttl number; ]
[ max-ncache-ttl number; ]
[ max-cache-ttl number; ]
[ sig-validity-interval number ; ]
[ min-roots number; ]
[ use-ixfr yes_or_no ; ]
[ provide-ixfr yes_or_no; ]
[ request-ixfr yes_or_no; ]
[ treat-cr-as-space yes_or_no ; ]
[ min-refresh-time number ; ]
[ max-refresh-time number ; ]
[ min-retry-time number ; ]
[ max-retry-time number ; ]
[ port ip_port; ]
[ additional-from-auth yes_or_no ; ]
[ additional-from-cache yes_or_no ; ]
[ random-device path_name ; ]
[ max-cache-size size_spec ; ]
[ match-mapped-addresses yes_or_no; ]
};
 
version
回答针对服务器版本的请求时的内容。缺省返回的是服务器的真实版本。
directory
服务器的工作目录。配置文件中所有使用的相对路径,指的都是在这里配置的目录下。大多数服务器的输出文件(如named.run)都缺省生成在这个目录下。如果没有设定目录,工作目录缺省设置为服务器启动时的目录‘.’。指定的目录应该是一个绝对路径。
named-xfer
这个选项已经被废弃了。它在BIND8 中,它用来给named-xfer程序设定路径名。在BIND9中,不需要单独的named-xfer程序;它的功能已经内置在域名服务器中。
tkey-domain
这个域名将会附带在由TKEY 生成的所有共享密匙名字的后面。当用户请求进行TKEY交换时,它会为密匙设定或不设定所要求的名称。如果设置了tkey_domain,共享密匙的名字将会是”client specified part”(用户设定的部分)+ “tkey-domain”。否则,共享密匙的名字将是”random hex digits”(随机的16 进制数)+ “tkey-domain”。在大多数情况下,domainname应该是服务器的域名。
tkey-dhkey
针对使用Diffie-Hellman 的TKEY模式的用户,服务器用来生成共享密匙的Diffie-Hellman 密匙。服务器必须可以从工作目录中调入公共和私人密匙。大多数情况下,密匙的名称应该是服务器的主机名。
dump-file
当执行rndc dumpdb命令时,服务器存放数据库文件的路径名。如果没有指定,缺省名字是named_dump.db。
memstatistics-file
服务器输出的内存使用统计文件的路径名。如果没有指定,默认值为named.memstats。
注意:还没有在BIND9中实现!
pid-file
进程ID文件的路径名。如果没有指定,默认为/var/run/named.pid。pid-file是给那些需要向运行着的服务器发送信号的程序使用的。
statistics-file
当使用rndc stats命令的时候,服务器会将统计信息追加到的文件路径名。如果没有指定,默认为named.stats在服务器程序的当前目录中。
port
服务器用来接收和发送DNS协议数据的UDP/TCP端口号。默认为53。这个选项主要用于服务器的检测;因为如果不使用53端口的话,服务器将不能与其它的DNS进行通讯。
random-device
服务器使用的entropy源:entropy主要用于DNSSEC操作,如TKEY的数据交换和加密域的动态更新。此选项指定了entropy将会从哪个设备(或文件)中读取信息。如果它是一个文件,则当文件耗尽后,需要entropy的操作将会失败。如果没有指定,默认值是/dev/random(或等价的),如果它存在,否则就是没有。random-device选项是在服务器启动时,初始化配置时起作用的,在以后的重启时则被忽略。
 
A.Boolean
选项

auth-nxdomain
如果是yes,那么AA位将一直设置成NXDOMAIN响应,甚至在服务器不是授权服务器的情况下都是这样的。默认值是no;这与BIND8不同。如果用户使用的是非常老版本的DNS软件,则有必要把它设置成yes。
deallocate-on-exit
此选项在BIND8中用于检查出口处内存泄露。BIND9忽略此选项,并始终进行检查。
dialup
如果是yes
,那么服务器将会像在通过一条按需拨号的链路进行域传送一样,对待所有的域(按需拨号就是在服务器有流量的时候,链路才连通)。根据域类型的不同它有不同的作用,并将集中域的维护操作,这样所有有关的操作都会集中在一段很短的时间内完成,每个heartbeat-interval一次,一般是在一次调用之中完成。它也禁止一些正常的域维护的流量。默认值是no。
dialup选项也可以定义在view和zone语句中,这样就会代替了全局设置中dialup的选项。
如果域是一个主域,服务器就会对所有辅域发送NOTIFY请求。这将激活辅域名服务器中的对域的序列号的检验。这样当建立一个连接时,辅域名服务器才能确认这个域的传输合法性。
如果这个域是一个辅域或是末梢域(stub zone),那么服务器将会禁止通常的“zone
up to date”(refresh)请求,为了能发送NOTIFY请求,只有在heartbeat-interval 过期
之后才执行。
通过下列的设置,可以实现更好的控制。
1、notify 只发送NOTIFY信息。
2、notify-passive 发送NOTIFY信息,并禁止普通的刷新(refresh)请求。
3、refresh 禁止普通的刷新处理,当heartbeat-interval 过期时才发送刷新请求。
4、passive 只用于关闭普通的刷新处理。
fake-iquery
在BIND8中,此选项用来模拟陈旧的DNS查询类型IQUERY。BIND9不再进行IQUERY模拟。
fetch-glue
这个选项以后不再使用。
has-old-clients
这个选项在BIND8中执行有问题,BIND9则忽略了这个选项。为了达到has-old-clients yes的预期效果,可以设定两个独立选项auth-nxdomain yes和rfc2308-type1 no来代替。
host-statistics
在BIND8中,它可以保留每台和域名服务器交互的主机统计信息。BIND9中不支持。
maintain-ixfr-base
此选项不再使用了。在BIND8用于判定是否保存了增量域传输的处理日志。BIND9任何可能的时候都会保存传输日志。如果需要禁止流出的增量域传输,可以使用provide-ixfr no。
minimal-responses
如果是yes,当产生响应的时候,服务器将只会按照需要将记录添加到authority和additional的数据部分。(例如,delegations,negative responses)。这样会改善服务器的性能。默认值为no。
multiple-cnames
这个选项在BIND8中使用,允许一个域名承认多条CNAME记录(与DNS标准相违
背)。BIND9.2在主hosts文件和动态更新中都严格强制执行CNAME规则。
notify
如果是yes(默认),当一个授权的服务器修改了一个域后,DNS NOTIFY信息被发送出去。此信息将会发给列在域NS记录上的服务器(除了由SOA MNAME标示的主域名服务器)和任何列在also-notify选项中的服务器。
如果是explicit,则notify将只发给列在also-notify中的服务器。如果是no,就不会发出任何报文。
notify选项也可能设定在zone语句中,这样它就替代了options中的notify 语句。如果notify会使得辅域名服务器崩溃,就需要将此选项关闭。
recursion
如果是yes,并且一个DNS询问要求递归,那么服务器将会做所有能够回答查询请求的工作。如果recursion是off的,并且服务器不知道答案,它将会返回一个推荐(referral)响应。默认值是yes。注意把recursion设为no,不会阻止用户从服务器的缓存中得到数据,它仅仅阻止新数据作为查询的结果被缓存。服务器的内部操作还是可以影响本地的缓存内容,如NOTIFY地址查询。
rfc2308-type1
设置成yes 将会使得服务器发送NS 记录和关于negative answer 的SOA记录。默认值为no。
注:BIND9 中还不支持。
use-id-pool
此选项已经不再使用。BIND9 始终都是从池中分配请求ID的。
zone-statistics
如果是yes,缺省情况下,服务器将会收集在服务器所有域的统计数据。这些统计数据可以通过使用rndc stats来访问,rndc stats命令可以将这些信息转储到statistics-file定义的文件中去。
use-ixfr
这个选项不再使用。如果需要针对一个或多个特殊的服务器关闭IXFR,可以参考provide-ixfr中的内容。
provide-ixfr
参阅中关于provide-ixfr的陈述。
request-ixfr
参阅关于request-ixfr的陈述。
treat-cr-as-space
这个选项应用于BIND8中,使服务器正确处理回车(”\r”)字符,就象其它的空格或tab字符一样。这样可以便于在unix系统上加载由NT或DOS系统生成的域文件。在BIND9中,UNIX”的\n”和DOS 的”\r\n”都可以正确处理为换新行,这个选项就被忽略了。
additional-from-auth
additional-from-cache
当回答具有additional数据的请求,或者当在CNAME 和DNAME串的后面时,这些选项控制一个权威服务器的操作。
当这两个选项都被设成yes(默认状态),并且查询的是授权的数据(这个域就配置在本地服务器中)时,回答中的additional部分的数据将使用来自于其它授权域和cache。
在许多情况下这是不需要的,比如在缓存内容的正确性受到怀疑的情况下,或是在某些辅域可能被非法修改的服务器。还有,避免对这些additional数据的搜索将会加速服务器运转。
例如,如果一个查询需要主机foo.example.com的MX记录,找到的记录是”MX 10
mail.example.net”,如果知道的话, mail.example.net的地址记录(A,A6 和AAAA)也会被
提供出来。把选项设置为no,则禁止了这种操作。
这些选项用于授权的服务器,或者是授权的视图中。把它们设成no,但没有同时设置recursion no,将会使得服务器忽略这些选项,并记录一个警告日志。
设定additional-from-cache为no实际上针对additional信息的查询和正在响应的查询,都禁止了缓存的使用。这常常使用在一台授权的服务器中,因为在这里缓存数据的正确性非常重要。
当一台域名服务器不提供递归查询时,并且查询的名称并不在本地域中,一般会对根服务器或者其他已知的上级服务器回答”upwards referral(向上推荐)”。既然在向上查询中的数据来自于缓存,那么当additional-from-cache被设定为no时,服务器就不能提供向上推荐。相反,它会使用REFUSED(拒绝)回答这些查询。因为向上推荐不是在用户解析过程中需要的,所以就不会出任何问题。
match-mapped-addresses
如果是yes,那么一个ipv4映射成的ipv6地址就会匹配任何地址匹配表中能匹配于对应的ipv4 地址的记录。打开这个选项,对于运行了ipv6的linux系统有时非常有用,这样通过地址映射,就可以使得ipv4的TCP连接(如域传送)实现在Ipv6的soket上,因为地址匹配列表是给Ipv4设计的。
 
B.
转发

转发功能可以用来在一些服务器上产生一个大的缓存,从而减少到外部服务器链路上的流量。它可以使用在和internet没有直接连接的内部域名服务器上,用来提供对外部域名的查询。只有当服务器是非授权的,并且缓存中没有相关记录时,才会进行转发。
forward
此选项只有当forwarders列表中有内容的时候才有意义。当值是First,默认情况下,使服务器先查询设置的forwarders,如果它没有得到回答,服务器就会自己寻找答案。如果设定的是only,服务器就只会把请求转发到其它服务器上去。
forwarders
设定转发使用的ip地址。默认的列表是空的(不转发)。转发也可以设置在每个域上,这样全局选项中的转发设置就不会起作用了。用户可以将不同的域转发到服务器上,或者对不同的域可以实现forward only或first的不同方式,也可以根本就不转发。
 
C.
访问控制

可以根据用户请求使用的IP地址进行限制。
allow-notify
设定哪个主机上的辅域(不包括主域)已经进行了修改。allow-notify也可以在zone语句中设定,这样全局options中的allow-notify选项在这里就不起作用了。但它只对辅域有效。如果没有设定,默认的是只从主域发送notify信息。
allow-query
设定哪个主机可以进行普通的查询。allow-query也能在zone语句中设定,这样全局options中的allow-query选项在这里就不起作用了。默认的是允许所有主机进行查询。
allow-recursion
设定哪台主机可以进行递归查询。如果没有设定,缺省是允许所有主机进行递归查询。注意禁止一台主机的递归查询,并不能阻止这台主机查询已经存在于服务器缓存中的数据。
allow-v6-synthesis
设定哪台主机能接收对ipv6的响应。
allow-transfer
设定哪台主机允许和本地服务器进行域传输。allow-transfer也可以设置在zone语句中,这样全局options中的allow-transfer选项在这里就不起作用了。如果没有设定,默认值是允许和所有主机进行域传输。
blackhole
设定一个地址列表,服务器将不会接收来自这个列表的查询请求,或者解析这些地址。从这些地址来的查询将得不到响应。默认值是none。
 
D.
接口

接口和端口(服务器回答来自于此的询问)可以使用listen-on选项来设定。listen-on使用可选的端口和一个地址匹配列表(address_match_list)。服务器将会监听所有匹配地址列表
中所允许的端口。如果没有设定端口,就使用默认的53。
允许使用多个listen-on语句。例如:
listen-on

{ 5.6.7.8; };
listen-on port 1234 { !1.2.3.4; 1.2/16; };
将在5.6.7.8 的ip地址上打开53端口,在除了1.2.3.4的1.2 网段上打开1234 端口。
如果没有设定listen-on,服务器将在所有接口上监听端口53。
listen-on-v6选项用来设定监听进入服务器的ipv6请求的端口。
服务器并不象在ipv4中那样对每个IPV6端口地址绑定一个独立的socket。相反,它一直监听ipv6通配的地址。这样,对于listen-on-v6语句唯一的address_match_list的参数就是:
{ any; }和{ none;}
多个listen-on-v6选项可以用来监听多个端口:
listen-on-v6 port 53 { any; };
listen-on-v6 port 1234 { any; };
要使服务器不监听任何ipv6地址,使用:
listen-on-v6 { none; };
如果没有设定listen-on-v6语句,服务器将不会监听任何ipv6地址。
 
E.
查询地址

如果服务器查不到要解析的地址,它将会查询其它域名服务器。query-source

可以用来设定这类请求所使用的地址和端口。
对于使用ipv6发送的查询,有一个独立的query-source-v6选项。如果address是*或者被省略了,则将会使用一个通配的IP地址
(INADDR ANY)。如果port是*或者被省略了,则将会使用一个随机的大于1024的端口。
默认为:
query-source address * port *;
query-source-v6 address * port *;
注:
query-source
选项中设置的地址是同时用于
UDP

TCP
两种请求的,但是
port
仅仅用

UDP
请求。
TCP
请求使用的是随机的大于
1024
的端口。
 
 
F.
域传输

BIND有适当的机制来简化域传输,并限定系统传输的负载量。下列设定应用于域传输:
also-notify
定义一个用于全局的域名服务器IP地址列表。无论何时,当一个新的域文件被调入系统,域名服务器都会向这些地址,还有这些域中的NS记录发送NOTIFY信息。这有助于更新的域文件尽快在相关的域名服务器上收敛同步。如果一个also-notify列表配置在一个zone语句中,全局options中的also-notify语句就会在这里失效。当一个zone-notify语句被设定为no,系统就不会向在全局中also-notify列表中的IP地址发送NOTIFY消息。缺省状态为空表(没有全局通知列表)。
max-transfer-time-in
比设定时间更长的进入的域传输将会被终止。默认值是120分钟(2小时)。
max-transfer-idle-in
在设定时间下没有任何进展的进入域传输将会被终止。默认为60分钟(1小时)。
max-transfer-time-out
运行时间比设定的时间长的发出的域传输将会被终止。默认为120分钟(2小时).
max-transfer-idle-out
在设定时间下没有任何进展的发出的域传输将会被终止。默认为60分钟(1小时)。
serial-query-rate
辅域名服务器将会定时查询主域名服务器,来确定域的串号是否改变。每个查询将会占用一些辅域名服务器网络带宽。为限制占用的带宽,BIND9可以限制每个查询发送的频率。serial-query-rate的值是一个整数,就是每秒能发送的最大查询数。默认值为20。
serial-queries
在BIND8中, serial-queries选项设定了在任何时候允许达到的最大的并发查询数。BIND9不限制串号查询的数量并忽略了serial-queries选项。它会使用serial-query-rate选项来限制查询的频率。
transfer-format
域传输可以用两种不同格式,one-answer和many-answer。transfer-format选项使用在主域名服务器上,用来确定发送哪种格式。one-answer在每个资源记录传输中使用一个
DNS消息。many-answer则将尽可能多的资源记录集中在一个消息中。many-answer是
更加有效的,但只有相对比较新的辅域名服务器才支持它,如BIND9、BIND8.x 和打了补丁的BIND4.9.5。默认的设置为many-answer。使用server语句中的相关选项,可以替代全局选项中的transfer-format设置。
transfers-in
可以同时运行的进入的域传输的最大值。默认值为10。增加transfers-in的值,可以加速辅域的收敛速度,但也可能增加本地系统的负载。
transfers-out
可以同时运行的发出的传输的最大值。超过限定的域传输请求将会被拒绝。默认值为10。
transfers-per-ns
从一台指定的远程域名服务器,同时进行的进入的域传输的最大值。默认值2。增加
transfers-per-ns的值,会加速辅域的收敛速度,但也可能增加远程系统的负载。使用
server语句中的transfer短语可以替代全局选项中的transfers-per-ns。
transfer-source
transfer-source决定在从外部域名服务器上得到域传送数据时,选哪个本地的ip地址使用在IPV4的TCP连接中。它可以选定IPV4的源地址,和可选的UDP端口,用于更新的查询和转发的动态更新。不过不做设置,它会缺省挑选一个系统中的地址(常常是最靠近远程终端服务器的接口地址)。但这个地址必须已经配置在远程终端的allow-tranfer选项中,才能进行域传送。此语句为所有的域设定了transfer-source,但如果view或zone中也使用了transfer-source语句,则全局选项中的配置就在这里失效了。
transfer-source-v6
和transfer-source一样,只是域传输是通过IPV6执行的。
notify-source
notify-source确定使用哪些本地的源地址和可选的UDP端口,用于发送NOTIFY消息。这个地址必须在辅域名服务器的master域或在allow-notify中设置。它会为所有域设定
notify-source, 但如果view或zone中也使用了notify-source语句,则全局选项中的配置就在这里失效了。
notify-source-v6
与notify-source类似,但应用于ipv6地址的notify报文的发送。
 
G.
操作系统资源限制

可以限制服务器对许多系统资源的使用。这些就是通过调节资源限制的数值来完成的。例如,1G可以代替1073741824,限定一个十亿字节的限制。Unlimited 要求不限制使用,或者最大可用量。Default 将会使用服务器启动时的缺省值。
下列选项设定了域名服务器进程的操作系统资源占用限制。一些操作系统可能不支持一些
或所有的限制。在这样的系统中,当使用不被支持的限制时,会产生一个告警。
coresize
core dump文件的最大值尺寸。默认值为default
datasize
服务器可以使用的最大数据内存量。默认值为default。这是一个在服务器系统内存中
已经设置了的参数。如果服务器要超过这个限制的内存量,则会失败,这将使服务器不能
提供DNS服务。所以,这个选项作为一种限制服务器所使用的内存量的方式就不太有效,但是它能够将操作系统设置的太小的缺省数据尺寸增大。如果要限制服务器使用的内存量,可以使用max-cache-size和recursive-clients选项。
files
服务器可以同时打开的最大文件数。默认是unlimited。
stacksize
服务器可以使用最大的堆栈内存量。默认值为default。
 
H.
服务器资源限制

下列选项设定了服务器资源使用限制,这是由域名服务内部做的而不是操作系统设定的。
max-ixfr-log-size
此选项比较老;它由BIND8兼容接受或者忽略。
recursive-clients
服务器同时为用户执行的递归查询的最大数量。默认值1000,因为每个递归用户使用许多位内存,一般为20KB,主机上的recursive-clients选项值必须根据实际内存大小调整。
tcp-clients
服务器同时接受的TCP连接的最大数量,默认值100。
max-cache-size
服务器缓冲使用的最大内存量,用比特表示。但在缓存数据的量达到这个界限,服务器将会使记录提早过期这样限制就不会被突破。在多视图的服务器中,限制分别使用于每个视图的缓存。默认值没有限制,意味着只有当总的限制被突破的时候记录才会被缓存清除。
 
 
I.
周期性任务间隔

cleaning-interval
服务器将在cleaning-interval的每一时间中从缓存中清除过期的资源记录。默认为60分钟,如果设置为0,就不会有周期性清理。
heartbeat-interval
服务器将会为所有标记dialup的域运行维护任务,无论它的间隔在何时到期。默认为60分钟,合理值不超过1天(1440 分钟)。如果设定为0,不会为这些域产生域维护。
interface-interval
服务器将在每个interface-interval时间扫描网络接口表。默认为60分钟。如果设置为0,仅当配置文件被加载时才会进行接口扫描。在扫描之后,所有新接口上的监听器将会被打开(listen-on配置使用的接口)。关闭接口上的监听器将会被清除。
statistics-interval
域名服务器统计将会在每个statistics-interval时刻被记入日志。默认值60分钟,如果设为0,就没有统计数据记入日志。
注意:BIND9 不支持
 
J.
拓扑

当服务器从一个域名服务器列表中选择一个域名服务器查询时,这些域名服务器是没有什么不同的,但是服务器会先选择在拓扑结构上距离自己最近的服务器去做解析。拓扑语句使用一个地址匹配列表并且以一个特殊方式解释它。每个顶层列表元素被赋了一段距离,非否定元素得到它们在列表中的位置的距离,匹配距离表的开头越近,它离服务器的距离就越小。否定匹配元素将会从服务器分配最大距离;没有匹配的地址将会得到一个比任何非否定表元素都远的并且比任何否定元素近的距离。例如:
topology
{
10/8;
!1.2.3/24;
{ 1.2/16; 3/8; };
};
最优先网段10的服务器,然后是在网络1.2.0.0(网络掩码255.255.0.0)和3.0.0.0(网络掩
码255.0.0.0);再就是没列出来的,但是没有否定的网段。否定的网段1.2.3 的主机(网络掩
码255.255.255.0)。
默认拓扑为:
topology { localhost; localnets; };
注意:BIND9不支持拓扑选项。
 
K. sortlist
语句
 

对一个DNS询问的响应包括形成一个资源记录集(RR集)的多资源记录(RRs)。名称服务器将会以不确定的顺序返回在RRset中的RRs(参见rrset-order语句)。用户端的解答器会重新适当的排列,也就是说,使用任何在本地网上的地址优先于其他的地址。尽管如此,不是所有的解答器可以做到或者正确配置。当用户使用一个本地服务器的时候,服务器可以基于用户地址进行分类。这只要求配置名称服务器,而不是所有用户端。
sortlist语句(如下)使用一个地址匹配表甚至比拓扑语句还要特殊的解释它。每个在sortlist 的顶层语句必须自己就是一个清楚的拥有一个或两个元素的地址匹配表。每个顶级表的第一个元素(可能是一个IP地址,一个IP前缀,一个ACL名称或者一个地址匹配表)与查询源地址进行匹配检查直到找到匹配的地址。
一旦查询的源地址被匹配,如果顶级语句只包括一个元素的话,真正的匹配于源地址的原始元素就被用来选择地址,对应的转移到了响应的开始。如果语句是两个元素的表,那么第二个元素遵照拓扑语句中地址匹配表的方式进行处理。每个顶级元素被赋予一个距离和与响应的开头距离最近的地址。
在下列例子中,任何来自于任何主机地址的查询将会得到本地网上第一首选地址的响应。下一个首选地址在网段192.168.1/24上,既可以在192.168.2/24或192.168.3/24网段之后。从一台在192.168.1/24网段上的主机收到的查询将会优先本网段和192.168.2/24和192.168.3/24网。而来自192.168.4/24或192.168.5/24上主机的查询将只优先直连的网段。
sortlist {
{ localhost; //IF 主机名
{ localnets;
192.168.1/24; //THEN 在下列网中最适合
{ 192.168.2/24; 192.168.3/24; }; }; }; //IF 在C类192.168.1
{ 192.168.1/24; //THEN 使用.1, 或.2 或.3
{ 192.168.2/24; 192.168.3/24; }; }; };
{ 192.168.2/24; //IF C类192.168.1
{ 192.168.2/24; //THEN使用2, 或.1 或.3
{ 192.168.1/24; 192.168.3/24; }; }; };
{ 192.168.3/24; //IF 在C类192.168.3
{ 192.168.1/24; 192.168.2/24; }; }; }; //THEN使用.3 或.1 或.2
};
};
下个例子将给出一个本地主机和直接连接到网上的主机的合理的状态(behavior)。它很象BIND4.9.x分类的地址状态。从本地主机发给查询的响应支持任何直接连接的网络,从其他直接连接网络上的主机发送给查询的响应优先在相同网段上的地址。对其他查询的响应没有分类。
sortlist {
{ localhost; localnets; };
{ localnets; };
};
 
 
L. RRset
排序

当多重记录在一个解答中被返回的时候,设定在响应中的记录顺序是很有用的.。
rrset-order语句允许对在多记录响应下的记录顺序的设定。参见sortlist语句。
一个order_spec定义如下:
[ class class_name ][ type type_name ][ name "domain_name"] order ordering
如果没有设定类,默认值为ANY。如果没有设定类型,默认值为ANY。如果没有设定
名称,默认值为”*”。
合法的排序值是:
fixed:记录以它们在域文件中的顺序
random:记录以随机顺序被返回
cyclic:记录以环顺序被返回
例如:
rrset-order {
class IN type A name “host.example.com” order random;
order cyclic;
};
将会使得任何处于IN类中的A类记录的响应以随机顺序返回,IN 类以”host.example.com”为后缀。其他的记录以循环记录被返回。
如果多重rrset-order语句出现,它们并不组合在一起,只适用于最后一个条。
注意:rrset-order语句不被BIND9支持,BIND9目前只支持”random-cyclic”排序,服务器随机选择RRset集中的开始点,有顺序返回在那个点开始的记录。如果需要的话围绕RRset
结尾。
 
M.
合成的
IPV6
响应

许多现存的子域解答器支持ipv6的DNS查询(定义在RFC1986 中,使用AAAA 记录进行前向查询和ip6.int域中的”nibble labels”进行反向查询)但是不支持RFC2874-style 查询(使用A6记录和在ip6.arpa 中的二进制标签)对于那些希望继续使用子域解答器而不是转到
BIND9 lightweight 解答器的人来说,BIND 9提供一种自动把RFC1886-型查询转换成
RFC2874-型查询的方法。返回合成的AAAA和PTR记录。
这个性质默认下是无效的,可以在分用户基础上添加一个allow-v6-synthesis

{ address_match_list };

子句到选项或者视图语句中。当它被激活时,递归AAAA查询使服
务器先进行A6查询,如果失败,执行AAAA查询。不管哪个成功,结果都作为一个合成的AAAA 记录返回。
类似的,在ip6.int中的递归PTR查询将会促使一个ip6.arpa查询使用二进制标签,如果失败,执行另一个在ip6.int中的查询,结果将会以在ip6.int中的合成PTR记录返回。合成记录的TTL 为0值。合成响应的DNSSEC确认当前并不被支持;也没有了AD标记。
注:allow-v6-synthesis仅为提供了递归服务的用户执行。
 
 
N.
调谐

lame-ttl
设定缓存有问题服务器指示的秒数。0使不缓存(不被推荐)。默认值600(10 分钟)。最大值1800(30 分钟)。
max-ncache-ttl
为降低网络流量和提升服务器存储否定回答的性能。max-ncache-ttl以秒为单位设定这些回答的保存时间。默认max-ncache-ttl是10800秒(3小时)。max-ncache-ttl不能超过7天,如果设成一个更大的值,则将会被自动减为7天。
max-cache-ttl
max-cache-ttl设定了服务器储存普通(肯定)答案的最大时间。默认值一周(7 天)。
min-roots
一个请求要求的最小的根服务器数量。默认为2。
注意:

不被BIND9

支持
sig-validity-interval
设定未来作为动态更新结果的自动生成的DNSSEC信号过期的天数。默认是30天。信号的初始时间无条件设为在当前时间的前一个小时,以允许一个有限的时钟偏差。
min-refresh-time
max-refresh-time
min-retry-time
max-retry-time
这些选项控制了服务器在更新一个域(询问SOA变化)或者重试失败的传输时的状态。通常域的SOA值(但是这些值是由主服务器设定的)几乎不给此级服务器管理者对它们内容的控制。
这些选项允许管理者为每域,每个视图或者全局设定一个最小或者最大更新和重试时间。这些选项对于此级和根域是有效的并且设定SOA更新和重试时间。
 
 
O.
统计文件

由BIND9产生的统计文件和由BIND8产生的类似,但不完全一样。
一个统计数据开始于行+++ Statistics Dump +++ (973798949),这里出现的数字是一个标准UNIX型的时间戳,从1970年1月1日开始以秒计。紧跟这行的是一系列行,包括一个
记数器类型,记数器值,任意的域名和任意的视图名,没有所列的视图和域的行是整个服务器的整体统计。具有域和视图的行以给定的视图和域命名(对默认的视图来说视图名缺省)。
这个统计数据以行— Statistics Dump —(973798949)结束,在这数字是和开始行的数字一样的。Success对服务器或者域做出的成功查询。定义一个成功查询是查询返回非错误响应而不是返回推荐响应。
Referral:导致推荐响应查询
Nxrrset:导致没有数据的非错误查询的响应
Nxdomain:导致NXDOMAIN 的查询数量
Recursion:使服务器运行递归以找出最后答案的查询数量
Failure:导致失败的查询数量
发表在 article | 标签为 , | windows下使用Bind9做DNS智能解析解决电信网通双线已关闭评论

网站分析常用的指标

一、网站分析的内容指标

转换率 Take Rates (Conversions Rates)
计算公式:转换率=进行了相应的动作的访问量/总访问量
指标意义:衡量网站内容对访问者的吸引程度以及网站的宣传效果
指标用法:当你在不同的地方测试新闻订阅、下载链接或注册会员,你可以使用不同的链接的名称、订阅的方式、广告的放置、付费搜索链接、付费广告(PPC)等等,看看那种方式是能够保持转换率在上升?如何增强来访者和网站内容的相关性?如果这个值上升,说明相关性增强了,反之,则是减弱。

回访者比率 Repeat Visitor Share
计算公式:回访者比率=回访者数/独立访问者数
指标意义:衡量网站内容对访问者的吸引程度和网站的实用性,你的网站是否有令人感兴趣的内容使访问者再次回到你的网站。
指标用法:基于访问时长的设定和产生报告的时间段,这个指标可能会有很大的不同。绝大多数的网站都希望访问者回访,因此都希望这个值在不断提高,如果这个值在下降,说明网站的内容或产品的质量没有加强。需要注意的是,一旦你选定了一个时长和时间段,就要使用相同的参数来产生你的报告,否则就失去比较的意义。

积极访问者比率 Heavy User Share
计算公式:积极用户比率=访问超过11页的用户/总的访问数
指标意义:衡量有多少访问者是对网站的内容高度的兴趣
指标用法:如果你的网站针对正确的目标受众并且网站使用方便,你可以看到这个指标应该是不断的上升。如果你的网站是内容型的,你可以针对不同类别的内容来区分不同的积极访问者,当然你也可以定义20页以上的才算是积极的访问者。

忠实访问者比率 Committed Visitor Share
计算公式:访问时间在19分钟以上的用户数/总用户数
指标意义:和上一个指标的意义相同,只是使用停留的时间取代浏览页数,取决于网站的目标,你可以使用两个中的一个或结合使用。
指标用法:访问者时长这个指标有很大的争议,这个指标应结合其它的指标一起使用,例如转换率,但总体来说,较长的访问时长意味着用户喜欢呆在你的网站,高的忠实访问率当然是较好的。同样的,访问时长也可以根据不同的需要自行设定。

忠实访问者指数 Committed Visitor Index
计算公式:忠实访问者指数=大于19分钟的访问页数/大于19分钟的访问者数
指标意义:指的是每个长时间访问者的平均访问页数,这是一个重要的指标,它结合了页数和时间。
指标用法:如果这个指数较低,那意味着有较长的访问时间但是较低的访问页面(也许访问者正好离开吃饭去了)。通常都希望看到这个指数有较高的值,如果你修改了网站,增加了网站的功能和资料,吸引更多的忠实访问者留在网站并浏览内容,这个指数就会上升。

忠实访问者量 Committed Visitor Volume
计算公式:忠实访问者量=大于19分钟的访问页数/总的访问页数
指标意义:长时间的访问者所访问的页面占所有访问页面数的量
指标用法:对于一个靠广告驱动的网站,这个指标尤其值得注意,因为它代表了总体的页面访问质量。如果你有10000的访问页数却仅有1%的忠实访问者率,这意味着你可能吸引了错误的访问者,这些访问者没有啥价值,他们仅仅看一眼你的网页就离开了。这是你应该考虑是否广告的词语产生了误解

访问者参与指数 Visitor Engagement Index
计算公式:访问者参与指数=总访问数/独立访问者数
指标意义:这个指标是每个访问者的平均会话(session),代表着部分访问者的多次访问的趋势。
指标用法:与回访者比率不同,这个指标代表着回访者的强烈度,如果有一个非常正确的目标受众不断的回访网站,这个指数将大大高于1;如果没有回访者,指数将趋近于1,意味着每一个访问者都有一个新的会话。这个指数的高低取决于网站的目标,大部分的内容型和商业性的网站都希望每个访问者在每周/每月有多个会话(session);客户服务尤其是投诉之类的页面或网站则希望这个指数尽可能地接近于1。

回弹率(所有页面)Reject Rate/Bounce Rate
计算公式:回弹率(所有页面)=单页面访问数/总访问数
指标意义:代表着访问者看到的仅有的一页的比率
指标意义:这个指标对于最高的进入页面有很重要的意义,因为流量就是从这些页面产生的,当你对网站的导航或布局设计进行调整时尤其要注意到这个参数。总而你是希望这个比率不断地下降。

回弹率(首页)Reject Rate/Bounce Rate
计算公式:回弹率(首页)=仅仅访问首页的访问数/所有从首页开始的访问数
指标意义:这个指标代表所有从首页开始的访问者中仅仅看了首页的访问者比率
指标意义:这个指标是所有内容型指标中最重要的一个,通常我们认为首页是最高的进入页面(当然,如果你的网站有其他更高的进入页面,那么也应该把它加入到追踪的目标中)。对任意一个网站,我们可以想象,如果访问者对首页或最常见的进入页面都是一掠而过,说明网站在某一方面有问题。 如果针对的目标市场是正确的,说明是访问者不能找到他想要的东西,或者是网页的设计上有问题(包括页面布局、网速、链接的文字等等);如果网站设计是可行易用的,网站的内容可以很容易地找到,那么问题可能出在访问者的质量上,即市场问题。

浏览用户比率 Scanning Visitor Share
计算公式:浏览用户比率=少于1分钟的访问者数/总访问数
指标意义:这个指标一定程度上衡量网页的吸引程度。
指标用法:大部分的网站都希望访问者停留超过一分钟,如果这个指标的值太高,那么就应该考虑一下网页的内容是否过于简单,网站的导航菜单是否需要改进.

浏览用户指数 Scanning Visitor Index
计算公式:浏览用户指数=少于1分钟的访问页面数/少于1分钟的访问者数
指标意义:一分钟内的访问者平均访问页数
指标用法:这个指数也接近于1,说明访问者对网站越没兴趣,他们仅仅是瞄一眼就离开了。这也许是导航的问题,如果你对导航系统进行了显著的改进,应该可以看到这个指数在上升;如果指数还是下降,应该是网站的目标市场及使用功能有问题,应该着手解决。

将浏览用户比率和浏览用户指数结合起来使用,可以看出用户是在浏览有用的信息还是厌烦而离开。

浏览用户量 Scanning Visitor Volume
计算公式:浏览用户量=少于1分钟的浏览页数/所有浏览页数
指标意义:在一分钟内完成的访问页面数的比率
指标用法:根据网站的目标的不同,这个指标的高低有不同的要求,大部分的网站希望这个指标降低。如果是搞广告驱动的网站,这个指标太高对于长期的目标是不利的,因为这意味着尽管你通过广告吸引了许多的访问者,产生很高的访问页数,但是访问者的质量却是不高的,所能带来的收益也就会受到影响。

发表在 article | 标签为 | 170条评论

经典MySQL语句

SQL分类:
DDL—数据定义语言(Create,Alter,Drop,DECLARE)
DML—数据操纵语言(Select,Delete,Update,Insert)
DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK)
 
首先,简要介绍基础语句:
1、说明:创建数据库
Create DATABASE database-name
2、说明:删除数据库
drop database dbname
3、说明:备份sql server
--- 创建 备份数据的 device
USE master
EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'
--- 开始 备份
BACKUP DATABASE pubs TO testBack
4、说明:创建新表
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
根据已有的表创建新表:
A:create table tab_new like tab_old (使用旧表创建新表)
B:create table tab_new as select col1,col2… from tab_old definition only
5、说明:删除新表
drop table tabname
6、说明:增加一个列
Alter table tabname add column col type
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
7、说明:添加主键: Alter table tabname add primary key(col)
说明:删除主键: Alter table tabname drop primary key(col)
8、说明:创建索引:create [unique] index idxname on tabname(col….)
删除索引:drop index idxname
注:索引是不可更改的,想更改必须删除重新建。
9、说明:创建视图:create view viewname as select statement
删除视图:drop view viewname
10、说明:几个简单的基本的sql语句
选择:select * from table1 where 范围
插入:insert into table1(field1,field2) values(value1,value2)
删除:delete from table1 where 范围
更新:update table1 set field1=value1 where 范围
查找:select * from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料!
排序:select * from table1 order by field1,field2 [desc]
总数:select count * as totalcount from table1
求和:select sum(field1) as sumvalue from table1
平均:select avg(field1) as avgvalue from table1
最大:select max(field1) as maxvalue from table1
最小:select min(field1) as minvalue from table1
11、说明:几个高级查询运算词
A: UNION 运算符
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。
B: EXCEPT 运算符
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。
C: INTERSECT 运算符
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。
注:使用运算词的几个查询结果行必须是一致的。
 
12、说明:使用外连接
A、left outer join:
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
B:right outer join:
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。
C:full outer join:
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。
 
其次,大家来看一些不错的sql语句
1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)
法一:select * into b from a where 1&lt;&gt;1
法二:select top 0 * into b from a
 
2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)
insert into b(a, b, c) select d,e,f from b;
 
3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)
insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件
例子:..from b in '"&amp;Server.MapPath(".")&amp;"\data.mdb" &amp;"' where..
 
4、说明:子查询(表名1:a 表名2:b)
select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)
 
5、说明:显示文章、提交人和最后回复时间
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b
 
6、说明:外连接查询(表名1:a 表名2:b)
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
 
7、说明:在线视图查询(表名1:a )
select * from (Select a,b,c FROM a) T where t.a &gt; 1;
 
8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括
select * from table1 where time between time1 and time2
select a,b,c, from table1 where a not between 数值1 and 数值2
 
9、说明:in 的使用方法
select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)
 
10、说明:两张关联表,删除主表中已经在副表中没有的信息
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )
 
11、说明:四表联查问题:
select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....
 
12、说明:曰程安排提前五分钟提醒
SQL: select * from 曰程安排 where datediff('minute',f开始时间,getdate())&gt;5
 
13、说明:一条sql 语句搞定数据库分页
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段
 
14、说明:前10条记录
select top 10 * form table1 where 范围
 
15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)
 
16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表
(select a from tableA ) except (select a from tableB) except (select a from tableC)
 
17、说明:随机取出10条数据
select top 10 * from tablename order by newid()
 
18、说明:随机选择记录
select newid()
 
19、说明:删除重复记录
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)
 
20、说明:列出数据库里所有的表名
select name from sysobjects where type='U'
 
21、说明:列出表里的所有的
select name from syscolumns where id=object_id('TableName')
 
22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。
select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type
显示结果:
type vender pcs
电脑 A 1
电脑 A 1
光盘 B 2
光盘 A 2
手机 B 3
手机 C 3
 
23、说明:初始化表table1
TRUNCATE TABLE table1
 
24、说明:选择从10到15的记录
select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc
  
随机选择数据库记录的方法(使用Randomize函数,通过SQL语句实现)
  对存储在数据库中的数据来说,随机数特性能给出上面的效果,但它们可能太慢了些。你不能要求ASP“找个随机数”然后打印出来。实际上常见的解决方案是建立如下所示的循环:
Randomize
RNumber = Int(Rnd*499) +1
 
While Not objRec.EOF
If objRec("ID") = RNumber THEN
... 这里是执行脚本 ...
end if
objRec.MoveNext
Wend
 
  这很容易理解。首先,你取出1到500范围之内的一个随机数(假设500就是数据库内记录的总数)。然后,你遍历每一记录来测试ID 的值、检查其是否匹配RNumber。满足条件的话就执行由THEN 关键字开始的那一块代码。假如你的RNumber 等于495,那么要循环一遍数据库花的时间可就长了。虽然500这个数字看起来大了些,但相比更为稳固的企业解决方案这还是个小型数据库了,后者通常在一个数据库内就包含了成千上万条记录。这时候不就死定了?
  采用SQL,你就可以很快地找出准确的记录并且打开一个只包含该记录的recordset,如下所示:
Randomize
RNumber = Int(Rnd*499) + 1
 
SQL = "Select * FROM Customers Where ID = " &amp; RNumber
 
set objRec = ObjConn.Execute(SQL)
Response.WriteRNumber &amp; " = " &amp; objRec("ID") &amp; " " &amp; objRec("c_email")
 
  不必写出RNumber 和ID,你只需要检查匹配情况即可。只要你对以上代码的工作满意,你自可按需操作“随机”记录。Recordset没有包含其他内容,因此你很快就能找到你需要的记录这样就大大降低了处理时间。
再谈随机数
  现在你下定决心要榨干Random 函数的最后一滴油,那么你可能会一次取出多条随机记录或者想采用一定随机范围内的记录。把上面的标准Random 示例扩展一下就可以用SQL应对上面两种情况了。
  为了取出几条随机选择的记录并存放在同一recordset内,你可以存储三个随机数,然后查询数据库获得匹配这些数字的记录:
SQL = "Select * FROM Customers Where ID = " &amp; RNumber &amp; " or ID = " &amp; RNumber2 &amp; " or ID = " &amp; RNumber3
 
  假如你想选出10条记录(也许是每次页面装载时的10条链接的列表),你可以用BETWEEN 或者数学等式选出第一条记录和适当数量的递增记录。这一操作可以通过好几种方式来完成,但是 Select 语句只显示一种可能(这里的ID 是自动生成的号码):
SQL = "Select * FROM Customers Where ID BETWEEN " &amp; RNumber &amp; " AND " &amp; RNumber &amp; "+ 9"
 
  注意:以上代码的执行目的不是检查数据库内是否有9条并发记录。
 
 
随机读取若干条记录,测试过
Access语法:Select top 10 * From 表名 orDER BY Rnd(id)
Sql server语法:select top n * from 表名 order by newid()
MySql语法:Select * From 表名 order By rand() Limit n
Access左连接语法(最近开发要用左连接,Access帮助什么都没有,网上没有Access的SQL说明,只有自己测试, 现在记下以备后查)
语法:Select table1.fd1,table1,fd2,table2.fd2 From table1 left join table2 on table1.fd1,table2.fd1 where ...
使用SQL语句 用...代替过长的字符串显示
语法:
SQL数据库:select case when len(field)&gt;10 then left(field,10)+'...' else field end as news_name,news_id from tablename
Access数据库:Select iif(len(field)&gt;2,left(field,2)+'...',field) FROM tablename;
 
Conn.Execute说明
Execute方法
  该方法用于执行SQL语句。根据SQL语句执行后是否返回记录集,该方法的使用格式分为以下两种:
    1.执行SQL查询语句时,将返回查询得到的记录集。用法为:
    Set 对象变量名=连接对象.Execute("SQL 查询语言")
   Execute方法调用后,会自动创建记录集对象,并将查询结果存储在该记录对象中,通过Set方法,将记录集赋给指定的对象保存,以后对象变量就代表了该记录集对象。
 
    2.执行SQL的操作性语言时,没有记录集的返回。此时用法为:
    连接对象.Execute "SQL 操作性语句" [, RecordAffected][, Option]
      ·RecordAffected 为可选项,此出可放置一个变量,SQL语句执行后,所生效的记录数会自动保存到该变量中。通过访问该变量,就可知道SQL语句队多少条记录进行了操作。
      ·Option 可选项,该参数的取值通常为adCMDText,它用于告诉ADO,应该将Execute方法之后的第一个字符解释为命令文本。通过指定该参数,可使执行更高效。
 
·BeginTrans、RollbackTrans、CommitTrans方法
  这三个方法是连接对象提供的用于事务处理的方法。BeginTrans用于开始一个事物;RollbackTrans用于回滚事务;CommitTrans用于提交所有的事务处理结果,即确认事务的处理。
  事务处理可以将一组操作视为一个整体,只有全部语句都成功执行后,事务处理才算成功;若其中有一个语句执行失败,则整个处理就算失败,并恢复到处里前的状态。
  BeginTrans和CommitTrans用于标记事务的开始和结束,在这两个之间的语句,就是作为事务处理的语句。判断事务处理是否成功,可通过连接对象的Error集合来实现,若Error集合的成员个数不为0,则说明有错误发生,事务处理失败。Error集合中的每一个Error对象,代表一个错误信息。

 

发表在 article | 标签为 , | 经典MySQL语句已关闭评论

网站专题制作方法

网站专题是什么呢?顾名思意,专题肯定就是一个事物,利用这一个事物策划出来的一个页面或者是一个活动流程页面,这个页面里面会有相应的网站模块和所需要的功能。在很多的大型网站中都设有这样的专题,像网易、腾讯、新浪、广州FLASH动画

这些门户网中都设有专题。下面我们就具体的分析下网站专题的制作。

一、制作网站专题必备几点要素

  1. 好题材,要做网站的专题,必须要先有一个好的题材,这是最为关键的,如果内容不好,你网页做的再漂亮也没有用,页面是为了配合里面的内容的。所以先要把题材找好,一定要新颖,让人耳目一新的感觉。

 

  1. 设置栏目,当我们把素材选好后,我们就要给它整体结构设置一下,如果设置的不好的话,将会影响到整个画面的不协调。最好是用发射性的思维,从一点想外扩散开来,合理的安排搭配栏目的位置。

 

  1. 主次结构,一个好的网站专题,它的结构是很重要的,要让访问者沿着你设置好的思路看下去,一步步的引导他们到最终目的地。一定要把内容的主次分清楚,一个好网站专题的主次结构,都是分的很细致的。

 

  1. 制作标题,好的网站专题必要有一个好的标题,新闻标题要让人有一种视觉的冲击,好标题就是这个专题的牌子。别人一眼看到这个标题就有想进去看的冲动,这样就达到了它的作用!

 

二、有些人在制作顺德FLASH动画

网站专题的时候,就把它当做普通的顺德动画制作

页面来制作,但是在这个制作的时候我们还要注意一些问题,这样才能做出更好的专题页面来。

  1. 我们制作FLASH动画公司

    网站专题,也是为了让这个网站的流量能够提上去,所以我们在制作的时候一定要记得有一个可以进入网站首页或者是其它的页面,这是一个很好的机会引导访客去首页的机会。而不是访客来了专题页面就离开,这样就失去了专题页面的存在意义。

 

  1. 一般在专题中都要制作自己的导航,是专题本身的导航。特别是我们在做活动的专题的时候,就必须要有它自身的导航,导航要做的细一点,包括:活动流程、FLASH动画培训

    、活动详细说明、报名 表、报名情况等等,让客户快速的找到活动的入口,引导他们操作。

 

  1. 在做专题里通栏的BANNER的时候,一定要做的视觉效果强一些,他可以给访问留下深刻的印象,瞬间能够向他传达专题的主题,让访客继续的访问下去。专题网页的是否成功和BANNER、UI的设计紧密的联系在一起,一个够创意,够漂亮的页面让访客回味无穷。
发表在 article | 网站专题制作方法已关闭评论

ISAPI_Rewrite 中文手册2

ISAPI_Rewrite
正式指令

4.1AccessFileName

指令

说明

设置分布式配置文件的名称

语法

AccessFileName filename

[filename] ...

默认值

AccessFileName .htaccess

使用环境

server config

指定一个
ISAPI_ReWrite
寻求分布式配置的文件名列表。默认文件名是
.htaccess

ISAPI_ReWrite
只能载入它能在这个列表中找到的第一个文件。默认情况下
ISAPI_ReWrite
管理者会以
hidden

属性标记配置文件
-
它将防止文件被远程用户直接访问到。

如果配置文件进行了任何修改,它将在下次请求服务器时自动加载。

4.2AllowOverride
指令

说明

明确规定了每个目录重写的基准
URL

语法

AllowOverride Al

l|None
|directive-type [directive-type] ..
.

默认值

AllowOverride All

使用环境

server config, virtual host, directory

这个指令声明了在分布式
.htaccess
文件里的指令是否可以覆盖父级别的
httpd.conf
中的指令。在
ISAPI_Rewrite
的使用环境中,这个指令实际上控制了特定虚拟主机或者目录的
.htaccess
文件的可用或者不可用。目前只支持三个值:
All


None


FileInfo


All


FileInfo

使
.htaccess
文件以及它里面的整个
ISAPI_Rewrite
目录可用,
None

使所有的
.htaccess
文件以及目录不可用。这些目录具有继承性。这意味着如果你为一些目录或者虚拟主机指定
AllowOverride none


.htaccess
文件将对整个子目录树不可用。

4.3RewriteEngine
指令

说明

启用或禁用运行时
Rewrite
引擎

语法

RewriteEngine on|off

默认值

RewriteEngine off

使用环境

server config, virtual host, directory, .htaccess

启用或禁用运行时
Rewrite
。如果你需要禁用
ISAPI_Rewrite
模块或者特定的
.htaccess
文件,可以使用
RewriteEngine off
指令而不是注释掉重写规则。

警告:由于支持查询的号码,我们不得不使
rewrite
引擎在默认情况下打开,相较之
Apache  rewrite
引擎在默认情况下关闭。请记住这个小小的不兼容,始终指定每个配置文件里的重写引擎的明确地位,无论你需要打开还是关闭。


4.4RewriteRule
指令

 

 

说明

定义
URL
重写规则

语法

RewriteRule Pattern Substitution
[flags]

使用环境

server config, virtual host, directory, .htaccess

这个指令定义了单个
URL
重写操作。它可能在一个配置文件中出现多次,每个实例定义一个重写
URL
的规则。
RewriteRule
指令包含
URL
匹配模式、替换字符串以及可选的标志设置。

Pattern


(模式)是一个用来匹配当前
URL

Perl
兼容正则表达式。当前的
URL
可以是原来请求的
URL
或者已经由优先级高的规则替改过的
URL
。网址从不包含协议或者主机名,从第一个斜杠字符开始(只对
httpd.conf
文件适用)。而且当前网址还因不同的应用配置级别而异。对于目录级配置(
.htaccess
文件),结尾的斜线和配置文件的目录名,会在匹配时被从
URL
中忽略掉。在创建正则表达式时,请阅读这个文档的
正则表达式语法



部分来得到更多的信息。

"!"
字符打头的模式将否定整个表达式。否定模式不能产生子匹配,所以你不能使用
$N
的替代引用。

Substitution


(
替换
)
字符串指定了模式是匹配时生成
URL
的格式字符串。除了纯文本,它可以包括这些特殊字符。

Ÿ
  



Rewrite
模式的回溯引用
$N


Ÿ
  



Rewrite
模式的回溯引用
%N


Ÿ
  


服务器变量
%{VARNAME}


Ÿ
  


条件格式模式
?Ntrue_string:false_string


Ÿ
  


分组括号


(

”和“
)

替换字符串将所有的字符视为字面值,除了
$'

'\'

'('

')'

'?'

':'

'\'
。为了字面化地读出特殊字符,它定义了用
"\
"

引导的转义字符。下面的特殊字符是允许的。

$&

输出匹配的整个表达式。

$`

输出上一个的匹配结束到当前匹配的开始之间的文本
(
如果之前没有找到匹配串,则输出从开头到当前匹配的开始之间的文本
)

$'

输出当前匹配之后跟着的所有文字。

$$

输出字面值
$

\a

信号铃字符

\f

表单反馈字符

\n

新行字符

\r

回车符

\t

制表符

\v

垂直制表符

\x

十六进制字符,比如说
\x0D.

\x{}

一个可能的
Unicode
十六进制字符
-
例如
\x{1A0}

\cx

ASCII
的转义字符
x
,例如
\c @
等价于
escape-@

\e

The ASCII
转义字符

\dd

八进制字符常量,例如
\10

\l

导致下一个字符被小写输出。

\u

导致下一个字符被大写输出。

\L

导致整个后继字符串被小写输出,直到遇到
\E

\U

导致整个后继字符串被大写输出,直到遇到
\E

\E

结束
\L
或者
\U
的后续字符串

\\

单个反斜杠字符
'\'

RewriteRule
从父配置文件开始按照在配置文件中出现的次序应用。每个规则只有在它的
Pattern

匹配了一个
URL
而且所有连接条件(
RewriteCond
)都匹配时才会被应用。在该
URL

Substitution
完成替换之后,重写过程还在继续,一直到配置文件结束或者遇到一个用了任何停止标志的规则。在
Substitution

中的特殊字符串
"-"(
短横
)
意味着没有替换,而且当你需要应用该规则并留下的原始的未被染指过的
URL
时它是很有用的。

此外,这里有一个支持的
flag

(
标志
)
列表。这些标识可以改变规则的表现。与
Apache
完全兼容的标志被标记为绿色,不支持的标志被标记为绿色,只在
ISAPI_Rewrite
中被支持的标识被标记成黄色。

CU (Case Upper)

把替换字符串改成大写
.

CL (Case Lower)

把替换字符串改成小写
.

chain|C

将当前规则与后一条规则链接起来,后一条规则只有在当前规则被匹配的情况下才能被执行。链接可以再后续链接。

cookie|CO=NAME:VAL:domain[:lifetime[:path]]

设置一个有指定字段的
cookies
头,并把它和当前请求的响应一起发送到客户端。

env|E=VAR:VAL

不支持,在
UNIX
环境中设置一个环境变量,在
Windows
系统中无意义。

forbidden|F

发送即时
403 FORBIDDEN
响应到客户端,停止这个请求的规则处理以及所有其他的替换处理。

gone|G

发送一个即时
401Gone
响应到客户端,停止这个请求的规则处理以及所有其他的替换过程。

handler|H=Content-handler

不支持,为请求明确指定了处理处理。在
IIS
的世界中这是可以通过重写请求的文件扩展名来实现。但是没有从
Apache
处理到
IIS
文件扩展名的直接转换方法。

last|L

停止这里的重写处理,不再应用当前配置文件中的其它规则。在这种情况下,后代的
.htaccess
文件依然能被用到。

loop|LP

在一个循环中重复运行当前单个规则直到它的模式以及条件不再被匹配了。循环次数被限定为
200
免得陷入无限循环。

next|N

从当前配置文件开始处重复运行重写处理
。循环次数被限定为
200
免得陷入无限循环。

nocase|NC

这个标记使
Pattern
大小写不敏感。

noescape|NE

不转义输出。在
ISAPI_Rewrite
默认情况下,在输出中会把所有的非
ANSI
字符编码为十六进制数
%xx

nosubreq|NS

这个标识在
ISAPI_Rewrite
中与在
Apache
中含义不同。精确的转换是不可能的,但这个标志可能仍然是有用的。每当配置文件处理完成之后,
URL
被重写了,
ISAPI_Rewrite
将启动这个新的
URL
处理过程(与
Apache
相同)使它可以应用到另一个配置文件中。此标识意思是该规则只针对初始用户的请求执行,不针对已被重写过的请求执行,以防可能出现的循环。
ISAPI_Rewrite
限定循环重复次数为
10

nounicode|NU

如果设置了
NU
标记,从
Unicode
转换为
UTF - 8
将不会发生。所有
Unicode
字符会保持它的
%xx
格式不变。

O (nOrmalize)

留着用于与
ISAPI_Rewrite 2.x
兼容。如果使用了
RewriteCompatibility
2
,这个指令在处理之前将
URL
规范化。规范化包括移除一个
URL
编码、错误字符,等等。同时
URL
的规范化将完全移除它的查询字符串。如果
RewriteCompatibility
2
没有被使用,
URL
按照默认被规范化(就如同它在
mod_rewrite
中所做的),此标志的含义将反转。

proxy|P

将结果
URL
强制内部处理为另一台服务器上的目标,并即时传到远程服务器上,并且,规则处理在这里中断了。远程服务器的响应将被传递回客户端。
proxy
需要您指定完整的
URL
,由协议、主机名称等开头。
ISAPI_Rewrite
使用
ISAPI
扩展来处理代理请求。你可以在代理配置章节中阅读到更多有关于此的内
容。

passthrough|PT

不支持或者始终支持。在
IIS
中结果始终传递到下一个处理

qsappend|QSA

追加当前查找串的数据到替换串而不是由一个替换字符串取代它。当你需要在保留原来的参数再添加更多的查询字符串参数时,可以使用它。

redirect|R [=code]

强制服务器用重定向指令给客户端发送一个即时响应,提供一个新的接替位置。可以选加前缀
http://thishost[:thissport]/
从而把
URL
带到一个可用的绝对形式。如果没有给出代码,将使用一个
302
响应
(
暂时性移动
)
。你可以选择在
3XX
系列范围内指定任何代码。
  

skip|S=num

如果当前的规则匹配,强制
rewrite
引擎跳过后面
num

个规则。

type|T=MIME-type

强制目标文件的
MIME
类型转换成被设定的
MIME
类型。这能够被用来根据一些条件设置内容类型。
 

U (Unmangle log)

无损记录。记录它原来请求的网址,而不是被重写的
URL

 

 

4.10RewriteLog
指令

 

 

说明

设置
ISAPI_Rewrite
日志文件的名称

语法

RewriteLog file-path

默认值

RewriteLog installdir\rewrite.log

使用环境

server config

这个指令用来设定记录
ISAPI_Rewrite
动作的日志文件的文件名。示例:

Rewritelog "C:\local\path\rewrite.log"

4.11RewriteLogLevel
指令

 

 

说明

设置日志级别

语法

RewriteLogLevel Level

默认值

RewriteLogLevel 0

使用环境

server config

这个指
令设置日志的输出长度。默认值
0
表示不记日志,而最大的级别
9
则表示所有的动作都要记录。

使用使用较高的级别值可能会降低
ISAPI_Rewrite
的操作速度。我们建议你当你完成规则调试之后,通过设置日志级别为零来禁用日志。

4.12RewriteOptions
指令

 

 

说明

指定特殊选项

语法

RewriteOptions Options

使用环境

server config, virtual host, directory, .htaccess

这个指令可以为
ISAPI_Rewrite
设置特定选项。当前只有惟一一个选项可用:
inherit


inherit

:强迫当前配置从父级继承所有的选项和规则。这意味着来自父级配置的所有的规则将被再次执行,除非当前环境另有相应重写规则。

4.13RewriteCompatibility2
指令

 

 

说明

启用或禁用
ISAPI_Rewrite 2.x
兼容模式

语法

RewriteCompatibility2 on
|off

默认值

RewriteCompatibility2 off

使用环境

server config, virtual host, directory, .htaccess

这一指令将激活与
ISAPI_Rewrite 2.x
版的兼容性,将一些
2.X
的规则正确地翻译为
3.0
版本的语法。这并不意味着
ISAPI_Rewrite 3
将开始懂得不经修改旧的语法。如果您有针对
ISAPI_Rewrite 2.X
的旧设计请使用
ISAPI_Rewrite
提供的翻译工具将这些旧规则转化为新的语法规则。

现在通过设置指令
RewriteCompatibility2

唯一改变的是,它将关闭网址常规前缀并删除查询字符串。
Apache

mod_rewrite
将删除匹配的
URL
的查询字符串的这部分,相较之下
ISAPI_Rewrite 2.X
将匹配整个网址(包括查询字符串在内),而且
[O]
标记的意思将由该指令倒置。

4.14ErrorLog
指令

 

 

说明

一般的错误文件的位置

语法

ErrorLog
file-path

默认值

ErrorLog
installdir\rewrite.log

使用环境

server config

这个指令设置存放
ISAPI_Rewrite
整体错误和消息的日志文件的名称。例如
httpd.conf file load, .htaccess file load,
等等

例:
ErrorLog "C:local\path\error.log"

4.15LogLevel
指令

 

 

说明

设置一般的错误的日志级别

语法

LogLevel Level

默认

LogLevel warn

使用环境

server config

这个指令设置一般日志的输出长度,跟它的重写过程无关。这里有一个
level
的可用值列表:
emerg

alert

crit

error

warm

notice

info

debug
。当前的
ISAPI_Rewrite
日志只记录错误信息。

设置
LogLevel
调试来解决配置文件中加载的问题。

 

4.16<VirtualHost>
指令



 

 

说明

把应用于特定
IP
地或者主机的指令编组

语法

<VirtualHost addr[:port] [addr[:port]] ...> ... </VirtualHost>

使用环境

server config

<VirtualHost> ... </VirtualHost>
标签用来对应用到特定虚拟主机里的指令进行分组。

addr

的可用值为:

Ÿ
  


特定的
IP
地址

Ÿ
  


完整的域名

Ÿ
  


字符
'*'
可以匹配任何主机或者特定服务器的任何端口号。

例如:

RewriteEngine off

AllowOverride none

<VirtualHost onesite.com

www.onesite.com

>

RewriteEngine on

AllowOverride all

</VirtualHost>

不要忘了在每个
<VirtualHost>
标签中包含
RewriteEngine on



指令,也不要将不能应用的规则封装进去。


4.17<Directory>
指令

 

 

说明

将适用于特定的文件系统的目录和子目录的指令编组

语法

<Directory directory-path> ... </Directory>

使用环境

server config, virtual host

<Directory> ... </Directory>
标签被用来对应用到特定文件系统目录以及子目录的指令进行分组。通配符
?

*
是可用的。正则表达式也是可用的,需要以
~
字符打头。

对目录路径参数必须小心:它们必须字面匹配用来访问文件的文件系统路径,用于某一特定
<Directory>
的指令并不适用于来自同一目录下通过不同的路径的文件访问,例如通过不同的符号链接。只有完整的文件路径是被允许使用的。

示例:

<Directory C:/inetpub/>

  
AllowOverride None


</Directory>

<Directory C:/inetpub/home/>

  
AllowOverride FileInfo


</Directory>

<Directory ~ "C:/inetpub/wwwroot/.*/[0-9]{3}">

  
# ... directives here ...


</Directory>

不要忘了在每个
<Directory>
标签中包含
RewriteEngine on



指令,也不要将不能应用的规则封装进去。

4.18<DirectoryMatch>
指令

 

 

说明

将适用于特定的文件系统的目录和子目录的指令编组

语法

<DirectoryMatch regex> ... </DirectoryMatch>

使用环境

server config, virtual host

<DirectoryMatch> ... </DirectoryMatch>
被用来封装一个只适用于指定的文件系统的目录和子目录的指令组。这个指令和
<Directory ~>

语法相同。

示例:

<DirectoryMatch "^/www/(.+/)?[0-9]{3}">

   # ... directives here ...

</DirectoryMatch>

不要忘了在每个
<

DirectoryMatch>
标签中包含
 
RewriteEngine on


指令,也不要将不能应用的规则封装进去。


4.19<Files>
指令

 

 

说明

将应用于匹配文件名的指令包装起来

语法

<Files filename
> ... </Files>

使用环境

server config, virtual host, directory, .htaccess

<File>
指令以文件名限定了封装的指令的作用域。
filename

参数必须包含一个文件名,支持
?

*
以及以
~
字符打头的正则表达式。

示例:

<Files index.*>

   # ... directives here ...

</Files>

<Files ~ "\.(gif|jpe?g|png)$">

   # ... directives here ...

</Files>

不要忘了在每个
<Files>
标签中包含
RewriteEngine on



指令,也不要将不能应用的规则封装进去。

4.20<FilesMatch>
指令

 

 

说明

将应用于匹配文件名的指令包装起来

语法

<FilesMatch regex
> ... </FilesMatch>

使用环境

server config, virtual host, directory, .htaccess

<FilesMatch>
指令的语法和
<Files ~>

语法完全一样。

<FilesMatch "\.(gif|jpe?g|png)$">

不要忘了在每个
<FilesMatch>
标签中包含
RewriteEngine on



指令,也不要将不能应用的规则封装进去。


4.21<Location>
指令

 

 

说明

把被包装起来的指令集应用到匹配的
URL
或者虚拟路径

语法

<Location URL-path|URL
> ... </Location>

使用环境

server config, virtual host

<Location> ... </Location>
标签用来将应用到特定
URL
或者虚拟路径的指令分组。
<Location>
将运算符完全从文件系统中分划出来,因此那些指令将不会用来控制对文件文件系统位置的访问。因为有几个不同的
URL
可能映射到相同的文件系统位置。


URL-path

是一个形式为
“/path/”
的虚拟路径。没有协议、主机名、端口号、查询请求字符串被包含在内。
URL-path

可以包含通配符
?

*
或者以
~
字符打头的正则表达式。

示例:

<Location /directory>

   # ... rules go here

</Location>

<Location />

   # ... more rules go here

</Location>

不要忘了在每个
<Location>
标签中包含
RewriteEngine on



指令,也不要将不需要用到的规则封套进去。

4.22<LocationMatch>
指令

 

 

说明

把被包装起来的指令集应用到正则表达式匹配的
URL

语法

<LocationMatch regex
> ... </LocationMatch>

使用环境

server config, virtual host

这个指令的语法和
<Location ~>

正则表达式语法完全一样。

示例:

<LocationMatch "/(home|section)/bin">

   # ... rules go here

</LocationMatch>

不要忘了在每个
<LocationMatch>
标签中包含
RewriteEngine on



指令,也不要将不能应用的规则封装进去。

 

示例



注意:这些示例中所有的规则只适用于
httpd.conf
文件。在
ISAPI_Rewrite
以及在
Apache

mod_rewrite
中,规则的基本路径是不同的,取决于你放置
.htaccess
文件的目录。如果你将规则放在
httpd.conf
里的话,初始领头斜线必须存在,而在
.htaccess
文件中,到这些文件的虚拟路径会被截断。规则取决于以
RewriteBase /
指令引导的根路径,来允许它们在
httpd.conf
和目录级的
.htaccess
文件的任何位置上运作。


简单的搜索引擎友好的网址

下面这个例子演示了如何轻松地使用循环标记藏匿查询字符串参数。假设你有一个如下的
URL

http://www.mysite.com/foo.asp?a=A&b=B&c=C

,而且你希望以这样的地址来访问它:
http://www.myhost.com/foo.asp/a/A/b/B/c/C

请尝试用下面的规则来达到预期的效果:

RewriteEngine on

RewriteRule ^(.*?\.asp)/([^/]*)/([^/]*)(/.+)? $1$4?$2=$3 [NC,LP,QSA]

注意这个规则可能破坏页面与
CSS
文件、图片等的相对链接。至所以这样是因为在浏览器中用于推算完整资源
URI
的基本路径(页面的父文件夹)发生了变化。只有在您使用目录分隔符作为替代字符时才会发生这个问题。有三种可用的解决方案:

1
.使用下面的规则,它不影响基本路径,因为它没有用到目录分隔符
“/”

2
.借助于
<base href="/folder/">
标签直接为页面指定正确的
base
路径

3
.把所有的页面相对链接都变成相对于根目录的地址或者绝对地址形式。

还存在着很多种用了不同的分隔符和文件扩展名的规则。例如,使用像这样的
URL

http://www.myhost.com/foo.asp~a~A~b~B~c~C
。下面的规则可以用来实现它:

RewriteEngine on

RewriteRule ^(.*?\.asp)~([^~]*)~([^~]*)(.*) $1$4?$2=$3 [NC,LP,QSA]

富关键词
URLs

在上面的例子中,我们使用很一般的技术来简单地藏匿查询字符串标记。但是很多对搜索引擎优化很有用的解决方案是让您的
URL
关键字丰富。看看下面的网址,例如:
http://www.mysite.com/productpage.asp?productID=127
这是大部分网站的常见情况。但是你可以通过使用这样形式的链接来显著地提高你的网页搜索引擎抓取率:
http://www.mysite.com/products/our_super_tool.asp

URL
中的关键词
“our super tool”
会被索引,并提高网页排名,但是
“our_super_tool”
不能直接被用来收回
productid=127
,这个问题存在几种解决方案。

第一个解决方案,我们建议你使用简短、只包含少数几个参数(既有关键词也有数字标识符)的
URL
形式,在样您的
URL
可能看起来如下:

http://www.mysite.com/products/our_super_tool_127.asp
。实现这一重写目标只需要一个规则:

RewriteEngine on

RewriteBase /

RewriteRule ^products/[^?/]*_(\d+)\.asp /productpage.asp?productID=$1 [QSA]

另一个更复杂的解决方案是创建一对一的映射文件,并用它来映射
“our_super_tool”

127
。该解决方案对一些有很多参数的长
URL
来说很有用,并允许你隐藏数字标识符。这
URL
看起来像是
http://www.mysite.com/products/our_super_tool.asp

。请注意
“our_supper_tool”
部分必须是产品的唯一标识,是它的标识符。下面是这种解决方案的一个示例:

RewriteEngine on

RewriteBase /

RewriteMap mapfile txt:mapfile.txt

RewriteRule ^products/([^?/]+)\.asp /productpage.asp?productID=${mapfile:$1}

而且你必需创建包含以下内容的
mapfile.txt
映射文件:

one_product        1

another_product  2

our_super_tool    127

more_products     335

这种方法的优点是:你可以使用它来组合十分复杂的
URL
转换,但是这是一个小例子,是这个指南中的题外之话。


使用
IIS
作为反向代理

假设你有运行
IIS
的互联网服务器以及几台后台服务器或者应用程序运行在其它平台或者机器上。这些服务器不能直接在互联网上阅览,但是你必须为他人提供访问这些服务器的渠道。这里有一个演示如何简单地将某个网站的完整内容映射到另一个运行了
ISAPI_Rewrite
的站点的文件夹的示例:

RewriteEngine on

RewriteBase /

RewriteRule mappoint(.+) http://sitedomain$1 [NC,P]

藏匿文件扩展名:

虽然不可能将一个站点的所有的文件的扩展名都藏匿起来,但是我们可以使用
ISAPI_Rewrite
的文件检查功能来隐藏某些已知扩展名。这里有一个藏匿网站上
.asp
文件扩展名的规则示例:

RewriteEngine on

#Redirect extension requests to avoid duplicate content

RewriteRule ^([^?]+)\.asp$ $1 [NC,R=301,L]

 

#Internally add extensions to request

RewriteCond %{REQUEST_FILENAME}.asp -f

RewriteRule (.*) $1.asp

仿真基于主机头的虚拟网站

例如你已经注册了两个域名
www.site1.com




www.site2.com



。现在你可以使用同一个物理站创建两个不同的站点了。这里是一个规则示例:

RewriteEngine on

#Fix missing trailing slash char on folders

RewriteRule ^([^.?]+[^.?/])$ $1/ [R,L]

#Emulate site1

RewriteCond %{HTTP:Host} ^(?:www\.)?site1\.com$

RewriteRule (.*) /site1$1 [NC,L,NS]

#Emulate site2

RewriteCond %{HTTP:Host} ^(?:www\.)?site2\.com$

RewriteRule (.*) /site2$1 [NC,L,NS]

现在只要把你的站点分别放到
/site1

/site2
目录下就可以了。注意
www.site1.com



www.site2.com


这两个域名必须在
IIS
中被映射到这个网站里,从而使
ISAPI_Rewrite
能拦截到请求。

或者,你可以使用更多通用的规则,从而把任何请求都映射到与请求主机名同名的文件夹里。

RewriteEngine on

#Fix missing trailing slash char on folders

RewriteRule ^([^.?]+[^.?/])$ $1/ [R,L]

 

#Map requests to the folders

RewriteCond %{HTTP:Host} ^(www\.)?(.+)

RewriteRule (.*) /%2$1 [NS]

网站的目录名应该是这样子的:
/somesite1.com

/somesite2.info
,等等。


阻断内联图像(阻止盗链)

假如你有一些页面插入了
http://www.mysite.com/



下的
gif
图片。一些其它站点将通过网页超链接插入这些图片。这会给你的网站增加很多无用的通讯量,而且你希望阻止这种做法。

虽然用
ISAPI_Rewrite
不能
100%
地保护图片不被盗链(只有专门的反盗链产品才能做到它),你至少可以在浏览器发来
HTTP
引用头的时候限制这种情况。下面的规则可以让你只允许来自同一主机的引用页或者空地址访问到这些图片。

RewriteEngine on

RewriteCond %{HTTP:Host}#%{HTTP:Referer} ^([^#]+)#(?!http://\1).+

RewriteRule .*\.(?:gif|jpg|png) /block.gif [NC]

重定向非
www
的版本到
www

如果你的网站同时可以通过两种形式的
URL
比如说
http://helicontech.com



http://www.helicontech.com


来访问到,那么最好将一种地址重定向到另一种地址里,来避免搜索引擎对重复内容做出的处罚。下面是一个能将所有的非
www
地址重定向到相应的
www
地址上去的
301
重定向规则。

RewriteEngine on

RewriteCond %{HTTPS} (on)?

RewriteCond %{HTTP:Host} ^(?!www\.)(.+)$ [NC]

RewriteCond %{REQUEST_URI} (.+)

RewriteRule .? http(?%1s)://www.%2%3 [R=301,L]

强制
SSL
或者非
SSL
到一个指定的位置

这里是一个演示如何将
SSL
强制转到指定的文件夹的示例。只要简单地把下面的规则放到该文件夹下的
.htaccess
文件里就可以了。

RewriteEngine on

 

#Fix missing trailing slash char on folders

RewriteRule ^([^.?]+[^.?/])$ $1/ [R,L]

 

#Redirect non-HTTPS to HTTPS

RewriteCond %{HTTP:Host} (.*)

RewriteCond %{HTTPS} off

RewriteCond %{REQUEST_URI} (.*)

RewriteRule .? https://%1%2 [R,L]

而这个示例作用正好相反:将非
SSL
强制转到指定文件夹。

RewriteEngine on

 

#Fix missing trailing slash char on folders

RewriteRule ^([^.?]+[^.?/])$ $1/ [R,L]

 

#Redirect HTTPS to non-HTTPS

RewriteCond %{HTTP:Host} (.*)

RewriteCond %{HTTPS} on

RewriteCond %{REQUEST_URI} (.*)

RewriteRule .? http://%1%2 [R,L]

转移站点位置

当你把网站从一个域名移到另一个域名,或者从一个文件夹移动另一个文件夹里的时候,这是经常会遇到的问题。你希望将一个网站的所有请求重定向到另一个网站里,而且不丢失请求资源名以及参数。当你希望保留现有的网页的排名和外链接的时候,它是非常有用的。这个解决方案是在旧的网站服务器上使用
ISAPI_Rewrite

RewriteEngine on

#Permanent redirect to update old links

RewriteRule (.+) http://newserver.com$1 [R=301,L]


依赖于浏览器的内容

有时,至少需要在重要的顶级页面提供依赖于浏览器的内容,例如,必须为
Internet Explorer
提供全功能版本,为
Lynx
浏览器提供最小功能的版本,为其它浏览器提供一个基本功能版本。

RewriteEngine on

 

RewriteCond %{HTTP:User-Agent} MSIE

RewriteRule /foo\.htm /foo.IE.htm [L]

 

RewriteCond %{HTTP:User-Agent} (?:Lynx|Mozilla/[12])

RewriteRule /foo\.htm /foo.20.htm [L]

 

RewriteRule /foo\.htm /foo.32.htm [L]


拦截恼人的机器人

下面是一个有用的示例,演示了如何通过识别用户代理来阻止些已知的机器人和拨号器。请注意这个规则是很长的,我们把它断为多行了。为了使它正常工作,在行的头和行尾不能有任何空格。

RewriteEngine on

#Block spambots

RewriteCond %{HTTP:User-Agent} (?:Alexibot|Art-Online|asterias|BackDoorbot|Black.Hole|\BlackWidow|BlowFish|botALot|BuiltbotTough|Bullseye|BunnySlippers|Cegbfeieh|Cheesebot|\CherryPicker|ChinaClaw|CopyRightCheck|cosmos|Crescent|Custo|DISCo|DittoSpyder|DownloadsDemon|\eCatch|EirGrabber|EmailCollector|EmailSiphon|EmailWolf|EroCrawler|ExpresssWebPictures|ExtractorPro|\EyeNetIE|FlashGet|Foobot|FrontPage|GetRight|GetWeb!|Go-Ahead-Got-It|Go!Zilla|GrabNet|Grafula|\Harvest|hloader|HMView|httplib|HTTrack|humanlinks|ImagesStripper|ImagesSucker|IndysLibrary|\InfonaviRobot|InterGET|Internet\sNinja|Jennybot|JetCar|JOC\sWeb\sSpider|Kenjin.Spider|Keyword.Density|\larbin|LeechFTP|Lexibot|libWeb/clsHTTP|LinkextractorPro|LinkScan/8.1a.Unix|LinkWalker|lwp-trivial|\Mass\sDownloader|Mata.Hari|Microsoft.URL|MIDown\stool|MIIxpc|Mister.PiX|Mister\sPiX|moget|\Mozilla/3.Mozilla/2.01|Mozilla.*NEWT|Navroad|NearSite|NetAnts|NetMechanic|NetSpider|Net\sVampire|\NetZIP|NICErsPRO|NPbot|Octopus|Offline.Explorer|Offline\sExplorer|Offline\sNavigator|Openfind|\Pagerabber|Papa\sFoto|pavuk|pcBrowser|Program\sShareware\s1|ProPowerbot/2.14|ProWebWalker|ProWebWalker|\psbot/0.1|QueryN.Metasearch|ReGet|RepoMonkey|RMA|SiteSnagger|SlySearch|SmartDownload|Spankbot|spanner|\Superbot|SuperHTTP|Surfbot|suzuran|Szukacz/1.4|tAkeOut|Teleport|Teleport\sPro|Telesoft|The.Intraformant|\TheNomad|TightTwatbot|Titan|toCrawl/UrlDispatcher|toCrawl/UrlDispatcher|True_Robot|turingos|\Turnitinbot/1.5|URLy.Warning|VCI|VoidEYE|WebAuto|WebBandit|WebCopier|WebEMailExtrac.*|WebEnhancer|\WebFetch|WebGo\sIS|Web.Image.Collector|Web\sImage\sCollector|WebLeacher|WebmasterWorldForumbot|\WebReaper|WebSauger|Website\seXtractor|Website.Quester|Website\sQuester|Webster.Pro|WebStripper|\Web\sSucker|WebWhacker|WebZip|Wget|Widow|[Ww]eb[Bb]andit|WWW-Collector-E|WWWOFFLE|\Xaldon\sWebSpider|Xenu's|Zeus) [NC]

RewriteRule .? - [F]

动态生成的
robots.txt

robots.txt
是一个让搜索引擎用来发现必须被索引的
URL
和不能被索引的
URL
的文件。但是对拥有很多动态内容的大型站点来说,创建这个文件是一个非常复杂的任务。你有没有想过用脚本动态生成
robots.txt
?让我们来写这个
robots.asp
脚本吧:

<%@ Language=JScript EnableSessionState=False%>

<%

//The script must return plain text

Response.ContentType="text/plain";

/*

Place generation code here

*/

%>

现在使用这个单一的规则使它可用作
robots.txt

RewriteEngine on

RewriteRule robots\.txt robots.asp [NC]


 
平衡负荷仿真

这个示例模拟某种
DNS
轮换负荷平衡技术。假设你有主站
www.mysite.com


和数台
web
服务器分别注册为
www[1-9].mysite.com
。如果你在主服务器上安装了
ISAPI_Rewrite
,你可以将初始的客户端请求重定向到几台特定服务器,从而在几台服务器之间随机摊开通讯量。一旦已重定向,客户端将一直使用这一台服务器。虽然这种解决方案并不非常理想,但是它确实能分摊你的通讯量并避免在维护会话状态方面发生的问题。

使用下面的规则来重定向客户端:

RewriteEngine on

RewriteMap hosts rnd:hosts.txt

RewriteCond %{HTTP:Host} (www)\.mysite.com [NC]

RewriteRule (.*) http://${hosts:%1}.mysite.com$1 [R,L]

下面是
hosts.txt
文件的内容

www www1|www2|www3|www4|www5|www6|www7|www8|www9

你还可以在
Apeche
文档里找到很多其它有用的例子。它们多数不需要修改就可以在
ISAPI_Rewrite3
里使用。

发表在 article | 标签为 | ISAPI_Rewrite 中文手册2已关闭评论

ISAPI_Rewrite中文手册

 

 

安装和反安装

 

 


2.1系统要求

ISAPI_Rewrite可以被安装在下列操作系统中:

Ÿ   Windows 2000 with IIS 5

Ÿ   Windows XP with IIS 5.1

Ÿ   Windows Server 2003 with IIS 6.0

Ÿ   Windows Vista with IIS 7.0

Ÿ   Windows Server 2008 with IIS 7.0

在安装ISAPI_Rewrite之前,操作系统中必须先安装IIS。

32位和64位的Windows版本都是支持的,但是你必须下载32位版和64位版两种不同的安装包。Windows Installer 2.0必须运行安装程序。你可以从微软的网站上下载到最新版本的Windows Installer。

在Windows Vista和Windows Server 2008上安装ISAPI_Rewrite,还必须先安装下面两个模块(默认情况下这两个模块是不安装的)

Ÿ   ISAPI过滤器  

Ÿ   ISAPI 扩展

2.2安装程序

在运行安装包之前请先阅读系统要求部分。下载并安装某个版本的ISAPI_Rewrite.msi,依照安装向导的说明操作。安装过程是自动的,并有自我描述。ISAPI_Rewrite在自动安装过程中必须重启IIS。下列服务必须被重启:IISADMIN、W3SVC。不需要手工把任何ISAPI筛选器或者扩展加入到网站或者全局列表中。它能够在安装和配置过程中自动完成。

命令行安装

ISAPI_Rewrite也能够通过命令行进行后台安装。请使用以下命令行语法来安装:

msiexec /i ISAPI_Rewrite3.msi /qn AcceptEULA=Yes REGISTRATIONCODE=Code REGISTRATIO

NNAME=Name

用命令行来后台反安装ISAPI_Rewrite请使用下面的语法:

msiexec /x ISAPI_Rewrite3.msi /qn KEEPUSERFILES=Yes

2.3手工安装

要手工安装ISAPI_Rewrite的话,你必须下载不同的手工安装包包含所有必须的文件。ISAPI_Rewrite精简版不支持手工安装。你可以安装全部功能或者仅仅安装它们中的一部分。

手工安装包包含下列文件:

Ÿ   ISAPI_Rewrite.dll - 这是ISAPI筛选器本身。

Ÿ   ISAPI_RewriteProxy.dll - 这是为代理操作的ISAPI扩展模块必不可少的。

Ÿ   license.rtf - EULA的产品许可证。

Ÿ   ISAPI_Rewrite.chm - .文档文件。

Ÿ   httpd.conf - 全局配置文件示例。

安装ISAPI_Rewrite,首先你必须在你在IIS系统中注册ISAPI_Rewrite.dll作为ISAPI筛选器。按默认ISAPI_Rewrite.dll文件是用来作为全局ISAPI筛选器的。而且它还能够被安装到某个特定的网站里,你需要记住在同一时间段里只有一个ISAPI_Rewrite.dll实例能够加载到一个IIS工作进程里,这意味着如果你决定把ISAPI_Rewrite的ISAPI筛选器单独地安装到每个站点里的话,你必须把这些站点切换高隔离模式,从而为这些网站产生独立的工作进程。如果你需要在每个站点上分别安装ISAPI_Rewrite,我们通常会建议改为在整个IIS上全局地安装它。

在Window 2000,Window XP 和Windows Server 2003中注册ISAPI 筛选器,无论是整个IIS服务器要用它还是个别WEB网站要用它,都要用IIS 的MMC管理单元来把ISAPI_Rewrite.dll添到ISAPI筛选器列表。在Windows Vista和Windows Server 2008中首先你需要安装可选IIS组件:万维网服务、应用程序开发功能、ISAPI筛选器。

如果你需要代理服务器功能,你还需要将ISAPI_RewriteProxy.dll注册为ISAPI扩展来侍服文件扩展名“*. rwhlp”。在不同的IIS版本中要求不同的操作。请参阅你管理的IIS版本的文档来了解如何注册一个新的ISAPI扩展并把它映射到IIS系统的文件扩展名上。在Windows Vista和windows server 2008首先必须安装可选的IIS组件:万组网服务、应用程序开发功能、ISAPI筛选器。使用短路径名(8.3模式)作为ISAPI_RewriteProxy.dll的模块路径,如果路径里有一个空格字符,IIS载入这个模块时将失败。

把httpd.conf文件放在ISAPI_Rewrite.dll文件的同一目录下并编辑它。

把下列两行内容放到httpd.conf文件中以注册ISAPI_Rewrite 产品:

RegistrationName=Your registration name

RegistrationCode=REG-CODE-PROVIDED-FROM-HELICON

依照“运行ISAPI_Rewrite的权限需求”这一部分的说明来检查文件系统权限。

2.4反安装

反安装程序会删除所有安装程序所生成的文件、从管理元库中注销筛选器,并删除所有由安装程序所添加的其它管理元库变化。如果用户决定在反安装过程中保留用户文件的话,下列用户数据文件在反安装后会被留下来。

文件名

说明

Program Files/Helicon/ISAPI_Rewrite/httpd.conf

用户规则的主配置文件

Program Files/Helicon/ISAPI_Rewrite/error.log

包含错误日志的文件

Program Files/Helicon/ISAPI_Rewrite/rewrite.log

包含重写日志的文件

.htaccess (various folders)

用户创建的含有规则的配置文件

“删除用户创建的文件”的选项在将反安装过程中提供给用户。如果启用这个选项则卸载程序也将删除位于Program Files文件夹里用户创建的文件。 .htaccess文件不会被删除。

要用命令行后台卸载ISAPI_Rewrite,请使用下面的语法:

msiexec /x ISAPI_Rewrite3.msi /qn KEEPUSERFILES=Yes


2.5运行ISAPI_Rewrite的权限需求

在一个干净的默认Windows系统上自动安装ISAPI_Rewrite不要求任何权限调整。但是一些其它产品比如说Plesk、IIS锁定工具的安装,等等,可能收紧服务器的安全性,并妨碍ISAPI_Rewrite的正常运行。下面是ISAPI_Rewrite的权限需求的列表单子:

在Windows 2000、Windows XP和Windows 2003的IIS5兼容模式下,筛选器运行在System帐户下的inetinfo.exe进程中。那个system帐户至少得被授予放置ISAPI_Rewrite安装文件的那个文件夹的“读取”和“目录浏览”的权限。我们还建议给予system帐号对这个文件夹的一般修改权。这将允许生成一些包含解析或者其它错误的文件。system帐号还必须在任何包含了.htaccess文件的网站文件夹里同样被授予这些权限,否则ISAPI_Rewrite将不能加载并监视它。

请稍留意ISAPI_Rewrite安装目录上的任何一点拒绝权限设置,因为在Windows 操作系统中,拒绝权限优先于任何允许权限记录。

在Windows 2003的天然IIS模式(WPI模式)以及Windows Server 2008中,无论是筛选器还是代理服务都运行在每个网站相应的运行程序池的w3p.exe工作进程中,每个应用程序池都可以使用它自己的定制来配置,这可能使权限设置成了一种复杂的工作。然而,在一个正确的IIS配置中,每个使用中的定制必须是IIS_WPG组的一个成员。因此,IIS_WPG组可以被用来代替System帐号去分配前面所写的权限需求。

在Windows Vista 中权限配置是和Windows 2003的配置差不多的,只是它没有IIW_WPG组。所以,所有的WPI帐号(一般Network Service是它的惟一帐号)都必须授予上述必需权限。

此外,为了让代理服务功能能工作,你必须在网站属性或者运行代理服务的web应用程序的属性中给予一个“纯脚本”的执行权限。

 

 

使用ISAPI_Rewrite
3.1基本概念
ISAPI_Rewrite提供了一个基于规则的重写引擎能飞速重写被请求的URL。它支持几乎无限量的规则和几乎无限量的附加规则条件来提供真正灵活和有效的URL处理机制。可以根据HTTP头、服务器变量、被请求的URL本身以及其它不同的条件的测试结果来对URL作出处理。

URL数据处理是用一个文本配置文件来定制的,内含各种指令设置。配置分几种等级。首先是全局(服务器范围的)配置指令,放置在ISAPI_Rewrite安装目录里的一个名为httpd.conf的文件里。那里还有若干个标签可以封装应用到特殊位置的指令:<VirtualHost>、<Directory>、<DirectoryMatch>、<Files>、 <FilesMatch>、<Location>以及<LocationMatch>。最后ISAPI_Rewrite支持可以放在任何网站目录里的.htaccess文件,那些文件中的规则可以应用到该位置以及它的子目录中。所有的配置文件在每次修改文件后都会被自动重载。允许用第三方程序和脚本来修改文件。

在很多情况下ISAPI_Rewrite是用来重写URL的。除了重写之外,ISAPI_REWRITE能够修改、生成、删除任何其它客户端Request中的HTTP头。模块操作可以载入改写、代理、重定向或者阻断原始客户端到服务器的请求。

Rewriting可能使服务器在得到了一个客户端的源请求时用一个新的URL继续请求处理。新的URL可以包括查询串部分(跟在问号后面),也可以指向任何一个完全的静态文件或者脚本(例如asp)、或者程序(例如.exe),等等。对用户和网站配置来说重写是彻底透明的。因为它Web应用程序收到请求之前在服务器内部执行。

Proxying使URL经过内部处理后指向另一台服务器,并很快传递到远程服务器上(换言之,规则处理在这里中止了)。远程服务器的响应很快被传回客户端。代理服务器要求你指定完整的有效URL,以协议、包括主机名开头等等。ISAPI_Rewrite使用ISAPI扩展来处理代理请求,你可以在“代理服务器配置”这一章里读到更多信息。

Redirection将发送一个带有重定向指令的即时响应(HTTP响应码为302或者说301),将网址设置为一个新的位置。您可以在重定向指令里使用绝对URL格式(这是RFC2616所要求的)将请求重定向到不同的主机、端口和协议。如果此信息被忽略, ISAPI_Rewrite将自动照当前的协议、服务器名称和目录位置提供URL。重定向指令总是导致重写引擎中止处理后面的规则序列。

每个规则按它在配置文件中出现的顺序来应用。目录级配置文件从父路径开始一个接一个地处理,来自于全局配置文件的规则最先适用。

在修改URL之前ISAPI_Rewrite会保存原URL到Http头,命名为X-Rewrite-URL。然后它能够在脚本中作为HTTP_X_REWRITE_URL服务器变量取回。因为在IIS里,系统变量名不能被修改,所以ISAPI_Rewrite不能提供与Apache兼容的变量名REQUEST_URI。如果你的应用程序的设计要依赖于REQUEST_URI变量,你必须修改它,用HTTP_X_REWRITE_URL变量来代替。下面是一个PHP代码补丁的示例:

if (isset($_SERVER['HTTP_X_REWRITE_URL']))

{

$_SERVER['REQUEST_URI'] = $_SERVER['HTTP_X_REWRITE_URL'];

}

后面跟有RewriteRule(或者RewriteProxy)指令的多重RewriteCond指令只影响单个规则。如果一些条件需要被用于多个规则,必须重复写这些条件指令以应用到每条规则上。

3.2和Apache下mod_rewrite的兼容性
这个版本的ISAPI_Rewrite是为了最大程度上保持与Apache的mod_rewrite的兼容性。这个目标已经很大程度上实现了,尽管有一些功能无法执行,因为它们和Apeach以及UNIX结构高度绑定,而且它们在IIS上执行是不敏感的。举例说明:第H条:“强制内容处理”标记不能执行,因为在IIS中内容处理的范围依赖于扩展名。或者第[NS]条:“没有子请求”标记是无意义的,因为在IIS中是没有子请求的。

这里有一个完整的ISAPI_Rewrite和mod_rewrite兼容性图表。标记为绿色的功能或指令是充分支持的,黄色的功能是部分支持或计划在下一版本中支持,标示为红色的功能是不支持的。

·   兼容Perl的正则表达式 (plus extended syntax)

·   服务器级httpd.conf配置

·   虚拟网站.htaccess配置文件

·   目录.htaccess配置文件

·   <VirtualHost>

·   <Directory>

·   <DirectoryMatch>

·   <Files>

·   <FilesMatch>

·   <Location>

·   <LocationMatch>

·   AccessFileName

·   RewriteEngine

·   RewriteRule

o  $N 规则后向引用

o  %N RewriteCond 后向引用

o  ${mapname:key|default}

o  %{VARNAME} 服务器变量

o  '!' 取非

o  [C] 与下一个规则联锁

o  [CO=name:val:domain:lifetime:path] 设置cookie

o  [E=var:val] 设置环境变量

o  [F] 强制禁止应答

o  [G] 强制继续应答

o  [H=content-handler] 明确的内容处理 (不适用)

o  [L] 上一个规则标记

o  [N] 再次应用规则

o  [NC] 大小写不敏感

o  [NE] 不转义输出

o  [NS]非内部子请求

o  [P]代理通过

o  [PT] 传递通过下一个处理程序 (一直开启)

o  [QSA] 追加查询字符串

o  [R =code] 重定向

o  [S=num] 跳到下面第 n 条规则

o  [T=MIME-type] 强制明确应答 MIME 类型

·   RewriteCond

o  [NC] 大小写不敏感

o  [OR] 逻辑并集

o  %{HTTP:header}

o  '!' 非

o  '<CondPattern' 大于比较符

o  '>CondPattern' 小于比较符 

o  '=CondPattern' 等于比较符

o  '-d' 目录存在

o  '-f' 文件存在

o  '-s' 非零文件

o  '-l' 符号链接

o  '-x' 有可执行权限的文件

o  '-F' 通过子请求文件存在

o  '-U' 通过子请求URL存在

·   RewriteBase

·   RewriteMap

o  txt: 文本映射

o  rnd: 随机映射

o  int: 内部函数 toupper, tolower, escape, unescape

o  prg: 外部程序

o  dbm: 散列文件

·   RewriteLog

·   RewriteLogLevel

·   RewriteOptions

·   RewriteLock

·   AllowOverride

3.3使用环境以及处理顺序
以下是这个程序文档中要被用到的使用环境的详解:

server config

这个标志表示该指令可以用在全局httpd.conf配置文件中,但是不能用在任何一个分区(例如<Virtualhost>或者<Directory>)内部。它不允许放在.htaccess文件中。

vitrual host

这意味着指令可以出现在<VirtualHost>容器内。

directory

这个标志表示指令在<Diretory>、<Location>、<Files>容器内可用,而且它们的正则表达式是等价的。

.htaccess

使用环境标为它的指令可以出现在每个目录的.htaccess文件中。 记住当RewriteRule指令用在.htaccess配置文件中时,它将自动从路径中剥去本地目录前缀,只对剩下的部分应用规则。你可以使用RewriteBase指令显式地给这些规则指定一个基本路径。

应用次序

当同一分区内的多条指令同时适用时,理解每个分区应用的次序是很重要的,因为它会对最终效果起作用。应用次序如下所述:

1.<Directory>(正则表达式除外):多个<Directory>分区可以应用于单个请求,如果多个(非正则表达式)<Directory>分区匹配了包含文档的这个目录(或者它的上级目录中的一个),则按照从短到长的匹配次序应用指令。

2..htaccess文件按父目录到子目录的顺序应用。

3.<Files>和<FileMatch>同时被执行。

4.<Location>和<LocationMatch>也同时被执行。

先应用虚拟主机外面定义的相应分区和指令,再应用<VirtualHost>分区中的分区和指令。同一时间只有一个<VirtualHost>分区可以应用给请求。较晚的分区优先于较早的那些。

 

发表在 article | 标签为 | ISAPI_Rewrite中文手册已关闭评论

提高网站页面流量的方法

本文介绍的方法针对于blog的,但是对于一般的网站,想提高页面的访问量同样适合的!
  如何增加Blog的访问量已经是老生长谈了,其实对于blogger来说另一个统计数也至关重要:页面浏览量。

  很多的网站流量统计服务会同时提供这两项数据- “访问量”计数的是访问者的数目,而页面浏览量算的则是这些访问者所浏览的你blog上的网页的数目。
  对不同blog来说,每个访问者的页面浏览量会有所不同,但希望这个数字可以大一总不是件坏事:
  回头率: 读者浏览的页面越多,那么他再次造访的可能性也就更大。
  收入:放在blog上的广告多是印象型的,也就是说被浏览的次数多了,被点击的可能性才越大。

写blog的目的不同,所以想不想把增加页面浏览量放在第一位悉听尊便。对于那些希望这项统计值上升的人,这里有14条建议:1、内链到自己的文章
  这可能是最简单的增加页面流量的办法,那就是在自己文章里加入链接,指向自己的其它文章。自卖自夸可能有点好笑,不过如果是链接到一些之前写过的相关或相同主题的文章的话,相信还是读者们所喜闻乐见的。很多的blogger在自己的blog上会多次写到同一主题,把这些文章都链到一起无疑会显出你对这个主题的探讨深度。
2、高亮显示相关的文章
  不想在文章内部加入指向之前文章的链接的话,专门独立出一个“相关文章”(Related post)的部分就不失为一个好的替代方法了(你可以在侧栏里看到我的相关文章(related entries),而原文作者,ProbBlogger的主人的相关文章则放在了每篇文章之后,并以黄色为背景以突出显示)。Wordpress有专门的插件可以自动实现这一功能(名为related posts)。当然你要是想手动实现也是可以的,只要在文章结尾处加进一些和本文相关的可供读者参考的文章链接就可以了。

3、加入一个邮件订阅或文章更新提提示服务
  原文作者就尝到了通过邮件订阅来提高页面浏览量的甜头,凡是通过邮件订阅的读者在收到ProBlogger的最新消息的同时都会留意到一个叫作“hot posts”的部分,在这个部分中整理收入了一周当中的最受欢迎的5篇文章。因为不同读者所关注的文章不同,所以很可能一些人只看过其中的某几篇文章,加入“hot posts”之后,这部分读者就会对没看过的那些文章产生兴趣。这样一来就在增加“访问量”的同时也增加了“页面浏览量”。其它的一些通过邮件提示更新的订阅服务应该也很有效(比如Zookoda和Feedburner就都有这个功能)。
4、在醒目位置高亮显示重要文章
  ProBlogger在页面的上部有三个高亮显示的菜单栏,里面放置了一些介绍或提示性质的文章,比如什么是blog,blog设计的窍门之类。而通过作者的观察很多读者都会认真地把这里的文章看过一遍。这样一来无疑就提高了页面量。

5、“几大……”
  这种“最…”或是“几几大…”的链接到多个页面的文章似乎总是会勾起读者的兴趣。比如“二十大最受欢迎文章”往往就成为初次造访的读者必看的文章,而这又指引着他们挨着个地去看,不失为一个好办法。
6、写一个系列
  写一系列的文章来提高页面量有着两层意义。首先在写这个系列的这段时间里,读者会不时地被吸引回来,因为他们想看看你下一篇文章写了些什么; 其次,在你完成了这个系列之后,如果能很好的把这些文章都链在一起(参考1和2),这样一来读者就会从头到尾读完整个系列(当然是由多个页面组成的)。原文作者就写过一个初学者blog指南的系列,而每个从头到尾看完这个系列的读者都要看上30到40篇文章(汗)。
7、在首页上输出摘要
  在首页上只输出摘要或是只输出文章的一部分,然后通过一个“阅读完整文章”的链接链到单独的页面,这样一来想看完整文章的就得再去单独的页面。不得不说这样一来会很烦人,所以很多人都不这么做。不过对于篇幅长的文章来说,这么做不仅使首页看起来更严谨,也在无形中增加了页面量。
8、企划或专题
  和之前的系列文章相类似,比如很多主题(theme)设计者的blog就是通过建立某个主题的企划,从而吸引关注这个主题的人不时地来看看工作的进展情况。类似的比如开展讨论或者竞赛也可以达到相同的效果。不过这些牛人做这个的首要目的并不是区区页面量,页面量不过是副产品罢了。
9、在聚合中只输出摘要
  这是为我所不耻的。就连原文作者也不这么做。尽管这样一来你的页面访问可能会有所上升,但我觉得无论是对于读者还是作者来说都是得不偿失。在这样一个“你有压力,我有压力”的社会,每个人的时间都很宝贵,用聚合的目的就是节省时间和资源。所以我看到只输出摘要的blog就一个反应,把它从我的bloglines里删除。强烈建议所有的blogger都在聚合里都输出完整的文章!
10、诱使聚合读者访问页面
  相比起输出摘要的做法,我觉得这个更可取。不是通过强迫,而是通过一些技巧,比如投票,吸引读者参与评论,或是内部链接的方式来把读者带到你的页面上来。
11、互动
  读者参与的越多,回访的机率也就越大,同时页面量也就越多。参与了评论或是投票的读者很多都会回访,来看看其他人的回应。而回应本身就带来了两次页面访问量。就留言评论来说,看一遍文章就是一次页面访问,而留个言就是又一次。同样的,最好不要把这个当成吸引留言的首要目的,交流才是根本啊。互动主要发生在留言部分,当然投票以及其它的工具也应该有效果。
12、吸引读者的评论
  有几个方法可以有效地达到这个目的:比如通过插件实现在侧栏里显示最新的评论,为评论提供一个专门的聚合,或是提供邮件订阅评论的选项。
13、搜索
  通过加入搜索功能从而方便读者检索你之前写的文章也可以提高页面量。有很多方法可以实现这一功能。大多数的主题都内建了一个搜索引擎,Google的AdSense也提供了这样的一个服务,读者可以选择搜索本站或是整个网络,而且如果他们在搜索结果页面点击了广告,那么还可以给你带来一点小小的外块。
14、给你的读者留作业
  原文作者举了他的一个提供摄影技巧的blog为例,因为是为读者提供一些摄影的窍门,所以在文章的结尾布置一些“作业”以便让读者可以亲自去尝试就显得十分自然了。这样一来读者就会经常回访,一方面这种窍门或是教学多是一步步的,所以他们会经常打开你的页面,反复按照你的指导一步步地去做;另一方面,很多人都会想要向你展示一下他们的作业成果。
发表在 article | 提高网站页面流量的方法已关闭评论