HttpHeader复制路径

本文关键字:路径 复制 HttpHeader | 更新日期: 2023-09-27 18:18:06

我使用IHttpHeader将403请求重定向到404。这是运行在。net 3.5 Web Forms和iis6上的。

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

该网站还运行着另一个部门管理的CMS系统,他们所有的文件都在一个marketing文件夹下,在这个文件夹下他们也有一个product文件夹。

<<p> 目录结构/strong>
'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页,因为它要到products/如果你直接导航到它里面的default.asp,你就可以进入这个页面了。

简单的修复方法是将导航更新为使用以下url

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");
        }
    }

现在它变成了"This page cannot be display "

我也试过通过配置删除营销文件夹,但这只是被忽略了。我试着把这个之前和之后我的添加上面。两个人都不做任何事。

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

还有人有其他的想法吗?记住,我不能更改导航栏中的链接。

更新1

空白页是因为我没有注意我所做的…最后一个代码示例导致无限循环,导致页面崩溃。因此,我需要回滚到前面导致空白页的示例之一。

HttpHeader复制路径

试一试。

  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>
    

注1:对context.Response.Redirect的调用覆盖了上面一行设置的状态码。浏览器最终看到的是一个302 (=redirect)响应。线:

context.Response.StatusCode = (int)HttpStatusCode.NotFound;

可以被删除,如果你要执行重定向…

注2:在某些情况下,您尝试检查路径并避免重定向的方法将不起作用。如果我没看错你的问题,你想让.../marketing/products/...marketing/products/Default.aspx处理。但是.aspx文件由不同的IHttpHandler处理。在您的代码运行时,您的自定义处理程序已经被选择为请求的处理程序。IT负责生成响应。这时尝试将请求移交给其他处理程序就太晚了。因此,当您简单地从ProcessRequest方法返回时,您就放弃了请求而不发送响应。