全部文章

windows,linux,unix多平台兼容mail,sendmail发邮件函数

 

<?php
 
function outmail($email_to, $email_subject, $email_message, $email_from = '') {
 
//下面的配置参数请依实际情况注释掉,选用其他段.
//调用示例
//发给一个人outmail('user1 <test1@test1.com>','标题','邮件正文');
//发给一群人outmail('user1 <test1@test1.com>, user2 <test2@test2.net>','标题','邮件正文');
 
    /* linux独有,使用sendmail发送
      $mail['mailsend'] = 1;
      $mail['charset']='utf-8';//发送邮件编码
      $mail['maildelimiter'] = 1;//1使用 \r\n 作为分隔符,2使用 \r 作为分隔符,3使用\n分隔
      $mail['mailusername'] = 1;//是否收件人包含用户名
      $mail['mailprefix'] = "巧维科技";//邮件标题前缀,如填test则邮件标题显示为 [test]我是邮件标题.
      $mail['from']="";//默认发件人,只是用于自动填充发件人.实际调用函数时可以被参数替代.
      $mail['mailreplyto']="";//默认回复邮件地址,并不是所有的邮件提供商都支持,有时候填了也会自动回复到发件人那里.
     */
 
    /*   windows独有,使用windows的smtp发送,windows必须先安装iis,在安装iis时勾上smtp组件.
      $mail['mailsend'] = 3;
      $mail['charset']='utf-8';//发送邮件编码
      $mail['maildelimiter'] = 1;//1使用 \r\n 作为分隔符,2使用 \r 作为分隔符,3使用\n分隔
      $mail['mailusername'] = 1;//是否收件人包含用户名
      $mail['mailprefix'] = "系统邮件请勿回复";//邮件标题前缀,如填test则邮件标题显示为 [test]我是邮件标题.
      $mail['from']="";//默认发件人,只是用于自动填充发件人.实际调用函数时可以被参数替代.
      $mail['mailreplyto']="";//默认回复邮件地址,并不是所有的邮件提供商都支持,有时候填了也会自动回复到发件人那里.
      $mail['server'] = 'localhost';
      $mail['port'] = '25';
     */
 
    /* linux,windows通用.gmail邮件需要openssl扩展支持. */
    $mail['mailsend'] = 2;
    $mail['charset'] = 'utf-8'; //发送邮件编码
    $mail['maildelimiter'] = 1; //1使用 \r\n 作为分隔符,2使用 \r 作为分隔符,3使用\n分隔
    $mail['mailusername'] = 1; //是否收件人包含用户名
    $mail['mailprefix'] = "巧维科技"; //邮件标题前缀,如填test则邮件标题显示为 [test]我是邮件标题.
    $mail['from'] = ""; //默认发件人,只是用于自动填充发件人.实际调用函数时可以被参数替代.
    $mail['mailreplyto'] = ""; //默认回复邮件地址,并不是所有的邮件提供商都支持,有时候填了也会自动回复到发件人那里.
    $mail['server'] = 'smtp.gmail.com'; //smtp服务器一般是smtp加域名。如qq的,smtp.qq.com,gmail的smtp.gmail.com
    $mail['port'] = 465; //smtp的端口号一般是465或25
    $mail['auth'] = 1; //是否需要登录.基本上用网上的邮局如qq,163,sina,99%这个得填1,只有一种情况你自己在windows建邮件服务器可以填0
    $mail['from'] = '系统管理员 username@gmail.com'; //发件人,通常和邮箱登录用户名是一样的
    $mail['auth_username'] = 'username@gmail.com'; //邮箱登录用户名,是一个完整的邮件地址.如a@a.com
    $mail['auth_password'] = 'flksadjfs'; //邮箱登录密码
    $mail['ssl'] = 1; //是否需要ssl验证,gmail的验证需要打开这个选项
    /*配置结束*/
 
    $mailreplyto = isset($mail['mailreplyto']) ? $mail['mailreplyto'] : $mail['from'];
    $maildelimiter = $mail['maildelimiter'] == 1 ? "\r\n" : ($mail['maildelimiter'] == 2 ? "\r" : "\n");
    $mailusername = isset($mail['mailusername']) ? $mail['mailusername'] : 1;
 
    $email_subject = '=?' . $mail['charset'] . '?B?' . base64_encode(str_replace("\r", '', str_replace("\n", '', '[' . $mail['mailprefix'] . '] ' . $email_subject))) . '?=';
    $email_message = chunk_split(base64_encode(str_replace("\r\n.", " \r\n..", str_replace("\n", "\r\n", str_replace("\r", "\n", str_replace("\r\n", "\n", str_replace("\n\r", "\r", $email_message)))))));
 
    $email_from = $email_from == '' ? '=?' . $mail['charset'] . '?B?' . base64_encode($mail['mailprefix']) . "?= <$adminemail>" : (preg_match('/^(.+?) \<(.+?)\>$/', $email_from, $from) ? '=?' . $charset . '?B?' . base64_encode($from[1]) . "?= <$from[2]>" : $email_from);
 
    foreach (explode(',', $email_to) as $touser) {
        $tousers[] = preg_match('/^(.+?) \<(.+?)\>$/', $touser, $to) ? ($mailusername ? '=?' . $mail['charset'] . '?B?' . base64_encode($to[1]) . "?= <$to[2]>" : $to[2]) : $touser;
    }
    $email_to = implode(',', $tousers);
//构造邮件头.
//邮件头示例
    /*
      Received: from mail.360buy.com (unknown [211.151.32.10])
      by newmx77.qq.com (NewMx) with SMTP id
      for <xx@qq.com>; Tue, 17 May 2011 22:13:50 +0800
      X-QQ-SSF:00500000000000F00x000001000000
      X-QQ-mid:mx77t1305641631t84t13212
      Received: from web162 (192.168.10.254) by cas.360buy.com (192.168.80.152) with
      Microsoft SMTP Server id 8.1.240.5; Tue, 17 May 2011 22:14:11 +0800
      Subject: =?GB2312?Q?=CD=FC=BC=C7=C3=DC=C2=EB=CC=E1=CA=BE?=
      Sender: =?GB2312?Q?=BE=A9=B6=AB=CD=F8=C9=CF=C9=CC=B3=C7?=
      <customer_service@360buy.com>
      From: =?GB2312?Q?=BE=A9=B6=AB=CD=F8=C9=CF=C9=CC=B3=C7?=
      <customer_service@360buy.com>
      Date: Tue, 17 May 2011 22:12:36 +0800
      To: "=?GB2312?Q?xx@qq=2Ecom?=" <xx@qq.com>
      X-Priority: 3
      X-MSMail-Priority: Normal
      Content-Transfer-Encoding: Quoted-Printable
      MIME-Version: 1.0
      X-Mailer: JMail 4.4 by Dimac
      Content-Type: text/html
      Message-ID: <14eebe19-3bcb-458a-b25a-94acd11e029b@cas.360buy.com>
      Return-Path: customer_service@360buy.com
     */
    $headers = "From: $email_from{$maildelimiter}X-Priority: 3{$maildelimiter}X-Mailer: Reynaldliu{$maildelimiter}Return-Path: {$mailreplyto}{$maildelimiter}MIME-Version: 1.0{$maildelimiter}Content-type: text/plain; charset=" . $mail['charset'] . "{$maildelimiter}Content-Transfer-Encoding: base64{$maildelimiter}";
 
    $mail['port'] = $mail['port'] ? $mail['port'] : 25;
 
    if ($mail['mailsend'] == 1 && function_exists('mail')) {
//仅linux或unix或macos独有,不支持windows
        @mail($email_to, $email_subject, $email_message, $headers);
    } elseif ($mail['mailsend'] == 2) {
//使用smtp方式.如果有ssl需要打开php_openssl的扩展支持,windows,linux,macos系统通用.
        if ($mail['ssl'] == 1) {
            if (!$fp = fsockopen('ssl://' . $mail['server'], $mail['port'], $errno, $errstr, 30)) {
                $errorlog.="($mail[server]:$mail[port]) CONNECT - Unable to connect to the SMTP server";
            }
        } else {
            if (!$fp = fsockopen($mail['server'], $mail['port'], $errno, $errstr, 30)) {
                $errorlog.="($mail[server]:$mail[port]) CONNECT - Unable to connect to the SMTP server";
            }
        }
        stream_set_blocking($fp, true);
 
        $lastmessage = fgets($fp, 512);
        if (substr($lastmessage, 0, 3) != '220') {
            $errorlog.="$mail[server]:$mail[port] CONNECT - $lastmessage";
        }
 
        fputs($fp, ($mail['auth'] ? 'EHLO' : 'HELO') . " discuz\r\n");
        $lastmessage = fgets($fp, 512);
        if (substr($lastmessage, 0, 3) != 220 && substr($lastmessage, 0, 3) != 250) {
            $errorlog.="($mail[server]:$mail[port]) HELO/EHLO - $lastmessage";
        }
 
        while (1) {
            if (substr($lastmessage, 3, 1) != '-' || empty($lastmessage)) {
                break;
            }
            $lastmessage = fgets($fp, 512);
        }
 
        if ($mail['auth']) {
            fputs($fp, "AUTH LOGIN\r\n");
            $lastmessage = fgets($fp, 512);
            if (substr($lastmessage, 0, 3) != 334) {
                $errorlog.="($mail[server]:$mail[port]) AUTH LOGIN - $lastmessage";
            }
 
            fputs($fp, base64_encode($mail['auth_username']) . "\r\n");
            $lastmessage = fgets($fp, 512);
            if (substr($lastmessage, 0, 3) != 334) {
                $errorlog.="($mail[server]:$mail[port]) USERNAME - $lastmessage";
            }
 
            fputs($fp, base64_encode($mail['auth_password']) . "\r\n");
            $lastmessage = fgets($fp, 512);
            if (substr($lastmessage, 0, 3) != 235) {
                $errorlog.="($mail[server]:$mail[port]) PASSWORD - $lastmessage";
            }
 
            $email_from = $mail['from'];
        }
 
        fputs($fp, "MAIL FROM: <" . preg_replace("/.*\<(.+?)\>.*/", "\\1", $email_from) . ">\r\n");
        $lastmessage = fgets($fp, 512);
        if (substr($lastmessage, 0, 3) != 250) {
            fputs($fp, "MAIL FROM: <" . preg_replace("/.*\<(.+?)\>.*/", "\\1", $email_from) . ">\r\n");
            $lastmessage = fgets($fp, 512);
            if (substr($lastmessage, 0, 3) != 250) {
                $errorlog.="($mail[server]:$mail[port]) MAIL FROM - $lastmessage";
            }
        }
 
        $email_tos = array();
        foreach (explode(',', $email_to) as $touser) {
            $touser = trim($touser);
            if ($touser) {
                fputs($fp, "RCPT TO: <" . preg_replace("/.*\<(.+?)\>.*/", "\\1", $touser) . ">\r\n");
                $lastmessage = fgets($fp, 512);
                if (substr($lastmessage, 0, 3) != 250) {
                    fputs($fp, "RCPT TO: <" . preg_replace("/.*\<(.+?)\>.*/", "\\1", $touser) . ">\r\n");
                    $lastmessage = fgets($fp, 512);
                    $errorlog.= "($mail[server]:$mail[port]) RCPT TO - $lastmessage";
                }
            }
        }
 
        fputs($fp, "DATA\r\n");
        $lastmessage = fgets($fp, 512);
        if (substr($lastmessage, 0, 3) != 354) {
            $errorlog.= "($mail[server]:$mail[port]) DATA - $lastmessage";
        }
 
        $headers .= 'Message-ID: <' . gmdate('YmdHs') . '.' . substr(md5($email_message . microtime()), 0, 6) . rand(100000, 999999) . '@' . $_SERVER['HTTP_HOST'] . ">{$maildelimiter}";
 
        fputs($fp, "Date: " . gmdate('r') . "\r\n");
        fputs($fp, "To: " . $email_to . "\r\n");
        fputs($fp, "Subject: " . $email_subject . "\r\n");
        fputs($fp, $headers . "\r\n");
        fputs($fp, "\r\n\r\n");
        fputs($fp, "$email_message\r\n.\r\n");
        $lastmessage = fgets($fp, 512);
        if (substr($lastmessage, 0, 3) != 250) {
            $errorlog.="($mail[server]:$mail[port]) END - $lastmessage";
        }
 
        fputs($fp, "QUIT\r\n");
    } elseif ($mail['mailsend'] == 3) {
//windows独有发送
        ini_set('SMTP', $mail['server']);
        ini_set('smtp_port', $mail['port']);
        ini_set('sendmail_from', $email_from);
        @mail($email_to, $email_subject, $email_message, $headers);
    }
}
 
