Sí, es posible obtener la URL que causa el error 404, sólo tiene que asegurarse de que ha configurado IIS correctamente.
Hay dos casos que necesita manejar, uno es donde el error proviene de una página .aspx u otra manejada por .NET, y la otra es donde el error proviene de una carpeta incorrecta (como en su pregunta , http://example.com/testurl
) o un nombre de archivo (por ejemplo, * .htm) que no maneja .NET. En IIS 7, deberá configurar un error 404 personalizado en "Páginas de error de .NET" en la sección "ASP.NET" de su aplicación web, y también en "Páginas de error" en la sección "IIS". Los cambios web.config terminan buscando algo como esto:
<system.web>
<!-- other system.web stuff -->
<customErrors defaultRedirect="/Error404.aspx" mode="On" redirectMode="ResponseRewrite">
<error redirect="/Error404.aspx" statusCode="404" />
</customErrors>
</system.web>
<system.webServer>
<!-- other system.webServer stuff -->
<httpErrors errorMode="Custom">
<remove statusCode="404" subStatusCode="-1" />
<error statusCode="404" prefixLanguageFilePath="" path="/Error404.aspx" responseMode="ExecuteURL" />
</httpErrors>
</system.webServer>
Nota: el redirectMode = "ResponseRewrite" mencionado anteriormente es importante si desea que sus páginas 404 a 404 vuelven realidad mensajes y no creo que pueda establecerse a través de IIS.
En mi ejemplo, creé una página llamada Error404.aspx para manejar todos los errores 404. Cuando una página .NET (.aspx, etc.) arroja una excepción 404, el nombre del archivo original se puede encontrar en la variable aspxerrorpath querystring. Cuando un htm regular u otra página causa un error 404, la ruta original se puede leer desde la propiedad Request.RawUrl. He utilizado el siguiente código en mi página de Error404.aspx para manejar cualquiera de los casos:
public partial class Error404 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
OriginalUrl = Request.QueryString["aspxerrorpath"] ?? Request.RawUrl;
Server.ClearError();
Response.Status = "404 not found";
Response.StatusCode = 404;
}
public string OriginalUrl { get; private set; }
}
Por defecto, la página de error 404 no devolverá un código de estado 404, por lo que es necesario establecer de forma manual. Ver this post para más detalles.
¿Has tenido algo de suerte con tu problema? Me gustaría aclarar mi respuesta si es necesario. – rsbarro