In your web.config (system.webServer section) you can tell the site to pass all of the error handling through to the application:
<httpErrors existingResponse="PassThrough" />
This has the disadvantage that Umbraco doesn't handle anything but .aspx pages that are not found.
You could make it better by doing something like this instead:
<httpErrors errorMode="Custom">
<remove statusCode="404" subStatusCode="-1" />
<error statusCode="404" prefixLanguageFilePath="" path="/non-existing-page.aspx" responseMode="ExecuteURL" />
</httpErrors>
The non-existing-page.aspx does not exist yet in Umbraco, so it triggers a 404 (because it has the aspx extension) and.. presto: Umbraco handles the 404 perfectly!
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…