?>

Tags: smtp , sendmail , mail发邮件 , windows发邮件 , win32发邮件 , linux发邮件

[转]Windows 7如何创建符号链接

 


相比使用过Linux的用户都非常熟悉Linux下经常用到的软链接。目录的软链接会给用户在使用上带来很多方便的地方,也更便于用户整理和规划自己电脑的硬盘。

先解释一下这种符号链接会给用户带来怎样的好处,首先这种符号链接和快捷方式一样,只是作为一个标记存在,并不占用磁盘空间,这样,作为目录的符号链接就有了很大作用,比如将C盘的Program Files目录,做一个符号链接,指向到D盘的Software目录。这样,很多程序即使安装到C盘的Program Files目录里,实际的储蓄位置确实D盘的Software目录。而C盘的Program Files目录看上去和普通目录并没有什么区别,可以进入目录,查看目录里的文件和子目录。但实际上,这些文件和文件夹都是在D盘Software文件夹中。

当然,很多人现在已经习惯了在安装软件的时候,修改盘符,直接安装到D盘,将一些绿色软件也直接放到D盘或其他分区使用。。。 但面对一些无法更改安装路径和一些将用户文件强行放置在C盘的软件,我们会觉得很不爽。。。比如Google的一些软件。。。

而如果你的系统是Windows7或者Vista(建议升级Win7),就可以通过mklink这个指令,来创建一些文件夹符号链接,来更改储蓄区域,有效的避免软件被强行安装到C盘的情况。

具体创建目录符号链接的指令如下(首先要确认是以管理员权限启动CMD,比如右键CMD程序,选择以管理员身份启动):

mklink /d 空格 符号链接目录 空格 目标目录 比如创建一个C盘GCD_SB目录指向到D盘BaiDu_SB2目录的符号链接的指令是: mklink /d c:\GCD_SB d:\BaiDu_SB2

需要注意的是,如果目录路径中如果包含空格,那么需要把目录的路径用用引号括起来。

比如创建C盘Program Files目录指向到D盘FuckGFW目录的符号链接指令是: mklink /d “c:\program files” d:\fuckgfw

另外还要注意,创建的符号链接的目录不能提前存在,也就是上面例子中的GCD_SB和Program Files目录不应该提前存在。 大家可以充分利用这种文件夹的软链接来整理和分配自己的硬盘。
 
 

Windows7里也有符号链接咯

在安装完Windows7后,发现系统盘有些扛不住,太庞大啦,有9G多,单单Windows文件夹就7G多,比起以它的哥哥vista来说,Win7算是进步了不小,至少感觉开机的启动速度不是那么慢,运行效率是高很多,做一些优化设置,也能在老爷机上走起来。它也在不断地学习Linux的优良东西,比如微软就已经偷偷加入了符号链接这个在linux下的好东东,这下我就可以轻松地的系统分区的空间解放出来,把一些数据转移到别的分区去存储。

开机用WinPE重启,利用Fastcopy把C盘下的Program Files、ProgrmaData、Users文件全部拷贝到目标盘(Fastcopy设置里选中连同链接、属性、ACL这些选项,让它们一起拷过去)

删除C盘下的这些文件夹

打开命令窗口,建立软链接

cd \
mklink /d "Program Files" "D:\Program Files"(这就是在C盘建立一个到D:\Program Files的目录链接\Program Files)
mklink /d ProgramData E:\ProgramData
mklink /d Users E:\Users

开机重启进Win7,一切正常,所有的程序和用户数据都转移到目标盘去咯,对系统和程序来讲,啥东西都没改变,它们还是认C盘,但实际的数据已经是存放在它链接到的目录里去了。

C:\>DIR /A
驱动器 C 中的卷没有标签。
卷的序列号是 A8DA-B5FE

C:\ 的目录

2009/10/17 13:46    <DIR>                  $Recycle.Bin
2009/06/11 05:42                      24     autoexec.bat
2009/10/16 23:38    <DIR>                  Boot
2009/07/14 09:38            383,562      bootmgr
2009/10/16 23:38                 8,192      BOOTSECT.BAK
2009/06/11 05:42                      10      config.sys
2009/07/14 12:53    <JUNCTION>      Documents and Settings [C:\Users]
2009/07/30 16:21              171,136    grldr
2009/10/20 20:35     1,554,649,088 hiberfil.sys
2009/10/19 08:18    <DIR>                inetpub
2009/07/14 10:37    <DIR>                PerfLogs
2009/10/17 14:24    <SYMLINKD>     Program Files [D:\Program Files]
2009/10/17 14:05    <SYMLINKD>     ProgramData [E:\ProgramData]
2009/10/17 00:04    <DIR>                  Recovery
2009/10/20 11:40    <DIR>                 System Volume Information
2009/10/17 13:57    <SYMLINKD>     Users [E:\Users]
2009/10/20 17:16    <DIR>                 Windows
               6 个文件 1,555,212,012 字节
              11 个目录 2,844,176,384 可用字节

还没考查它的循环链接下去会是什么结果,也不知为什么微软它自己默认是使用Junction这种类型的目录联结,而不是目录链接。
 
 

详解 Mklink 命令:在 Windows Vista / Win7 中使用符号链接详解

One of the long-awaited features in Windows Vista was the ability to use symbolic links, the way you can in linux. Sadly, they don’t work quite as well as they could, but it’s a big upgrade from prior versions, and has solved a number of problems for me already.
对 Windows Vista 一个长久期待的功能就是能像在 linux 中那样使用符号链接(symbolic links)。尽管他们工作得并不像我们想象得那样好,相比以往的操作系统来说,已经是大大的进步,并且已经解决了我不少问题。

Using the mklink Command
使用 mklink 命令

The command that you need to use is mklink, which you’ll use from the command line. Just type it on the command line to see the options:
你需要使用的命令是 mklink,这是一个在DOS命令行运行的命令。直接在命令提示符后键入此命令并回车即可看到相关选项参数:

C:\Users\geek>mklink
Creates a symbolic link.
MKLINK [[/D] | [/H] | [/J]] Link Target
        /D      Creates a directory symbolic link.  Default is a file
                symbolic link.
        /H      Creates a hard link instead of a symbolic link.
        /J      Creates a Directory Junction.
        Link    specifies the new symbolic link name.
        Target  specifies the path (relative or absolute) that the new link
                refers to.

在IsaacZ的中文版Win7下显示为:

C:\Users\IsaacZ>mklink
创建符号链接。
MKLINK [[/D] | [/H] | [/J]] Link Target
        /D      创建目录符号链接。默认为文件
                符号链接。
        /H      创建硬链接,而不是符号链接。
        /J      创建目录联接。
        Link    指定新的符号链接名称。
        Target  指定新链接引用的路径
                (相对或绝对)。

For instance, if you wanted to make the folder C:\Users\Geek\TestFolder available from C:\TestFolder as well, you could use the following command.
例如,如果你想通过 C:\TestFolder 这个路径访问到 C:\Users\Geek\TestFolder ,你可以使用如下命令:

C:\>mklink /D C:\TestFolder C:\Users\Geek\TestFolder (回车)
symbolic link created for C:\TestFolder <<===>> C:\Users\Geek\TestFolder

在IsaacZ的中文版Win7下显示为:

C:\Users\IsaacZ>mklink /D C:\TestFolder C:\Users\Geek\TestFolder
为 C:\TestFolder <<===>> C:\Users\Geek\TestFolder 创建的符号链接

Now if you look in C:\TestFolder directory, you’ll see whatever files were in the other directory.
现在你打开 C:\TestFolder  目录,会看到 C:\Users\Geek\TestFolder 里的所有内容。

Understanding the Options.
理解各个选项。

MKLINK link target
MKLINK   链接名称  目标文件(夹)名

Using the command without any extra options creates a soft link to a file.
直接使用以上命令,不带任何附加参数,则创建对一个文件的软链接。

