我正在使用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
空白页是因为我没注意到我做了什么......最后一个代码示例导致无限循环,导致页面崩溃。因此,我需要回滚到导致空白页面的先前样本之一。
答案 0 :(得分: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(=重定向)响应。这一行:
context.Response.StatusCode = (int)HttpStatusCode.NotFound;
如果您无论如何要执行重定向,都可以删除...
注意2 :尝试检查路径并避免在某些情况下重定向的方法不起作用。如果我正确地阅读了您的问题,您希望.../marketing/products/
处理...marketing/products/Default.aspx
。但是.aspx
文件由不同的IHttpHandler处理。在代码运行时,您的自定义处理程序已被选为请求的处理程序。 IT负责产生响应。试图将请求移交给不同的处理程序为时已晚。因此,当您只是从ProcessRequest
方法返回时,您将放弃请求而不发送响应。因此空页。