【问题标题】:HttpHeader Duplicate PathsHttpHeader 重复路径
【发布时间】:2024-04-19 01:35:02
【问题描述】:

我正在使用 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 页面,因为它会转到 products/ 如果直接导航到里面的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");
        }
    }

现在它只是转到“无法显示此页面”

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

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

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

更新 1

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

【问题讨论】:

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


    【解决方案1】:

    尝试其中一种方法。

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

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

      <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 方法返回时,您将放弃请求而不发送响应。因此是空白页。

    【讨论】:

    • 选项 1 在我的情况下有效,不需要选项 2。我不明白为什么会这样,但确实如此。所以谢谢你。