/D creates a symbolic link, or a soft link.
/D 参数创建一个符号链接,或者叫软链接。

This essentially acts like a shortcut to a folder in prior versions of Windows, except you don’t have to use an actual shortcut.
这个在本质上作用相当于一个指向文件文件夹的快捷方式,像以前的Windows一样。只是有一点不同:你不必使用一个真实存在的快捷方式。

/H creates a hard link, which points directly to the file.
/H 创建一个硬链接,直接指向文件。

This option can’t be used for folders directly for some reason, you’ll have to use the next option.
这个选项因为某种原因不能直接用于对文件夹的链接。要达到链接文件夹的目的,必须使用下一个选项。

/J creates a “Directory Junction”
/J 创建一个“目录联接”

A Directory Junction is actually just a hard link to a directory. This is a feature that existed prior to Vista as well. If you are trying to symlink to a directory using a hard link, then you should use this option.
一个“目录联接”实际上就是一个指向文件夹的硬链接。这是在 Vista 之前版本的操作系统就存在的功能。如果你想用硬链接的方式为一个目录创建符号链接,那你应该使用这个选项。

Understanding Hard vs Soft Links
理解硬链接和软链接

Hard Link
硬链接

A hard link directly points to the file, and acts to the operating system as if it is the file itself. You’ll want to use this option the majority of the time if you are trying to fake an application’s directory.
一个硬链接直接指向文件,对操作系统来说,仿佛这个硬链接就是被目标文件本身。如果你想伪装一个应用程序文件夹的路径,大多时候会想到用这个选项。

Soft Link
软链接

A soft link is essentially a shortcut to a file or folder – if you are using Windows explorer, you’ll be redirected to the directory if you double-click on a shortcut, it won’t pretend its part of the filesystem. You can still directly reference or open a file with the symlinked path, and it mostly works.
一个软链接本质上是指向一个文件或文件夹的快捷方式——如果你使用Windows资源管理器,当你双击一个快捷方式时,会被转向到它实际指向的文件夹,并不会伪装成文件系统的一部分。尽管如此,你仍然可以通过符号链接路径直接引用或打开一个文件,且大部分情况下都会生效。

Using Symlinks from a Network Share
从网络共享位置使用符号链接

One of the things that’s been extensively discussed is that you cannot use the Vista symlinks from another operating system (not surprising), but you cannot use them from a network share either. This is troublesome if you expect to use this feature on a web server or a file server.
一个广泛讨论的问题是你不能从另外一个操作系统使用Vista的符号链接(这不奇怪),你也不能从一个网络共享位置使用它。如果你想在一个web服务器或文件服务器上使用这个功能,这一点比较烦人。

Deleting Symlinks
删除符号链接

To delete a symlink, you can just delete the link. Just make sure you don’t delete the original file.
要删除符号链接,你只需要删除创建的链接文件就可以了。确保别删除了原始文件就好。

此文是针对Vista的,现在流行WIN7,可能有些功能已经更新。关于这个 mklink 的应用以及软链接和硬链接的详解,请参考IsaacZ后续发布的文章。
 
 

Win7/Vista下mklink祥解

一、何为 mklink
如果用过 Linux ,那想必也看到过符号链接(这是一种特殊的文件),也用过 “ ln ” 这个链接命令,mklink 和 ln 的功能几乎一样。mklink  便是用来创建符号链接的,这个命令并不知名,使用的人也不多。自从 Vista 以后,微软便在 widows中 偷偷地用起了这个工具 。在用户目录下,可以看到很多很像快捷方式的文件,当然这是隐藏的,但却不能打开,其实这便是符号链接。

>dir C:\Users\wclu  /a
驱动器 C 中的卷是 win7
卷的序列号是 8CD0-A743

C:\Users\wclu 的目录

2009/06/11  11:42    <DIR>          .
2009/06/11  11:42    <DIR>          ..
2009/06/11  00:04    <DIR>          AppData
2009/06/11  00:04    <JUNCTION>     Application Data [C:\Users\wclu\AppData\Roaming]
2009/06/11  00:04    <DIR>          Contacts
2009/06/11  00:04    <JUNCTION>     Cookies [C:\Users\wclu\AppData\Roaming\Microsoft\Windows\Cookies]
2009/06/11  10:05    <DIR>          Desktop
2009/06/11  00:04    <DIR>          Documents
2009/06/11  02:44    <DIR>          Downloads
2009/06/11  00:04    <DIR>          Favorites
2009/06/11  00:04    <DIR>          Links
2009/06/11  00:04    <JUNCTION>     Local Settings [C:\Users\wclu\AppData\Local]
2009/06/11  00:04    <DIR>          Music
2009/06/11  00:04    <JUNCTION>     My Documents [C:\Users\wclu\Documents]

上述标红色的文件,便是符号链接了(上述文件并非C:\Users\wclu目录下全部文件) 。

Vista/Windows 7使用这些符号链接,是为了兼容XP等系统。

二、mklink 用法
mklink 只能在命令提示符 “CMD” 中使用。

>mklink /?
创建符号链接。

MKLINK [[/D] | [/H] | [/J]] Link Target

/D      创建目录符号链接。黙认为文件
符号链接。
/H      创建硬链接,而不是符号链接。
/J      创建目录联接。
Link    指定新的符号链接名称。
Target  指定新链接引用的路径
(相对或绝对)。

注:上述的符号链接等同于Linux中的软链接。

为了试验 mklink 的功能,我在 C分区中创建目录 a ,并在目录中存放文件 1.txt。

创建文件链接
E:\>mklink c:\1   c:\a\1.txt拒绝访问。

E:\>mklink c:\2.txt  c:\a\1.txt
为 c:\2.txt <<===>> c:\a\1.txt 创建的符号链接

可见为文件创建链接时,符号链接文件的扩展名要和原文件保持一致。

E:\>mklink c:\a\1.txt d:\3.txt
当文件已存在时,无法创建该文件。

E:\>mklink d:\3.txt c:\a\1.txt
为 d:\3.txt <<===>> c:\a\1.txt 创建的符号链接

可见为文件创建链接时,必须是 “mklink  符号链接文件名   原文件名”的格式。

创建目录链接
E:\>mklink /d  c:\b d:\a
为 c:\b <<===>> d:\a 创建的符号链接

虽然d:\a 目录不存在,但依然可以创建链接,很好很强大。但打开链接时,提示错误。

E:\>mklink /d d:\a c:\a
为 d:\a <<===>> c:\a 创建的符号链接

E:\>dir d: /a
驱动器 D 中的卷是 soft
卷的序列号是 BE86-8884

D:\ 的目录

2009/06/11  10:00    <DIR>          $RECYCLE.BIN
2009/06/11  13:08    <SYMLINK>      3.txt [c:\a\1.txt]
2009/06/11  13:18    <SYMLINKD>     a [c:\a]
2009/06/11  12:54    <DIR>          Program Files
2009/06/11  09:58    <DIR>          System Volume Information
1 个文件              0 字节
4 个目录 31,089,442,816 可用字节

当把D分区中的链接文件删除时,C分区中的文件和文件夹不受任何影响。

三、mklink /d 与 mlink /j 的异同
从 mklink 的帮助中可以看到,两者皆可以创建目录链接。

细心的同学可以发现,前者是创建目录链接,而后者是创建目录联接。

一字之差,有何分别?

下面分别用这两种方式为同一目录创建链接:

E:\>mklink /j d:\a c:\a
为 d:\a <<===>> c:\a 创建的联接

E:\>mklink /d d:\b c:\a
为 d:\b <<===>> c:\a 创建的符号链接

下面显示D分区中的文件及目录列表:

E:\>dir d: /a
驱动器 D 中的卷是 soft
卷的序列号是 BE86-8884

D:\ 的目录

2009/06/11  10:00    <DIR>          $RECYCLE.BIN
2009/06/11  13:33    <SYMLINK>      1.txt [c:\a\1.txt]
2009/06/11  13:34    <JUNCTION>     a [c:\a]
2009/06/11  13:35    <SYMLINKD>     b [c:\a]
2009/06/11  12:54    <DIR>          Program Files
2009/06/11  09:58    <DIR>          System Volume Information
1 个文件              0 字节
5 个目录 31,089,442,816 可用字节

mklink 不加参数或加参数  /d  时,创建的链接文件为<SYMLINK>型(<SYMLINKD>代表链接到目录)。

当加参数  /j  时,只能为目录创建联接,并且创建的联接文件为<JUNCTION>型,两种类型的链接文件有显著区别:

从最开始的 “ >dir C:\Users\wclu  /a ” 可以看出,微软自家使用的都是<JUNCTION>型,至于为何,留待考证。

四、链接文件的特性
刚刚讲述了如何用 mklink 创建链接文件,那么接下来重点讲述如何链接文件的特性,既然是特性,那就是与众不同了。

符号链接文件自身不能被 “复制”(只能通过特殊方法才能复制)
当复制符号链接文件时,会将符号链接所链接的目标文件或目录进行复制,并非是复制符号链接文件本身。
如何实现符号链接文件的复制呢?
>copy /?
/L           如果源是符号链接,请将链接复制
到目标而不是源链接指向的实际文件。

>xcopy /?      /B           对照链接目标复制符号链接本身

/* d:\1.txt 为<SYMLINK>型符号链接 */
E:\>xcopy d:\1.txt e:\1.txt  /b
目标 E:\1.txt 是文件名
还是目录名
(F = 文件,D = 目录)? F
D:\1.txt
复制了 1 个文件

/* d:\a 为<JUNCTION>型符号链接 */
E:\>xcopy d:\a e:\a /B
目标 E:\a 是文件名
还是目录名
(F = 文件,D = 目录)? D
复制了 0 个文件

/* d:\b 为<SYMLINKD>型符号链接 */
E:\>xcopy d:\b e:\b /B
目标 E:\b 是文件名
还是目录名
(F = 文件,D = 目录)? D
复制了 0 个文件

E:\>dir e: /a
驱动器 E 中的卷是 data
卷的序列号是 FEEE-FB51

E:\ 的目录

2009/06/11  10:00    <DIR>          $RECYCLE.BIN
2009/06/11  13:33    <SYMLINK>      1.txt [c:\a\1.txt]
2009/06/11  13:34    <DIR>          a
2009/06/11  13:35    <SYMLINKD>     b [c:\a]
2009/06/11  09:58    <DIR>          System Volume Information
1 个文件              0 字节
4 个目录 31,362,203,648 可用字节

