ASP.NET 사용자 정의 404를 찾을 수 없음 404 대신 200 OK 반환
Google Webmaster Tools 사이트를 설정하려고 시도한 결과, Custom ASP.NET 404 페이지에서 404 상태 코드가 반환되지 않았습니다.올바른 사용자 지정 페이지를 표시하고 브라우저에 모든 것이 정상임을 알렸습니다.이것은 소프트 404 또는 false 404로 간주됩니다.구글은 이것을 좋아하지 않습니다.그래서 나는 그 문제에 대한 많은 기사를 찾았지만 내가 원하는 해결책이 효과가 없는 것 같았습니다.
제가 하고 싶은 해결책은 커스텀 404페이지의 Page_Load 메서드 뒤에 있는 코드에 다음 두 줄을 추가하는 것입니다.
Response.Status = "404 Not Found";
Response.StatusCode = 404;
이거 안 돼요.페이지는 여전히 200 OK를 반환합니다.하지만 다음 코드를 디자인 코드에 하드코드하면 제대로 작동한다는 것을 알게 되었습니다.
<asp:Content ID="ContentMain" ContentPlaceHolderID="ContentPlaceHolderMaster" runat="server">
<%
Response.Status = "404 Not Found";
Response.StatusCode = 404;
%>
... Much more code ...
</asp:content>
페이지가 마스터 페이지를 사용하고 있습니다.그리고 웹.config에서 사용자 정의 오류 페이지를 구성하고 있습니다.저는 정말로 뒤에 있는 코드를 사용하고 싶지만 디자인/레이아웃에 해킹 인라인 코드를 넣지 않고는 작동할 수 없을 것 같습니다.
솔루션:
문제는 마스터 페이지의 사용이었습니다.페이지 수명 주기 후반에 상태 코드를 설정함으로써 작동하게 되었습니다. 마스터 페이지의 렌더링이 이를 재설정하고 있었기 때문에 렌더링 방법을 재정의하고 렌더링이 완료된 후에 설정했습니다.
protected override void Render(HtmlTextWriter writer)
{
base.Render(writer);
Response.StatusCode = 404;
}
마스터 페이지가 언제 상태를 설정하고 있는지 정확히 알기 위해 더 많은 작업을 수행할 수 있지만, 그것은 당신에게 맡기겠습니다.
원본 게시물:
저는 테스트 웹 앱이 잘 작동하도록 할 수 있었는데, 적어도 사용자 정의 오류 페이지를 표시하고 404 상태 코드를 반환했습니다.당신의 앱에 어떤 문제가 있는지는 말할 수 없지만, 제가 한 일은 말할 수 있습니다.
사용자 지정 오류에 대해 web.config를 편집했습니다.
<customErrors mode="On"> <error statusCode="404" redirect="404.aspx"/> </customErrors>
404.aspx 페이지를 추가하고 상태 코드를 404로 설정했습니다.
public partial class _04 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { Response.StatusCode = 404; } }
Asp에서 처리하는 페이지 확장으로 이동하면 그 정도입니다.Net이며 존재하지 않습니다. 내 피들러 로그에는 404가 분명히 표시됩니다. 여기 헤더가 있습니다.
HTTP/1.1 404 Not Found Server: Microsoft-IIS/5.1 Date: Sun, 07 Dec 2008 06:04:13 GMT X-Powered-By: ASP.NET X-AspNet-Version: 2.0.50727 Cache-Control: private Content-Type: text/html; charset=utf-8 Content-Length: 533
이제 Asp에서 처리되지 않은 페이지로 이동하면 됩니다.넷, htm 파일과 마찬가지로 사용자 지정 페이지가 표시되지 않고 IIS에 의해 구성된 404가 표시됩니다.
여기 당신과 당신의 문제에 도움이 될 수 있는 몇 가지 세부 사항에 대한 게시물이 있습니다. 내 테스트는 새 페이지로 리디렉션하여 요청한 파일의 URL이 거의 손실됩니다(쿼리 문자열에 있는 것을 제외하고).
Google 404 및 .NET 사용자 지정 오류 페이지
헤더 스파이 응답:
HTTP/1.1 404 Not Found
Date: Sun, 07 Dec 2008 06:21:20 GMT
사용자 지정 페이지를 404(ASPX)와 유사한 문제가 있었는데 로컬 호스트에서 잘 작동했지만 원격 방문자가 연결되면 일반 IIS 404가 제공됩니다.
이에 대한 해결책은 다음과 같습니다.
Response.TrySkipIisCustomErrors = true;
응답을 변경하기 전에 입력합니다.상태 코드.
Rick Strahl http://www.west-wind.com/weblog/posts/745738.aspx 을 통해 검색됩니다.
응답을 호출해 보십시오.렌더링을 건너뛰려면 끝()...
Response.Status = "404 Not Found";
Response.StatusCode = 404;
Response.End();
return;
IIS 7 솔루션은 다음을 web.config 파일에 추가하는 것입니다.
<system.webServer>
<httpErrors existingResponse="Replace">
<remove statusCode="500" subStatusCode="-1" />
<remove statusCode="404" subStatusCode="-1" />
<error statusCode="404" prefixLanguageFilePath="" path="404.htm" responseMode="File" />
<error statusCode="500" prefixLanguageFilePath="" path="500.htm" responseMode="File" />
</httpErrors>
</system.webServer>
http://forums.asp.net/t/1563128.aspx/1
많은 테스트와 문제 해결 후 특정 호스팅 공급자가 반환 코드를 간섭할 수 있습니다.저는 내용에 "해킹"을 적용함으로써 이것을 피할 수 있었습니다.
<%
// This code is required for host that do special 404 handling...
Response.Status = "404 Not Found";
Response.StatusCode = 404;
%>
이렇게 하면 페이지는 어떤 일이 있어도 올바른 반환 코드를 반환할 수 있습니다.
.NET 3.5를 사용하여 asp.net 웹 양식에서 다음과 같은 설정을 사용하여 이 문제를 해결할 수 있었습니다.
제가 구현한 패턴은 우회합니다.web.config에 있는 NET의 사용자 지정 리디렉션 솔루션은 헤더에 올바른 HTTP 상태 코드가 있는 모든 시나리오를 처리하기 위해 직접 작성했습니다.
먼저 web.config의 customErrors 섹션은 다음과 같습니다.
<customErrors mode="RemoteOnly" defaultRedirect="~/error.htm" />
이 설정을 사용하면 CustomErrors 모드가 나중에 필요한 설정인 on으로 설정되고 기본 Redirect of error.htm에 대한 all-else-fails 옵션이 제공됩니다.특정 오류에 대한 처리기가 없거나 데이터베이스 연결이 끊어진 경우 유용합니다.
다음은 글로벌 asax Error 이벤트입니다.
protected void Application_Error(object sender, EventArgs e)
{
HandleError();
}
private void HandleError()
{
var exception = Server.GetLastError();
if (exception == null) return;
var baseException = exception.GetBaseException();
bool errorHandled = _applicationErrorHandler.HandleError(baseException);
if (!errorHandled) return;
var lastError = Server.GetLastError();
if (null != lastError && HttpContext.Current.IsCustomErrorEnabled)
{
Elmah.ErrorSignal.FromCurrentContext().Raise(lastError.GetBaseException());
Server.ClearError();
}
}
이 코드는 오류 처리 책임을 다른 클래스로 떠넘기고 있습니다.오류가 처리되지 않고 CustomErrors가 설정된 경우, 이는 우리가 생산 중이고 어떻게든 오류가 처리되지 않은 경우를 의미합니다.사용자가 볼 수 없도록 여기서 삭제하겠지만, 무슨 일이 일어나고 있는지 알 수 있도록 Elmah에 기록합니다.
applicationErrorHandler 클래스는 다음과 같습니다.
public bool HandleError(Exception exception)
{
if (exception == null) return false;
var baseException = exception.GetBaseException();
Elmah.ErrorSignal.FromCurrentContext().Raise(baseException);
if (!HttpContext.Current.IsCustomErrorEnabled) return false;
try
{
var behavior = _responseBehaviorFactory.GetBehavior(exception);
if (behavior != null)
{
behavior.ExecuteRedirect();
return true;
}
}
catch (Exception ex)
{
Elmah.ErrorSignal.FromCurrentContext().Raise(ex);
}
return false;
}
이 클래스는 기본적으로 명령 패턴을 사용하여 실행된 오류 유형에 적합한 오류 처리기를 찾습니다.예외를 사용하는 것이 중요합니다.거의 모든 오류가 상위 수준의 예외로 포장되기 때문에 이 수준에서 GetBaseException()입니다.예를 들어, "새 시스템 던지기"를 수행합니다.aspx 페이지에서 예외()"가 발생하면 시스템이 아닌 이 수준에서 HttpUnhandledException이 수신됩니다.예외.
"출고 시" 코드는 간단하며 다음과 같습니다.
public ResponseBehaviorFactory()
{
_behaviors = new Dictionary<Type, Func<IResponseBehavior>>
{
{typeof(StoreException), () => new Found302StoreResponseBehavior()},
{typeof(HttpUnhandledException), () => new HttpExceptionResponseBehavior()},
{typeof(HttpException), () => new HttpExceptionResponseBehavior()},
{typeof(Exception), () => new Found302DefaultResponseBehavior()}
};
}
public IResponseBehavior GetBehavior(Exception exception)
{
if (exception == null) throw new ArgumentNullException("exception");
Func<IResponseBehavior> behavior;
bool tryGetValue = _behaviors.TryGetValue(exception.GetType(), out behavior);
//default value here:
if (!tryGetValue)
_behaviors.TryGetValue(typeof(Exception), out behavior);
if (behavior == null)
Elmah.ErrorSignal.FromCurrentContext().Raise(
new Exception(
"Danger! No Behavior defined for this Exception, therefore the user might have received a yellow screen of death!",
exception));
return behavior();
}
결국, 저는 확장 가능한 오류 처리 체계를 설정했습니다.정의된 각 "동작"마다 오류 유형에 대한 사용자 정의 구현이 있습니다.예를 들어, Http 예외는 상태 코드에 대해 검사되고 적절하게 처리됩니다.404 상태 코드에는 서버가 필요합니다.요청 대신 전송합니다.헤더에 기록된 해당 상태 코드와 함께 리디렉션합니다.
이게 도움이 되길 바랍니다.
다음 코드를 사용할 수 있습니다.
Response.TrySkipIisCustomErrors = True
Response.Status = "404 Not Found"
Response.AddHeader("Location", "{your-path-to-your-404-page}")
언급URL : https://stackoverflow.com/questions/347281/asp-net-custom-404-returning-200-ok-instead-of-404-not-found
'programing' 카테고리의 다른 글
Nodejs 애플리케이션 오류: pm2 배포를 사용할 때 EADDRINUSE 바인딩 (0) | 2023.06.21 |
---|---|
신뢰할 수 있는 방식으로 오라클 BLOB를 작성/업데이트하는 방법은 무엇입니까? (0) | 2023.06.21 |
절대 URL과 상대 URL에 가입하는 방법은 무엇입니까? (0) | 2023.06.21 |
C#.NET 응용 프로그램에서 SQL Server 시간 데이터 유형을 사용하시겠습니까? (0) | 2023.06.21 |
Mac에서 MongoDB 나침반 실행 (0) | 2023.06.21 |