65.9K
CodeProject 正在变化。 阅读更多。
Home

如何制作 ISAPI 重定向过滤器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.36/5 (19投票s)

2003年9月11日

4分钟阅读

viewsIcon

427502

downloadIcon

2943

如何构建一个简单的 ISAPI 过滤器

引言

重定向 Web 流量是一项相当常见的任务,我们可以从 HTML、ASP(或其他脚本引擎)以及 ISAPI 进行重定向。本教程将演示如何使用 MFC 的“重定向过滤器”从 ISAPI 进行重定向,从而减少服务器负载。此示例将重定向一个请求的页面,同时保留用户浏览器中看到的 URL。

HTML 重定向

重定向页面的代码如下所示:

<META http-equiv="refresh" content="5; URL=http://somewhere.com/page.asp">

ASP 重定向

重定向的 ASP 代码如下:

response.redirect “chrismaunderfanclub.com”

第一种方法依赖于您已设置好每个页面进行重定向,第二种方法是通过 ASP 进行,这意味着需要使用脚本引擎(服务器命中)。

ISAPI 重定向过滤器

我们可以通过使用 C++ 中的 ISAPI 过滤器来减少服务器负载。这将产生相同的影响 – 缺点是您需要知道如何使用 Visual Studio 来完成此操作。优点是不使用 ASP。此过滤器将在不更改用户浏览器中看到的 URL 的情况下,更改 IIS 认为它要返回的文件的 URL。

项目

打开 Visual Studio(我使用的是 6.0 版本)。创建一个新项目,然后选择“ISAPI Extension Wizard”。

New ISAPI Project

为您的项目命名。我使用的是“redirector”,然后单击“OK”。您现在应该会看到以下内容:

选中“Generate Filter Object”复选框,然后取消选中“Generate a Server Extension Object”复选框。另外,我将进行静态链接。

单击 Next...

因为我们只想重定向实际页面,而不改变用户认为其是页面的 URL,所以我们将选中“Post-processing of the request headers”复选框,并选择我们希望过滤器具有的通知优先级。在这种情况下,我们将选择“high”,以确保在任何其他过滤器之前得到处理。单击“Finish”,Visual Studio 将为您准备项目。

代码

现在,我们将添加代码以将所有来自 *.cfm 的请求重定向到 *.asp。相关的函数在 *redirector.cpp* 中,名为 *OnPreprocHeaders*,它看起来像这样:

DWORD CRedirectorFilter::OnPreprocHeaders(
                             CHttpFilterContext* pCtxt, 
                             PHTTP_FILTER_PREPROC_HEADERS pHeaderInfo
                         )
{
    return SF_STATUS_REQ_NEXT_NOTIFICATION;
}

当服务器预处理完客户端标头后,会调用此函数。在此示例中,我们希望修改 IIS 认为它要返回的 URL。我们尝试一些简单的方法 - 将所有 Coldfusion(*.cfm)扩展名替换为 *.asp。原因呢?也许我们正在使用 ASP 而不是 ColdFusion,并且不想更改页面本身的链接。

我们需要找出哪个页面被请求了,然后在必要时将 *.cfm 替换为 *.asp。为此,我们需要使用 `HTTP_FILTER_PREPROC_HEADERS` 指针 `pHeaderInfo` 和过滤器上下文指针 `pCtxt`。

我们想查看请求的 URL,要做到这一点,我们可以通过 `GetHeader` 函数询问 IIS 之前是什么 URL。

DWORD CRedirectorFilter::OnPreprocHeaders(
                             CHttpFilterContext* pCtxt, 
                             PHTTP_FILTER_PREPROC_HEADERS pHeaderInfo
                         )
{
    char buffer[256]
    DWORD buffSize = sizeof(buffer);
    BOOL  bHeader=pHeaderInfo->GetHeader(pCtxt->m_pFC, "url",
                                             buffer, &buffSize); 
    ...
}

一旦我们有了 URL,我们就可以决定是否重定向它。我在这里会稍微偷懒一点,使用 `CString` 来处理 `string` 代码,您可以根据自己的喜好使用任何 `string` 代码。

DWORD CRedirectorFilter::OnPreprocHeaders(
                             CHttpFilterContext* pCtxt,
                             PHTTP_FILTER_PREPROC_HEADERS pHeaderInfo
                         )
{
    char buffer[256];
    DWORD buffSize = sizeof(buffer);
    BOOL bHeader = pHeaderInfo->GetHeader(pCtxt->m_pFC, "url",
                                              buffer, &buffSize); 
    CString urlString(buffer);
    urlString.MakeLower(); // for this exercise 
    if (urlString.Find(".cfm") != -1) //we want to redirect this file
    {
        urlString.Replace(".cfm",".asp");
        char *newUrlString= urlString.GetBuffer(urlString.GetLength());
        pHeaderInfo->SetHeader(pCtxt->m_pFC, "url", newUrlString);
        return SF_STATUS_REQ_HANDLED_NOTIFICATION;
    }
    //we want to leave this alone and let IIS handle it
    return SF_STATUS_REQ_NEXT_NOTIFICATION;
}

现在,构建文件,如果一切顺利,应该不会有任何错误!

将过滤器添加到 IIS

接下来,您需要将过滤器添加到 IIS,或者如果您正在使用它,则添加到 Personal Web Service。我现在将描述如何将过滤器添加到 Personal Web Service。

因此,转到 Administrative tools(在 Windows 2000 中)并选择 Internet Services Manager,现在将出现类似以下内容的窗口:

右键单击“Default Web Site”(或您要添加过滤器的任何 Web 服务器),然后选择“properties”,此时应该会出现以下窗口:

在选项卡中,单击“ISAPI Filters”。

现在,假设没有过滤器存在,中间的框应该会是空的(如本例所示)。单击“Add”按钮……

为您的过滤器提供一个“name”,然后使用浏览按钮找到重定向过滤器 *.dll 文件。

单击“OK”,过滤器现在将出现。如果您希望您的过滤器比列表中出现的其他过滤器拥有更高的优先级,请使用左侧的按钮来组织正确的顺序。

单击“OK”。选项卡式对话框将消失。

接下来,我们要停止并重新启动 Web 服务。右键单击“Default Web Site”,选择“Stop”,然后再次右键单击并选择“Start”。

或者,您可以单击工具栏上的黑色方块来停止服务,然后单击“Start item”(黑色三角形)来重新启动它。

测试

创建一个文件 *test.asp* 并将其放在 `inetpub` 的 *wwwroot* 目录中。打开您的 Web 浏览器,然后打开地址 https:///test.cfm。如果一切顺利,那么 *test.asp* 的内容将在浏览器中显示。

好了,您完成了!

许可证

本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。

作者可能使用的许可证列表可以在此处找到。

© . All rights reserved.