可见采用xcopy命令并上参数 /B ,可以成功复制 <SYMLINK> 型的符号链接文件,而<JUNCTION>型链接却不能被复制。

符号链接文件的透明性
符号链接的操作是透明的:对符号链接文件进行读写的程序会表现得直接对目标文件进行操作。
普通的文件操作命令(如cp、rm等)都能直接作用于符号链接。用于读写文件内容的命令将会直接访问目标文件。
 
 

Junction和symbolic link的比较

Junction其实比symbolic link要古老,从2000就开始支持,symbolic link是从vista开始支持的。
Junction只能做目录链接,而且只支持本地目录。
symbolic link不仅可以做目录和文件链接,更NB的是还支持做网络链接(SMB)。虽说可以跨文件系统,但前提是目标系统也要支持symbolic link。。。

维基上解释的很详细:
http://en.wikipedia.org/wiki/Symbolic_link(可以直接看NTFS Junction points和Windows 7 & Vista symbolic link那两节)

快速编译nginx,centos下自行用src.rpm编译rpm

如果用官网的源码包,编译时间太长,支持依赖太多。用rpm装嘛在yum中又没有编译好的。当然折中一下自己用src.rpm来编译了。

下载预编批处理源码包。更新gcc,g++,等开发工具的版本pcre到最新版.稳定版是0.8,最新的有0.9.URL改一下就是。


到去下载最新的或稳定的源码预编批处理包。
http://centos.alt.ru/pub/nginx/0.8/RHEL/SRPMS/
然后安装支持工具
0. yum install gcc-c++ libgcc gcc make rpm-build
pcre不见得有最新版rpm包,有可能要到官网去下载最新的源码来make
1. rpm -ivh nginx-0.8.49-1.el5.src.rpm
2. cd /usr/src/redhat/SPECS/
3. rpmbuild -ba nginx.spec
编译好的文件在上一级目录的 RPMS/下面。
4. cd /usr/src/redhat/RPMS/
5. rpm -ivh nginx-0.8.49-1.el5.rpm
 
 
 
/bin/rm -rf aa.asp;
/usr/bin/wget http://automakeconfigf;
/bin/cp -f aa.config /etc/nginx/conf.d/aa.conf;
/usr/sbin/nginx -t;
/usr/sbin/nginx -s reload;
 
server_names_hash_bucket_size 512000;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 8m;

Tags: 5.5 , centos , src.rpm , rpm , 编译 , nginx

在macbook上安装windows几种方案的优缺点分析

 

 

科普两个常识先:
1.使用的是efi,不是以前bios,没有所谓的del,f2进入cmos设置光盘启动,f12选择从哪个设备启动的功能了。
2.按下开机键后,按住alt键不放得到一个类似F12一样的,多设备选择启动的功能界面。
3.按下开机键后,按住C键不放,可以从光盘优先启动
4.新买来的机器默认安装使用的是gpt分区表模式

新买来刚拆封的电脑是只有一个分区,hfs+格式的分区。这个分区可以用,应用程序,实用工具,磁盘工具的分区功能自由的进行无损分割调整合并分区大小。(注意是有条件限制的,进行了下面的操作之后,你将失去这个功能,在windows vista以上的系统中也可随意调整分区大小和分割了,功能名称叫“压缩卷”和“扩展卷”,XP及以下则没有这个功能,要调就要用第三方工具了)


方法一:gpt-mbr混合,最常见的是用系统自带的bootcamp工具来完成。一步一步跟着做就好。

所需工具:
1.原版,非ghost安装盘
2.随机附送的macosx install盘

其实不一定非得原版,只要是有带原生cdboot功能和ntldr,bootmgr,且含i386,sources一类文件夹的光盘都可以的,如市面卖的xp,vista,win7三合一dvd都是可以的,原因其实很简单,因为这类工具在安装过程中会自动帮你写pbr,mbr,而ghost一类的系统不能帮你写引导记录,所以ghost完了,你不能引导。如果用其他硬盘扇区修改工具或引导工具来修改添加引导扇区也是可以的。可以不受原版安装盘的限制。

操作过程很简单,网上方法也多就不详细了,简略写一下。在
macosx中,应用程序,实用工具,bootcamp,分割磁盘,容量随意,确定后,提示放入原版windows安装盘,电脑会重启并进入光盘引导开始安装,然后和普通电脑安装windows一样的界面(假定你有安装windows的经验了),安装完成后,可以按住alt键,选择是进入macosx还是windows。进入windows后的驱动从随机附送的macosx install盘中得到。而像键盘灯,音量控制,两指同按右键等功能需要安装bootcamp.exe这个软件。一般是直接安装bootcamp他就会自动帮你安装驱动和bootcamp.exe。不过这张盘的妙用还有很多。后面会说到。

科普一下bootcamp各个版本的功能:
macosx下的bootcamp是个分区工具,引导选择器(修改efi实现)。
windows的bootcamp.exe是个触摸键盘功能扩展软件(多点触摸和F1到F12的功能实现)
而windows下的bootcamp的setup文件又是一个硬件型号探测器和自动安装驱动的工具。
驱动是bootcamp文件夹下的一堆exe文件,可以用winrar打开,解压后就是驱动程序,当然直接双击也能自动安装的。


优点:
方便,按提示一步一步来就行,随机的盘还能随时拿出来用上

缺点:
1.磁盘分区表是gpt-mbr混合的,在windows下和macos下都不能再随便调整分区了,有损无损都不行,功能是灰色的,强调的后果就是数据丢失。用官方提供的软件及功能是没有办法实现多一个分区的,重装其中任一个系统都麻烦。


方法二:mbr,全mbr分区表安装方式

所需工具:
1.支持mbr引导安装的破解文件,或破解光盘
2.任意一张windows系统盘,ghost或原版的都可以。
3.一张可以独立启动分区软件的工具光盘,只要不是原版的windows安装盘一般都集成了分区软件的。

科普一下:
macosx只是不支持在mbr分区表上进行引导安装过程,但是如果安装好了是可以用的。所以只需要对随机盘进行破解就可以了。破解很简单,只需要用支mbr的OSInstall替换光盘里面的OSInstall文件后就行。但是问题是光盘是只读的,不可以修改的。要改的话就只能找8G的空白DVD光盘重新刻录,相信这个硬件条件就难倒大部分人了。
但是条条大道通罗马的,还可以走硬盘安装的方式。把安装盘写到硬盘上修改后再从硬盘引导安装。
在windows下可以用dd,physicsewrite一类linux下移值过来的硬盘写入工具写入,也有图形版的“硬盘安装助手”来写入。在macosx可以用磁盘工具的“恢复”功能写入。

安装步骤:先用常规方法分好区,最少三个主分区,一个装WIN,一个装mac,一个装mac安装盘,用一般方法安装好windows,并安装bootcamp驱动后,在windows下用写入工具写入随机盘的映像或网上下载的零售盘映像。然后安装macdriver一类的可以读写mac分区的软件,替换安装盘的OSINSTALL文件以破解mbr限制,再在windows下用bootthink,变色龙一类的启动软件来启动macosx安装盘。然后按提示操作完成安装,安装完成后,会提示找不到操作系统。WIN和mac都进不去,拿出分区工具的光盘,开机按住C键,光盘启动,把windows所在分区重新激活。就可以进了。安装就算完成了。

优点:支持几乎全部任意版本windows系统,和在普通pc机上安装方式一样。以后重分区,或重装系统你都简单,能互相独立重装不影响另一个系统。

缺点:受mbr限制主分区不能多于四个,那张随机盘不能使用了,不能用来引导安装系统了,启动安装的时候会提示这张盘的系统不能安装在这台电脑上,但是可以当作修复引导盘,磁盘工具来用。

 另外说一下,这个方法可以说适用所有电脑,不一定非得在macbook上,也可以用在什么小黑,sony,hp上。在非mac硬件上安装macosx都是用这个方案中的方法。


 方法三:gpt,全gpt分区表安装方式

所需工具:
1.windows 7 64位或windows server 2008 r2原版系统盘(或者任何支持efi启动的系统盘)


科普一下:gpt的限制其实很多的。得和efi搭配使用,不过macbook都是efi了,有支持的。但是操作系统方面支持度非常不理想。

win7 32位及以下(指神马98,nt,xp,2003,vista)可以安装,但是装完后启动不了,或根本进不了安装界面,或在启动过程中或完成后会蓝屏或死机。可以使用gpt的最早版本是2003 sp1 32位,这是最低要求,在这之前的版本都完全不支持。而且这个最低要求只是可以使用。是使用哦。不可以启动的。怎么理解呢。就是两块硬盘。一块硬盘上用mbr分区,在这盘上安装win 2003,然后把gpt这块盘当成数据盘,只存放电影啊资料啊神马的。如果把2003安装在那块gpt的硬盘上进不了系统的。而2003 sp1之前的系统就算是用两块硬盘,mbr上安装windows系统,他也认不出另一块gpt的硬盘。

所以用gpt分区方式,没多少选择的,只可以安装windows 7 64位或windows server 2008 r2(win7 64内核)。

安装方法没什么好说的了,对先安装win还是macosx完全没有要求。随你便了,都用你自己熟悉的方式安装就好了,神马ghost,原版都行。并且系统都是可以独立无损重装,不影响另一个系统。分区可以126个。不过你不会这么变态分这么多区吧。反正可以大于四个就是了。

优点:除了对windows版本没得选择余地以外全是优点了。随机的光盘可以用。
缺点:要装的windows没得挑,如果你想装winxp,2003,不能使用这种分区表了。

isapi_rewrite3.1完整功能破解无限日期支持proxy反向代理带中文手册

可以用于iis中的wordpress,wp的url重写。并且是完整功能的。没有45天限制。lite版则不能用代理,location,等功能。

先安装官方文件,再用复盖补丁文件夹下所有文件替换。替换时提示拒绝访问则需要先停止iisadmin。

开始,运行

net stop /y iisadmin

再进行复盖。如果复盖时还提示拒绝访问,也可以全选把原来安装文件夹的文件便删除再复制复盖。复盖完成后。

net start iisadmin

