开发者

Custom 404 Page with <httpErrors> element does not seem to function in IIS 7

I'm testing an IIS 7.5 site with Managed Pipeline Mode = 'Integrated'

My site targets mobile devices and leverages well formed URLs to pass parameters with a minimum of typing. For example 'mysite.com/bob1234' in this case 'bob1234' is actually parameter.

In the Application.BeginRequest, I process the Request.Url.AbsolutePath using a regular expression to determine if the URL is well formed.

I wanted to add a Custom 404 page, if a user mistypes the URL i.e. mysite.com/boob1234.

<system.web>
    <customErrors mode="RemoteOnly" defaultRedirect="~/MobileError.aspx">
      <error statusCode="404" redirect="404.htm"/>
    </customErrors>
</system.web>

And while this catches errors when the extension is '.aspx', it does not catch 404(s) when no handler is mapped, for example '/mysite.com/boob1234'.

I followed the instructions and also added a element to my system.webserver

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />        
    <httpErrors defaultResponseMode="Redirect" errorMode="DetailedLocalOnly">
      <remove statusCode="404" subStatusCode="-1"/>
      <error statusCode="404" prefixLanguageFilePath="" 
              path="/mobile/MobileError.aspx" responseMode="ExecuteURL"/>
    </httpErrors>        
</system.webServer>

But no iteration of this seems to work. When I uncomment the block, I get a 500 error. And no, there doesn't seem to be any problem with my code. I get a 500 error, even when I just forward to an plain HTML Page.

I did implement failed request tracing to see what I could see.

I get the expected: 404 thrown by IIS Web Core.

Then a few steps later the CustomerErrorModule starts, but it fails with a 500 error. The detailed message is

ConfigExceptionInfo: \?\C:.....\MyApp\web.config ( 89) :This configuration section c开发者_StackOverflow社区annot be used at this path. This happens when the section is locked at a parent level. Locking is either by default (overrideModeDefault="Deny"), or set explicitly by a location tag with overrideMode="Deny" or the legacy allowOverride="false".

I've tried walking up the '.config' stack, and haven't found any references to overrideMode="Deny"

Any help would be awesome. Totally stuck now.

Thanks: Dylan


This has to do with the lifecycle of a request within IIS. In your case where there is no handler mapped, the 404 is recognized before the ASP dlls are even called into play. For items that are not explicitly identified in IIS as requiring Asp.Net, the IIS 404 error will fire and ignore any directives within Asp.Net. Even if a wild-card is applied to the all extensions, this wild-card is only called if IIS does not detect a 404 first. This includes directories and all file extensions not handled explicitly by .Net. So if you attempt to go to http://mydomain.com/images/someimage.gif and that file does not exist, you will not receive a .Net 404 error handler. If you change .gif to .aspx the handler will subsequently fire. The only method I have seen that adequately responds to this is to change all of your 404 handlers within IIS to redirect to a URL file on your local site. It will pass an aspxerror querystring, but if you put a ?error= in your url declaration, you will be able to add specific information.

One other thing I tried, though I'm not sure I tried it correctly, is reassigning the mapping for the file within IIS. We defined that Asp.Net should handle all requests for .gif at one point. The problem I had is that an image didn't come out, a Base64 encoding (I think?) text came out. Being under a deadline I did not pursue this as the simpler solution was to use the IIS custom errors mappings.


Have your tried unlocking the configuration section in the applicationhost.config?

<location path="example.net" overrideMode="Allow">
    <system.webServer>
        <httpErrors>
        </httpErrors>
    </system.webServer>
</location>

Reference: http://learn.iis.net/page.aspx/124/introduction-to-applicationhostconfig/#Locking


Just a stab in the dark, try adding this attribute to the httpErrors element:

existingResponse="PassThrough"

For example:

<httpErrors existingResponse="PassThrough" 
        defaultResponseMode="Redirect" 
        errorMode="DetailedLocalOnly">
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