You should configure
<httpErrors>
section under
<system.webServer>
section group in your web.config file.
Please refer to this article:
http://www.iis.net/ConfigReference/system.webServer/httpErrors
Additionally you can use the error controller which you linked in your question, however initial flow should be managed by IIS. By this section you can instruct IIS that it should execute urls which are managed by your controller.
Also please take care about proper Response.Status property string in your controller's actions as proposed solution returns "200 OK" which may be confusing for browsers. For example
public class ErrorsController : Controller
{
public ActionResult NotFound()
{
Response.Status = "404 Not Found";
return View();
}
public ActionResult ServerError()
{
byte[] delay = new byte[1];
RandomNumberGenerator prng = new RNGCryptoServiceProvider();
prng.GetBytes(delay);
Thread.Sleep((int)delay[0]);
IDisposable disposable = prng as IDisposable;
if (disposable != null) { disposable.Dispose(); }
Response.Status = "500 Internal Server Error";
return View();
}
}
Configuration example:
<httpErrors defaultPath="/error.htm" errorMode="Custom" existingResponse="Replace" defaultResponseMode="ExecuteURL">
<remove statusCode="500" subStatusCode="-1" />
<remove statusCode="404" subStatusCode="-1" />
<error statusCode="500" path="/errors/servererror/" responseMode="ExecuteURL" />
<error statusCode="404" path="/errors/notfound/" responseMode="ExecuteURL" />
</httpErrors>
You can control 404.3 and other using "subStatusCode" attribute.