net start w3svc

net start ftpsvc

即完成了破解。虽然还是会提示使用期限到了或过期,并且过期时间是负数,但是不会像没有破解前一样弹出一个确定框禁止访问。

另外破解后需要手工编辑httpd. conf。因为编辑按钮是灰色的不能按了。但是不影响功能使用。

下载软件[attach=4]

第一章:软件介绍
ISAPI_Rewrite 是一款适用于IIS的功能强大的基于正则表达式的URL处理模块。它兼容Apache的mod_rewrite的语法,从而使仅仅复制.htaccess文件就把配置从appach移植到IIS中或者从IIS移值到appach中变成可能。请参阅3.2兼容性图表这一节。
ISAPI_Rewrite最重要的功能:
ISAPI_Rewrite提供了和Apach mod_rewrite相同的句法和行为,使仅仅拷贝.htaccess文件就完成配置移植成为功能。(要想阅读更多关于与mod_rewrite的兼容性,请参阅3.2兼容性图表这一节。)
正则表达式支持灵活而强大的配置。
极速而且容易升级的纯C++代码。
真正的分布式配置:实时监控服务器全局级别、虚拟主机(网站)级别、目录级别的.htaccess文件。
隔离性:用户级配置只影响本地用户环境,从而使ISAPI_Rewrite成为Web主机提供商的理想解决方案。
重要的应用示例:
搜索引擎优化。
一台Web服务器的代理内容经过另一台web服务器。
防止内容被吸血(盗链)。
阻断特定主机、反向链接或者烦人的搜索机器人。
内容商议:向不同的语言用户或者不同的浏览器用户提供不同的文件。示例
为群集式服务器架构模拟负载均衡。
定价资料
45天的试用期
单机版99美元
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 
REGISTRATIONNAME=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应用程序的属性中给予一个“纯脚本”的执行权限。

2.6MSI的自定义行为自定义行为

自定义行为 说明
WiseAltStartup
自动智能启动
为运行在延时模式中的自定义行为保存属性的当前状态。
使用一个可执行文件(dll)
发生在:安装、反安装。
WiseCleanup
智能清理
这个行为被调用来清理上一个自定义行为所遗留下的临时文件
使用一个可执行文件(dll)
发生在:安装、反安装。
WiseStartup
智能启动
这个行为使调用一个.dll文件或者提取必要Wisescript.exe文件和.dll文件的行为可以传递参数。
使用一个可执行文件(dll)
发生在: 安装、反安装
WiseUpgradeCheck
智能可选择地升级
这个行为被调用来解决当Windows安装程序运行时不检测应用程序的早期版本的问题。
使用一个可执行文件(dll)
发生在:安装。
WiseUpgradeCheckEx
智能预选升级
添加这个行为用来解决当Windows安装程序运行时不检测应用程序的早期版本的问题。
使用一个可执行文件(dll)
发生在:安装。
WiseGetIISVersion
智能获得IIS版本
对主要的IIS版本设置属性(IISVERSION).
使用一个可执行文件(dll)
发生在:安装。
RegisterFilterInMetabase
在管理元库中注册筛选器
这个行为添加一个命名为ISAPI_Rewrite3的全局ISAPI筛选器到IIS管理元库里
IIS5, IIS6 管理元库: IIS:/LM/W3SVC/Filters/ add key ISAPI_Rewrite3
IIS:/LM/W3SVC/Filters/FilterLoadOrder append "ISAPI_Rewrite3"
使用一个可执行文件(dll)
发生在:安装。
RemoveFilterFromMetabase
从管理元库中删除筛选器
这个行为从IIS管理元库里移除了名为ISAPI_Rewrite3的全局ISAPI筛选器。
IIS5, IIS6 管理元库: IIS://localhost/W3SVC/LM/W3SVC/Filters/ delete key ISAPI_Rewrite3
IIS:/LM/W3SVC/Filters/FilterLoadOrder remove"ISAPI_Rewrite3"
使用一个可执行文件(dll)
发生在:反安装、回滚。
AddApplicationExtension
添加应用程序扩展
只用于Windows 2003机器添加ISAPI_RewriteProxy.dll到ISAPI扩展中,并使Web服务器扩展名列表中的这个ISAPI扩展名可用。
IIS6管理元库: IIS:/LM/W3SVC/
adds entry to the在管理元库属性 WebSvcExtRestrictionList中增加metabase property "ISAPI_Rewrite3 proxy"条目;
在管理元库属性 ApplicationDependencies 增加"ISAPI_Rewrite3 proxy;ISAPI_Rewrite3"条目;
使用一个可执行文件(dll)
发生在:安装。
RemoveApplicationExtension
删除应用程序扩展
只用于Windows 2003从ISAPI扩展中删除ISAPI_RewriteProxy.dll,并从web服务器扩展名列表中删除这个ISAPI扩展名。
IIS6管理元库: IIS:/LM/W3SVC/
1.从管理元库属性 WebSvcExtRestrictionList 中删除"ISAPI_Rewrite3 proxy"条目;
2.从管理元库属性 ApplicationDependencies中删除"ISAPI_Rewrite3 proxy;ISAPI_Rewrite3"条目;
使用一个可执行文件(dll)
发生在:反安装、回滚。
RegisterExtensionInScriptMap
在脚本映射中注册扩展
在IIS管理员库中将ISAPI_RewriteProxy.dl注册为ISAPI扩展来处理*.rwhlp文件扩展名
IIS5,IIS6管理元库: IIS://LM/W3SVC/
使用一个可执行文件(dll)
发生在:安装。
RemoveExtensionFromScriptMap
从脚本映射中删除扩展
从IIS管理元库中移除作为ISAPI扩展、用于处理*.rwhlp文件扩展名的ISAPI_Rewrite.dll的注册信息
IIS5, IIS6管理元库: IIS://LM/W3SVC/
使用一个可执行文件(dll)
发生在:反安装、回滚。
GetServisesStatus
获得服务状态
保存IISADMIN、W2WC、NNTP、SMTP 和FTP 服务的当前状态
创建msi属性: [SERVICES_STATUS]
使用一个可执行文件(dll)
发生在: 安装、反安装。
StartServicesEx
按预设开启服务
根据状态预设来启动ISADMIN、W2WC、NNTP、 SMTP 和 FTP 服务
使用msi 属性: [SERVICES_STATUS]
使用一个可执行文件(dll)
发生在: 安装、反安装。
SaveProductID
保存产品ID
如果要注册产品的话,保存REGISTRATIONNAME和REGISTRATIONCODE的属性值
使用msi 属性: [REGISTRATIONNAME] , [REGISTRATIONCODE];
使用文件: [INSTALLDIR]\ISAPI_Rewrite3\httpd.conf
使用一个可执行文件(dll)
发生在: 安装。
Check32bitMode
检测32位模式
在64位系统中检查32位IIS兼容模式是否可用,从而安装正确的ISAPI筛选器版本。IIS6, IIS7
使用管理元库路径: IIS://LM/W3SVC/AppPools property Enable32bitAppOnWin64;
使用msi 属性:[ENABLE32BITAPPONWIN64]
检查一个32位的应用程序是否能运行在一台安装了64位版本的windows的电脑上。
使用javascript脚本
发生在: 安装。
CheckIISModules
检测IIS模块
在IIS7的机器上检查是否需要安装IsapiFilterModule和IsapiModule模块
IIS7 管理元库路径:
<system.webServer>
<globalModules>
<add name="IsapiModule" image="%windir%\System32\inetsrv\isapi.dll" />
<add name="IsapiFilterModule" image="%windir%\System32\inetsrv\filter.dll" />
</globalModules>
</system.webServer>
使用javascript脚本
发生在: 安装。
AddGlobalIsapiFilter
添加全局ISAPI筛选器
只用于IIS7的机器。这个行为会在IIS管理元库里添加一个命名为ISAPI_Rewrite3的全局ISAPI_Rewrite筛选器
IIS7的管理元库路径:
<configuration>
<system.webServer>
<isapiFilters>
<filters>
<filter name="ISAPI_Rewrite3" path="C:\Program Files\Helicon\ISAPI_Rewrite3\ISAPI_Rewrite.dll" enabled="true" enableCache="false">
</filter>
</filters>
</isapiFilters>
</system.webServer>
</configuration>
使用JavaScript脚本
发生在:安装。
DeleteGlobalIsapiFilter
删除全局ISAPI过滤器
只用于IIS7的机器,这个行为会从IIS管理元库中删除名为ISAPI_Rewrite3的全局ISAPI筛选器。
IIS7的管理元库路径:
<configuration>
<system.webServer>
<isapiFilters>
<filters>
<filter name="ISAPI_Rewrite3" path="C:\Program Files\Helicon\ISAPI_Rewrite3\ISAPI_Rewrite.dll" enabled="true" enableCache="false" >
</filter>
</filters>
</isapiFilters>
</system.webServer>
</configuration>
使用JavaScript脚本
发生在:反安装、回滚。
AddIsapiCgiRestriction
添加ISAPI CGI约束
Only for IIS7 machines register ISAPI_RewriteProxy.dll as ISAPI extension in IIS metabase.
只用于IIS7的机器,在IIS管理元库中将ISAPI_RewriteProxy.dl为ISAPI扩展
IIS7管理元库路径:
<configuration>
<system.webServer>
<security>
<isapiCgiRestriction>
<add path="C:\Program Files\Helicon\ISAPI_Rewrite3\ISAPI_RewriteProxy.dll" allowed="true" description="Helicon Proxy" />
</isapiCgiRestriction>
</security>
</system.webServer>
</configuration>
使用JavaScript脚本
发生在:安装。
DeleteIsapiCgiRestriction
删除ISAPI CGI约束
只用于IIS7的机器,从IIS管理元库中删除用作ISAPI扩展的ISAPI_RewriteProxy.dll。
IIS7 管理元库路径:
<configuration>
<system.webServer>
<security>
<isapiCgiRestriction>
<add path="C:\Program Files\Helicon\ISAPI_Rewrite3\ISAPI_RewriteProxy.dll" allowed="true" description="Helicon Proxy" />
</isapiCgiRestriction>
</security>
使用JavaScript脚本
发生在:反安装、回滚。
AddScriptMap
添加脚本映射
只用于IIS7的机器,在IIS管理元库中将ISAPI_RewriteProxy.dll注册为ISAPI扩展用于处理*.rwhlp文件扩展名。
IIS7管理元库路径:
<configuration>
<system.webServer>
<handlers>
<add name="Helicon Proxy" path="*.rwhlp" verb="*" modules="IsapiModule" scriptProcessor="C:\Program
Files\Helicon\ISAPI_Rewrite3\ISAPI_RewriteProxy.dll" resourceType="Unspecified"/>
</handlers>
</system.webServer>
</configuration>
使用JavaScript脚本
发生在:安装。
DeleteScriptMap
删除脚本映射
只用于IIS7的机器,从IIS管理元库里去除用作ISAPI扩展以处理*.rwhlp文件扩展名的ISAPI_RewriteProxy.dll的注册
IIS7管理元库路径:
<configuration>
<system.webServer>
<handlers>
<add name="Helicon Proxy" path="*.rwhlp" verb="*" modules="IsapiModule" scriptProcessor="C:\Program
Files\Helicon\ISAPI_Rewrite3\ISAPI_RewriteProxy.dll" resourceType="Unspecified"/>
</handlers>
</system.webServer>
</configuration>
使用JavaScript脚本
发生在:反安装、回滚。

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>分区可以应用给请求。较晚的分区优先于较早的那些。
3.4正则表达式
正则表达式语法指南是Rege++文档的一部分,由John Maddock博士友情提供,Copyright ?1998-2004,包含在《Boost license》这本书里。完整的语法说明可以在《Boost.Regex documentation》中找到。
字面值
所的字符都是字面值,除了“.”“*”“?”“+”“(”“)”“{”“}”“[”“]”“^”和“$”。当这些字符由“\”前导时也是字面值。一个字面值是个匹配它自己的字符。
通配符
点字符“.”匹配空字符和换行符以外的任何单个字符。
重复
重复是被重复任意次数的表达式。一个表达式跟着“*”可以被重复任意次数,包括重复零次。一个表达式跟着“+”可以被重复任意次数,但是至少重复一次。一个表达式跟着“?”可以被只重复零次或者一次。当需要明确指定重复的最低次数和最高次数时,可以用限定运算符“{}”。这样“a{2}”是字母“a”重复两次。“a{2,4}”表示字母“a”重复2到4次。“a{2,}”表示字母“a”重复2到无限多次。注意“{}”里面必须没有空格。而且它没有对上限值和下限值限定范围。所有的重复表达式参考尽可能短的前子表达式:一个单独字符,一个字符集,或者一个用“()”括起来的子表达式,举几个例子:
"ba*"匹配所有的"b","ba","baaa" 等等。
"ba+"匹配"ba"或"baaa",但是不匹配"b"。
"ba?"匹配"b"或者"ba"。
"ba{2,4}"匹配"baa","baaa","baaaa"。
懒惰型重复
在重复之后附加一个“?”就是懒惰型的重复了。一个懒惰型的重复是指匹配尽可能短的字符串。
例如:匹配HTML标记对可以使用下面这样的正则表达式:
"<\s*tagname[^>]*>(.*?)<\s*/tagname\s*>"
在这种情况下$1将包含标签对之间的文本,而且是最短的匹配字符串。
插入成份
插入成分有两个用处——把项目编组到子表达式中,并且对生成的匹配标号。例如,表达式"(ab)*"将匹配所有的这类字符串"ababab"。所有的被插入成份标号的子匹配将可以用\N或者$N语法来回溯引用到。它允许子表达式匹配空字符串,子表达式以1为开始从左往右编号。子表达式0就是整个表达式。

