HttpHeader重复路径

时间:2014-08-15 17:59:49

标签: c# asp.net iis-6 ihttphandler web-config

我正在使用IHttpHeader将403请求重定向到404。 这是在.Net 3.5 Web窗体和IIS 6设置上运行。

<add verb="*" path="products/" type="RequestCheck.NoAccessHandler, RequestCheck, Version=1.0.0.0, Culture=neutral" />

该网站还运行由另一个部门处理的CMS系统,并且他们的所有文件都在营销文件夹下,他们也有一个产品文件夹。

目录结构

\Root
    \products
    \marketing
        \products
            default.asp

在我意识到这个营销文件夹存在之前(我们无法在开发中看到它),以下代码工作正常。

    public void ProcessRequest(HttpContext context)
    {
        context.Response.StatusCode = (int)HttpStatusCode.NotFound;
        context.Response.Redirect("~/NotFound.aspx");
    }

我们在导航中有一个与此类似的链接

http://mysite/marketing/products

当然现在重定向到NotFound.aspx页面,因为它将转到产品/ 如果您直接导航到其中的default.asp,则可以转到该页面。

简单的解决方法是更新导航以使用以下网址

http://mysite/marketing/products/default.asp

这不是我们的修复,因为他们希望我在代码中处理它。 所以我将处理程序更改为以下内容。

    public void ProcessRequest(HttpContext context)
    {
        var url = context.Request.Url.ToString().ToLower();
        if (url.Contains("/mtgmktg/")) // ignore any requests coming for the CMS folders
        {
            return;
        }
        else // everything else gets a 404
        {
            context.Response.StatusCode = (int)HttpStatusCode.NotFound;
            context.Response.Redirect("~/NotFound.aspx");
        }
    }

这就是......

    public void ProcessRequest(HttpContext context)
    {
        var url = context.Request.Url.ToString().ToLower();
        if (!url.Contains("/mtgmktg/")) // ignore any requests coming for the CMS folders
        {
            // everything else gets a 404
            context.Response.StatusCode = (int)HttpStatusCode.NotFound;
            context.Response.Redirect("~/NotFound.aspx");
        }
    }

但这两个只是将我发送到空白页面,它不会渲染任何内容。 然后我试了这个......

错误代码

    public void ProcessRequest(HttpContext context)
    {
        var url = context.Request.Url.ToString().ToLower();
        if (url.Contains("/mtgmktg/")) // ignore any requests coming for the CMS folders
        {
            context.Response.Redirect(url); // This causes an infinite loop
        }
        else // everything else gets a 404
        {
            context.Response.StatusCode = (int)HttpStatusCode.NotFound;
            context.Response.Redirect("~/NotFound.aspx");
        }
    }

现在它只是进入&#34;此页面无法显示&#34;

我还尝试通过配置删除营销文件夹,但这只是被忽略了。我在上面添加之前和之后尝试过这个。没有人做任何事。

<remove verb="*" path="marketing/" />
OR
<remove verb="*" path="marketing/products/" />

有没有人有任何其他想法?请记住,我无法更改导航中的链接。

更新1

空白页是因为我没注意到我做了什么......最后一个代码示例导致无限循环,导致页面崩溃。因此,我需要回滚到导致空白页面的先前样本之一。

1 个答案:

答案 0 :(得分:1)

尝试其中一种方法。

  1. 更改注册处理程序时使用的路径。添加前导/

    <add verb="*"
        path="/products/"
        type="RequestCheck.NoAccessHandler, RequestCheck, Version=1.0.0.0, Culture=neutral"
    />
    
  2. <location></location>块中添加处理程序。 location块直接进入Web配置中的<configuration></configuration>元素:

    <configuration>
        ... other stuff in the web.config ....
        <location path="products">
            <system.web>
                <httpHandlers>
                    <add verb="*"
                        path="products/"
                        type="RequestCheck.NoAccessHandler, RequestCheck, Version=1.0.0.0, Culture=neutral"
                    />
                </httpHandlers>
            </system.web>
        </location>
    </configuration>
    

  3. 注1 :对context.Response.Redirect的调用会覆盖上面一行中设置的状态代码。浏览器最终看到的是302(=重定向)响应。这一行:

    context.Response.StatusCode = (int)HttpStatusCode.NotFound;
    
    如果您无论如何要执行重定向,都可以删除

    ...

    注意2 :尝试检查路径并避免在某些情况下重定向的方法不起作用。如果我正确地阅读了您的问题,您希望.../marketing/products/处理...marketing/products/Default.aspx。但是.aspx文件由不同的IHttpHandler处理。在代码运行时,您的自定义处理程序已被选为请求的处理程序。 IT负责产生响应。试图将请求移交给不同的处理程序为时已晚。因此,当您只是从ProcessRequest方法返回时,您将放弃请求而不发送响应。因此空页。