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
空白页是因为我没有注意我所做的…最后一个代码示例导致无限循环,导致页面崩溃。因此,我需要回滚到前面导致空白页的示例之一。
试一试。
-
更改注册处理程序时使用的路径。添加前导
/
<add verb="*" path="/products/" type="RequestCheck.NoAccessHandler, RequestCheck, Version=1.0.0.0, Culture=neutral" />
-
在
<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
方法返回时,您就放弃了请求而不发送响应。