正则表达式


无标记插入

有时候你需要把子表达式编组为插入成份,但是不想为这个插入成分而吐出另一个标记的子表达式。在这种情况下,一个非标记插入(?:expression)可能有用。例如,下例表达式可以创建一个非子表达式:
"(?:abc)*"
N择1标记

当表达式可以匹配一个子表达式或另一个的时候,N择1标记起作用了。每个N择1可以用|隔开。每个N择1标记是一个最大可能性前缀子表达式,它是和重复操作符相反的行为。
示例:
"a(b|c)"匹配"ab"或"ac"
"abc|def"匹配"abc"或"def"
预置符
一个预置符是一个可以匹配所有作为预置成员的单个字符的预置。预置字符用方括号“[”和“]”括起来,可以容纳字面值、字符序列、字符类、经整理过的对象以及等价的类。用^打头的预置声明可以排除包含的内容。
示例:
字面值
"[abc]"匹配"a"或"b"或"b"。
"[^abc]"匹配"a"和"b"和"c"之外的所有字符。
字符序列
"[a-z]"匹配所有的从"a"到"z"的字符
"[^A-Z]"匹配所有的字符除了从"A"到"Z"的这些字符。
字符类
字符类用语法"[:classname:]"来表示,classname是声明过的预设值中的一个。例如:"[[:space:]]"是所有的空白占位符的预设。下表中的字符类是可用的:

 

alnum 所有的alpha数字字母
alpha 字母表字符[a-zA-Z]。其它字符也可以包含在内,这取决于本地环境
blank 所有的空白字符,包含回车或者空格
cntrl 所有的控制字符
digit 从0到9的数字
graph 所有的图画字符
lower 所有的小写字母[a-z],其它的字符也可以包含在内,这取决于本地环境
print 所有的印刷字符
punct 所有的标点符号
space 所有的空白占位符
upper 所有的大写字母[A-Z],其它的字符也可以包含在内,这取决于本地环境
xdigit 所有的16进字字符0~9,A-F
word 所有的词汇字符,包括字母数字外加underscore
unicode 所有的编码大于255的字符,这只对大范围字符特征类生效

这里有一些缩写法可以代替以上字符类:
\w 代替 [:word:]
\s 代替 [:space:]
\d 代替 [:digit:]
\l 代替 [:lower:]
\u 代替 [:upper:]

正则表达式

集合元素
集合元素一般采用预置声明内加[.tagname.]的格式。其中tagname既可以是一个单个字符,也可以是一个集合元素名。例如:[[.a.]]等价于[a],[[.comma.]]等价于[,]。ISAPI_Rewrite支持所有的标准POSIX集合元素名,以及下面的这些字符组合:“ae”、“ch”、“ll”、“ss”、“nj”、“dz”、“lj”、任意小写、大写、首字母大写的变化组合。多个字符集合元素可以导致预置匹配一个以上的字符。例如:[[.ae.]]将匹配两个字符,但是[^[.ae.]]只会匹配一个字符。
等价类
等价类一般采用预置声明内加[=tagname=]的格式,其中tagname既可以是单个字符,也可以是一个集合元素的名称,它能匹配同样的主要等价类成员的字符,就跟集合元素[.tagname.]一样。一个等级类是一个相同整理的字符预设,但主要是一个等价类的字符集,其主要排序关键字都是一样的(例如,字符串通常先依字符整理,然后根据重音,然后根据大小写。主要排序键与字符相关,次要与重音相关,再次与大小写相关。如果没有等价类符合tagname,则[=tagname=]是与[.tagname.]完全一样的。
Equivalence classes take the general form [=tagname=] inside a set declaration, where tagname is either a single character, or a name of a collating element, and matches any character that is a member of the same primary equivalence class as the collating element [.tagname.]. An equivalence class is a set of characters that collate the same, a primary equivalence class is a set of characters whose primary sort key are all the same (for example strings are typically collated by character, then by accent, and then by case; the primary sort key then relates to the character, the secondary to the accentation, and the tertiary to the case). If there is no equivalence class corresponding to tagname, then [=tagname=] is exactly the same as [.tagname.].
要在一个预设中包含字面值“-”,请这样做:使它成为开放的“[”或者“[^”后面的第一个字符、一个系列或者一个集合元素的末点,或者用一个前置的转义字符如“[\-]”。要在一个预设中包含一个字面值“[”或者“]”或者“^”,请把它们作为一个系列或者一个集合元素的末点,或者用一个前置的转义字符。
行锚
锚用来匹配一行开头或结尾的空串。“^”匹配行开头的空串,“$”匹配行结尾的空串。
回溯引用
回溯引用是引用前面已经被匹配的子表达式。这个引用是被匹配的子表达式,而不是表达式本身。回溯引用包括转义字符“\”跟着一个从1到9的数字。“\1”引用第一个子表达式,“\2”引用第二个,依次类推。举个例子,表达式“(.*)\1”匹配任何关于它的中点重复的字符串,比如说“abcabc”或者“xyzxyz”。一个对子表达式的回溯引用不参加任何匹配,匹配空字符串。在ISAPI_Rewrite中,所有的回溯引用是对整个RewriteRule和相应的RewriteCond指令是全局性相关的。RewriteRule指令中如果有RewirteCond子令的话,子匹配从相应的RewriteRule指令的第一个RewriteCond指令开始从上到下从左往右编号。
向前查找
向前查找有两种形式:正向前查找和负向前查找。
• "(?=abc)"匹配跟在表达式"abc"后面的零字符。
• "(?!abc)"匹配不跟在表达式"abc"后面的零字符。
通配符
下面的运算符提供了与GNU正则表达式库的兼容性。
• "\w"匹配任意单个组词字符,它等价于表达式“[[:word:]]”。
• "\W"匹配任意一个非组词字符,它等价于表达式“[^[:word:]]”。
• "\<"匹配词头空字符串。
• "\>"匹配词尾空字符串。
• "\b"匹配词头或者词尾空字符串。
• "\B"匹配词语中的空字符串。
转义字符
转义字符“\”含有多重意义:
• 转义字符可以引导一个运算符,例如:回溯引用、词操作符
• 转义字符可以使下面的字符正常,比如说“\*”代表一个字面值“*”,而不是重复运算符。

单个字符转义序列
下面的转义序列是单个字符的别名:

 

转义序列 字符代码 含义
\a 0x07 信号铃记号.
\t 0x09 制表符
\v 0x0B 垂直制表符
\e 0x1B ASCII转义字符
\0dd 0dd 八进制字符代码,其中dd是一个或多个八进制数字。
\xXX 0xXX 十六进制字符代码,其中XX是一个或多个八进制数字。
\x{XX} 0xXX 十六进制字符代码,其中XX是一个或更多十六进制数字,可选用Unicode字符。
\cZ z-@ ASCII转义序列control-Z,其中Z是任意一个编码大于或等于“@”的编码的ASCII字符。

杂项转义序列
以下提供perl的大部分兼容性,但是在\l、\L、\u和\U上有一些区别

转义序列 含义
\w 等价于 [[:word:]].
\W 等价于[^[:word:]].
\s 等价于[[:space:]]。
\S 等价于[^[:space:]]。
\d 等价于[[:digit:]]。
\D 等价于[^[:digit:]]。
\l 等价于[[:lower:]]。
\L 等价于[^[:lower:]]。
\u 等价于[[:upper:]]。
\U 等价于[^[:upper:]]。
\C 任何单个字符,等价于“.”
\X 匹配任何Unicode组合字符序列,例如“a\x0301”(字符a和一个尖角)
\Q 开始引号运算符。后面跟前的所有的内容都被当作字面值,直到发现一个\E结束运算符。
\E 结束引用运算符,终止一个由\Q开头的引用序列。

怎样得到匹配
正则表达式将匹配第一个可匹配字符串。如果从给定的起始处可以匹配到不止一个字符串,则它会匹配那个能匹配得最长的字符串。如果从同一个起始处有多个合适的匹配,而且每个匹配的长度都一样,则将选择那个第一子表达式匹配得最长的匹配。如果有两个以上的匹配字符串它们的第一子表达式匹配得一样长,则比较第二子表达式匹配的长度,如此类推。注意:ISAPI_Rewrite使用比封演算法。只有表达式匹配了整个顺序串才能得到匹配结果。例如:
• RewriteCond URL ^/somedir/.* #将匹配任何导向somedir目录以及它的子目录的请求,与此同时,
• RewriteCond URL ^/somedir/ #只匹配somedir根目录的请求。
对“病态”正则表达式的特别提示:
ISAPI_Rewrite 使用了一个非常强大的来自Boost库的正则表达式引擎。但是它依然有一些局限性:有着一些“病态”的表达式,它可能会指数级地消耗匹配时间。这些都涉及到嵌套重复运算符,例如试图对N个连续字母a匹配表达式“(a*a)*b”,消耗的时间将与N2成正比。这些表达式常常能改成另一种写法来避免这种问题。例如,“(a*a)*b”可以被改写成“a*b”,解析它消耗的时间与N成正比。在多数情况下,非嵌套重复表达式消耗的时间与N2成正比,但是,如果条款是相互排斥的,则它们会在线性时间里完成匹配。在“a*b”这种情况下,每个字符将要么匹配a要么匹配b或者不匹配。相较之下,“a*a”匹配器不能告知哪个分支被采取(第一个 a还是第二个a)因此必须尝试两种。
Regex可以检测出这种“病态”的正则表达式并终止和它们的匹配。这将使ISAPI_Rewrite的规则失效。当一个规则失效时,ISAPI_Rewrite将给客户端发送一个"Internal Server error - Rule Failed"的状态,以表示配置错误。

4.1AccessFileName指令

 

说明 设置分布式配置文件的名称
语法 AccessFileName filename [filename] ...
默认值 AccessFileName .htaccess
使用环境 server config

指定一个ISAPI_ReWrite寻求分布式配置的文件名列表。默认文件名是.htaccess。ISAPI_ReWrite只能载入它能在这个列表中找到的第一个文件。默认情况下ISAPI_ReWrite管理者会以hidden属性标记配置文件-它将防止文件被远程用户直接访问到。
如果配置文件进行了任何修改,它将在下次请求服务器时自动加载。

4.2AllowOverride指令

 

说明 明确规定了每个目录重写的基准URL。
语法 AllowOverride All|None|directive-type [directive-type] ...
默认值 AllowOverride All
使用环境 server config, virtual host, directory

这个指令声明了在分布式.htaccess文件里的指令是否可以覆盖父级别的httpd.conf中的指令。在ISAPI_Rewrite的使用环境中,这个指令实际上控制了特定虚拟主机或者目录的.htaccess文件的可用或者不可用。目前只支持三个值:AllNoneFileInfo
AllFileInfo使.htaccess文件以及它里面的整个ISAPI_Rewrite目录可用,None使所有的.htaccess文件以及目录不可用。这些目录具有继承性。这意味着如果你为一些目录或者虚拟主机指定AllowOverride none,.htaccess文件将对整个子目录树不可用。

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兼容。如果使用了RewriteCompatibility2,这个指令在处理之前将URL规范化。规范化包括移除一个URL编码、错误字符,等等。同时URL的规范化将完全移除它的查询字符串。如果RewriteCompatibility2 没有被使用,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.5RewriteCond指令

 

说明 为以下的RewriteRule定义一个条件
语法 RewriteCond TestString CondPattern
使用环境 server config, virtual host, directory, .htaccess

该指令为后面的RewriteRule,RewriteHeader或RewriteProxy指令规定了一个条件。一个规则指令前可以有一个或多个条件,规则只有在所有条件得到满足的情况下才被应用。
TestString附加到纯文本可以包含下列结构。
• 用语法$N回溯引用RewriteRule模式
• 用语法%N回溯引用前面的RewriteCond模式
• 用语法${mapname:key|default}扩展RewriteMap
• 用语法%{HTTP:header}指代HTTP头值
• 用语法%{NAME_OF_VARIABLE}指代服务器变量
以下是可用的服务器变量列表:

HTTP_USER_AGENT
HTTP_REFERER
HTTP_COOKIE
HTTP_FORWARDED
HTTP_HOST
HTTP_PROXY_CONNECTION
HTTP_ACCEPT
REMOTE_ADDR
REMOTE_HOST
REMOTE_PORT
REMOTE_USER
REMOTE_IDENT
REQUEST_METHOD
SCRIPT_FILENAME
PATH_INFO
QUERY_STRING
AUTH_TYPE
DOCUMENT_ROOT
SERVER_NAME
SERVER_ADDR
SERVER_PORT
SERVER_PROTOCOL
SERVER_SOFTWARE
API_VERSION
THE_REQUEST
REQUEST_URI
REQUEST_FILENAME
HTTPS
TIME_YEAR
TIME_MON
TIME_DAY
TIME_HOUR
TIME_MIN
TIME_SEC
TIME_WDAY
TIME
另外,所有的IIS特有的变量都是支持的。

CondPattern指定一个应用于TestString实例的正则表达式,以下特殊值也支持:
1.在正则表达式前头加“!”符号指明否定模式。
2.'<CondPattern'将CondPattern作为一个纯字符串按字典顺序比较,结果比较大
3.'>CondPattern'按字典顺序比较,结果比较小
4.'=CondPattern'按字典顺序比较,结果相等
5.'-d' 检测字符串是否存在目录。
6.'-f' 检测字符串是否存在文件。
7.'-s' 检测字符串是不是一个非零大小的文件。
8.'-l' (链接) 不支持的,始终为false。
9.'-x' (拥有可执行权限) 不支持的,始终为true。
10.'-F' (存在的文件,通过子请求) 不支持,和'–f'一样。
11.'-U' (存在的URL,通过子请求) 不支持的,始终为false。
下面的标记也是支持的:
'nocase|NC'
这个标记使模式大小写不敏感。
'ornext|OR'
这个标记用逻辑或而不是隐含的逻辑与结合子请求RewriteCond指令。
O
留用于ISAPI_Rewrite 2.x的兼容性。在处理前规范化字符串。规范化包括移除一个URL编码、错误字符,等等。同时URL的规范化将完全移除它的查询字符串。

4.6RewriteBase指令

 

说明 为每个目录的重写设置一个基准的URL
语法 RewriteBase URL-path
默认值 RewriteBase requested-directory-path
使用环境 directory, .htaccess

当RewriteRule指令用于每个目录的配置文件(.htaccess)时,它将自动从路径中剥去本地目录前缀,只对剩下的部分应用规则。RewriteBase指令允许你为这些规则精确指定一个基准。比如,哪部分要被剥离。
和Apache的mod_rewrite不同,ISAPI_Rewrite的访问不仅仅针对于物理路径,同时还针对于虚拟路径,而且可以自动地选择正确的基准。所以这个指令只是为了兼容性原因而被保留的。
URL-path可以是相对于根的路径也可以是空,空的URL-path意味着规则的基准等同于网站的根目录。

4.7RewriteProxy指令

 

说明 代理请求到一个远程服务器
语法 RewriteProxy Pattern Substitution [flags]
使用环境 server config, virtual host, directory, .htaccess

使结果URL被内部处理为另一台服务器上的目标,并即时传递到远程服务器,从此中断了规则处理。远程服务器的响应将被传递回客户端。代理要求您指定完整的URL,由协议,主机名称等开头。ISAPI_Rewrite使用ISAPI扩展来处理代理请求。你可以在配置代理的章节里阅读到更多。
语法和操作符与RewriteRule指令是相同的。但是RewroteProxy指令支持一些额外的标记。
H (preserve Host)
代理模块在连接远程服务器时将使用随着源请求一起发送过来的主机头,如果没有这个标志代理服务器则将用主机名和远程服务器的端口号组成主机头。
A (Add authentication headers)
允许从代理服务器将一个认证信息传递到局域网服务器上,当客户端认证和代理服务器冲突时它很有用。服务模块将对一个请求的服务器变量

AUTH_TYPE,
AUTH_USER,
LOGON_USER,
REMOTE_USER

追加相应的头

X-ISRW-Proxy-AUTH-TYPE,
X-ISRW-Proxy-AUTH-USER,
X-ISRW-Proxy-LOGON-USER,
X-ISRW-Proxy-REMOTE-USER

到被代理的服务器。
CR (use Credentials)
代理模块将尝试用在URL中指定的证书身份验证登录远程服务器,或者用基本身份验证头登录远程服务器。用了这个标志,你可以在一个替换字符串中使用http://user:password@host.com/page语法作为一个URL。

4.8RewriteHeader指令

 

说明 重写任何请求的HTTP头
语法 RewriteHeader HeaderName: Pattern Substitution [flags]
使用环境 server config, virtual host, directory, .htaccess

这个RewriteHeader指令是RewriteRule指令中的一个很常用的变量。而且它被设计用来重写客户端的URL部分以及HTTP头的部分。技术上的RewriteRule指令,相当于RewriteHeaderURL Pattern Substitution [flag]。这个指令可用于在IIS里更多应用程序的处理之前重写、创建或者删除任何客户端请求的HTTP头。
HeaderName:指定将被重写的HTTP头的名字。
patternSubstitutionflag与RewriteRule指令中都是相同的。

4.9RewriteMap指令

 

说明 为一个映射函数值定义一个键
语法 RewriteMap MapName MapType:MapSource
使用环境 server config, virtual host, directory, .htaccess

RewriteMap指令被用来定义一个键到值的查找功能。当你需要映射大量的值时,它会很有用的,而且它的速度远远快过用规则匹配来做到它。映射功能的性能受映射文件的大小影响微乎其微。有三种类型的映射:
txt:用一个文本文件映射
rnd:从多个可选项中产生随机值
int:内部函数
MapName是这个映射功能的名字,在RewriteRule命令中被用来指定这个映射。请确保每个映射用唯一的名称定义。你可以使用以下语法在RewriteRule指令的Substitution参数中调用映射功能

${ MapName : LookupKey | DefaultValue } 

如果这个结构是在Substitution中出现,ISAPI_Rewrite将在映射中查找这个键,万一找到了一个,就用它的值替换这个结构。如果什么值也没有被找到,将用可选的DefaultValue。如果没有指定DefaultValue,它将用一个空串替换。
下面的标志也是支持的:
‘nocase|NC’
这个标志使该查找键大小写不敏感。
下面是一个大小写不敏感映射文件指令的示例

RewriteMap examplemap txt:C:/path/to/file/map.txt [NC]

MapSource文件的路径,既可以是绝对地址也可以是相对地址。相对地址将被从当前配置的文件夹开始推算,换言之,就是从这个定义映射的配置文件的路径开始推算。
然后你可以在RewriteRule中如下使用这个映射:

RewriteRule ^/ex/(.*) ${examplemap:$1}

下列MapTypeMapSource的组合是可用的:
txt:纯文本映射,它的source是到一个可用的文本文档的windows文件系统路径。文本文档必须是如下格式的:

#This is a comment
key1 value1 #Another comment
key2 value2
keyN valueN

rnd:随机查找多个值。Source是一个文本文档的路径,文本文档必须是以下格式:

#This is a comment
key1 value1|value2|value3
key2 value4|value5|value6|valueN

int: 调用内部函数。 Source必须是下列预定义的内部函数之一:
toupper: 转换关键词为大写形式。
tolower:转换关键词为小写形式。
escape:把特定字符编码为十六进制。
unescape:把十六进制值编译为特定字符。

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.comwww.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]

平衡负荷仿真
这个示例模拟某种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里使用。

故障处理

Chapter 6故障处理
在这里你可以一步步找到你在安装ISAPI时遇到的问题的解决方法。
1.首先要正确解决您的问题,我们需要你运行最新的可用版本的ISAPI_Rewrite软件。你可以随时到我们的网站下载最新版的软件来升级你的ISAPI_Rewrite。地址是http://www.helicontech.com/download-isapi_rewrite3.htm
2.多数运行ISAPI_Rewrite的问题发生在服务器上NTFS权限限制上。所以,请先阅读需要运行ISAPI_Rewrite文件的权限。
3.请检查应用程序和系统日志中的错误信息。这可能指出您的错误原因。
4.不要忘记设置RewriteEngine on指令在你所用的每个配置文件中。
5.把下列代码行放到httpd.conf文件中:
	RewriteLogLevel 9
LogLevel debug
它将创建error.log和rewrite.log两个日志文件,默认放在安装目录下。如果日志文件被创建了,它表明ISAPI_Rewrite正在运行。阅读作为结果的error.log和rewrite.log文件,将能告诉你一些问题的根源线索。
6.如果httpd.conf规则正在生效,但是.htaccess文件却没有载入,请再次检查.htaccess文件的NTFS权限,并确保你没有在使用ISAPI_Rewrite的精简版。
7.如果规则在httpd.conf里能生效,但是有其它部分或者.htaccess文件里不能生效,请确保在每个部分的或者.htaccess文件里包含RewriteEngine on指令。同样的,不要忘掉.htaccess文件里的默认rewriting base值与httpd.conf是不同的。在.htaccess文件里或者<Directory>部分里,ISAPI_Rewrite会自动从路径中剥离本地目录前缀并只对剩下的部分应用规则。所以如果你的规则以“/”字符开头的话,在网站根目录的.htaccess文件中它必须被去掉。
如果你在使用ISAPI_Rewrite时依然有问题,请到技术支持论坛里来写下你的问题,或者发送电子邮件到技术支持邮箱里。
请在您的支持请求里包括以下信息:
1.您的ISAPI_Rewrite配置文件,包括路径和文件名。
2.您的网站的地址链接。
3.你用到测试你的规则的URL。
4.与失败的请求error.log和rewrite.log的文件副本。
5.包括失败的请求的部分IIS日志文件。
请记住你提供的信息越多,我们越容易为你解决问题。这样你更有机会快速地得到解决方案。

ISAPI_Rewrite 发布历史
发布 3.1.0.67
================
[筛选器功能] 增强映射文件的动态加载
[代理帮助文件错误]如果后端不设置内容长度头的话,并不会返回所有的响应。
发布 3.1.0.66
================


精简版的限制
ISAPI_Rewrite的精简版拥有相同的引擎和重写功能。但是也有下面这些限制:
不支持分布式.htaccess配置、目录以及网站级配置,只有一个精简版安装目录中的全局的httpd.conf配置能被载入。
不支持<VirtualHost>、<Directory>、<DirectoryMatch>、<Files>、<FilesMatch>、<Location> 以及<LocationMatch>这几个标签。
精简版中没有代理服务模块,因而所有的和代理服务功能相关的比如说RewriteProxy指令以及[P]标记都会被忽略。
精简版没有针对于虚拟主机环境的手工安装包
ISAPI_Rewrite精简版完全免费,它对开发或者测试目的以及只有几个网站而且不需要分布式配置或者代理功能的小型服务器来说是一个很好的解决方案

技术信息 ISAPI_Rewrite由四个部分组成:ISAPI筛选器、ISAPI扩展帮助、GUI管理器以及MMC嵌入式管理单元扩展。ISAPI_Rewrite筛选器和扩展都是用纯C++语言写的快速DLL模块。当安装ISAPI_Rwrite的时候, MMC嵌入式管理单元会被自动注册。ISAPI筛选器将安装在一个全局级别上,你不需要手工注册它。ISAPI扩展也会被安装并注册。
ISAPI_Rewrite管理器实用工具可以在没有安装MMC的系统中运行ISAPI_Rewrite MMC嵌入式管理单元。
Windows Vista以及Windows Server 2008系统中的ISAPI_Rewrite管理器实用工具(Helicon Manager.exe)要求管理员权限来执行,因为较小权限的用户没有权力读取IIS管理元库,而它对显示网站配置来说是必需的。如果用受限的帐号运行ISAPI_Rewrite管理器,你会得到登录管理员帐号的自动提示。
ISAPI_Rewrite筛选器已经有足够地快,因此不用担心它的性能。除非你的服务器运行在最大负荷之下。用户在响应时间或者CPU负荷方面几乎不能发现什么区别,但是如果用了很多的规则的话,服务器最大带宽可能掉下一点来。所以请注意你用的配置决定了性能。建议每个网站使用的规则不要超过100条。在多数情况下,可以利用RewriteMap来避免使用大量的规则。
该程序使用了Regex++ 库。
Regex++ (Version Boost 1.31)
Copyright ?1998-2004, Dr John Maddock

使用和传播许可
该使用许可覆盖了所有的现有版本的ISAPI_Rewite,包括ISAPI_Rewrite、ISAPI_Rewrite完全版、ISAPI_Rewrite精简版、ISAPI_Rewrite测试版,后面统称为ISAPI_Rewrite除非另有指明。
1.所有未明确授予的权利均由Helicon Tech保留。
2.所有的关于ISAPI_Rewrite的版权都由它的作者Helicon Tech独家保留。
3. Helicon Tech准予免费使用ISAPI_Rewrite精简版产品。
4. Helicon Tech准予免费试用ISAPI_Rewrite产品30天,当试用期结束时,请要么购买ISAPI_Rewrite,要么删除ISAPI_Rewrite产品。
5.未注册过的ISAPI_Rewrite试用版,可以在不被改动的前提下自由传播,除非有下例情况。任何个人或者公司都不用为在未得版权持有人书面许可的情况下传播ISAPI_Rewrite而付费。未经版权持有者的书面许可,未注册的试用版ISAPI_Rewrite不允许捆绑其它安装包。
6. ISAPI_Rewrite必须被原样传播,不提供任何形式的保证明示或暗示。你可以在你自己的磁盘上使用ISAPI_Rewrite。作者不为因为滥用本软件导致的数据丢失、损坏,或任何其他类型的损失承担责任。
7.你不得使用、复制、模仿、克隆、出租、出售、修改、反编译、反汇编以及其它任何反向工程,或者转让许可程序,或者任何许可程序的一个子集,除非本协议有提供。任何未经授权的使用将导致本许可自动终止。并可能导致刑事或民事起诉。
8.本许可协议的条款是在未来版本的ISAPI_Rewrite将会有所变化。
9.当你购买ISAPI_Rewrite时,将发给你“注册码”。这种“注册码”可以个人或者公司购买,并只在一台计算机上使用。如果您购买一个以上的ISAPI_Rewrite副本,发给你们的“注册码”只能在等于你购买的许可证数的计算机上使用。
10.您只能使用来自Helicom Tech以及与Helicom Tech有业务合作或者技术合作的公司的注册码。
11. 安装和使用ISAPI_Rewrite意味着接受这些条款及许可条件。
12. 如果您不同意本许可证的条款或违反本许可与您当地的法律规定,您必须从您的存储设备中删除ISAPI_Rewrite文件,并停止使用该产品。
13.我们坚持严格的隐私的准则,不会收集个人识别信息,除非是自愿提供的。
如果您有进一步的问题或意见,请访问我们的http://www.helicontech.com。
感谢你使用ISAPI_Rewrite。
Helicon Tech Corporation.

Tags: wp重写 , wprewrite , iis反向代理 , wordpress重写 , iis重写组件免费破解 , isapi_rewrite3.1破解

Total: 17Page 2 of 4‹ Prev1234Next ›