문제

오래된 클래식 ASP 웹 사이트를 .NET 3.5 솔루션으로 대체하고 있습니다.

모든 클래식 ASP 요청을 ASPX 페이지로 리디렉션해야합니다 (즉, ContactUs.asp, 이제 /contact-us/default.aspx로 경로를 경로로 진행할 수 있습니다). 내가 woudl 좋아하는 것은 Global.asax를 때리는 요청입니다.

If url == "bob.asp"
    Response.Status = "301 Moved Permanently";
    Response.AddHeader("Location", SiteConfig.SiteURL + redirectUrl);
End If

두 가지 우연한 솔루션이 있습니다.

a) global.asa 파일을 배치하고이를 통해 라우팅을 수행하십시오.

b) ASP 파일을 .NET 엔진에 매핑합니다. 훌륭하지만 사이트에서 클래식 ASP 사이트를 호스팅해야한다면 IIS는 요청을 잘못된 장소로 보낼 것입니다.

나는 여기서 좋은 해결책을 찾았습니다

http://forums.asp.net/p/1202225/3458901.aspx

이와 같은 것이 효과가 있다고 말한 것입니다 ...

<buildProviders>

<add extension=".php" type="System.Web.Compilation.PageBuildProvider" />

</buildProviders>
<httpHandlers>

<add verb="*" path="*.php" type="System.Web.UI.PageHandlerFactory" validate="True" />

</httpHandlers>

이 예는 PHP 용 이었지만 ASP에서도 같은 것이 효과가 있다고 가정합니다. 그러나 예제에서 .php를 .asp로 변경하고 Web.config의 올바른 부분에 태그를 배치 한 후에는 기쁨이 없습니다 (실제로 500 서버 오류).

누구든지 이것에 빛을 비추거나 우아한 해결책을 줄 수 있습니까?

IIS가 .NET 엔진에 도달하기 전에 요청을 라우팅했기 때문에 위의 솔루션이 PHP 또는 ASP에 효과가 없다는 느낌이 들었다.

미리 감사드립니다

스티브

도움이 되었습니까?

해결책

큰 편집 : 나는 답이 잘못되었다는 의견에서 @edsf에 의해 지적되었다. 불신으로 나는 Firebug를 사용하여 확인했고 실제로 이건 잘못 됐어.

사용해야합니다 Context.Response.RedirectLocation 상태 코드가 작동합니다.

enter image description here


나는 Global.asax에서도 똑같이하고 있습니다.

Sub Application_BeginRequest(ByVal sender As Object, ByVal e As System.EventArgs)
    Dim fullOriginalpath As String = Request.Url.ToString.ToLower

    If (fullOriginalpath.Contains("/verarticulo.asp?articuloid=")) Then
        Context.Response.StatusCode = 301
        ''// this does not work, returns a 302
        ''//Context.Response.Redirect("/noticias/" + getIDFromPath(fullOriginalpath))

        ''// this does right way
        Context.Response.RedirectLocation = "/noticias/" + getIDFromPath(fullOriginalpath)
        Context.Response.End()
    ElseIf (fullOriginalpath.Contains("/archivo.asp")) Then
        Context.Response.StatusCode = 301
        Context.Response.RedirectLocation = "/archivo/" 
        Context.Response.End()
    ElseIf (fullOriginalpath.EndsWith("/default.asp")) Then
        Context.Response.StatusCode = 301
        Context.Response.RedirectLocation = "/"
        Context.Response.End()
    End If
End Sub

ii6을 사용하는 경우해야 할 유일한 일은이 방식 으로이 ISAPI 필터를 구성해야합니다.

enter image description here

파일은입니다 c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll

다른 팁

가장 간단한 것은 IIS 레벨에서 사용자 정의 404 오류 페이지를 사용하는 것입니다. 이 페이지는 ASPX 페이지가 될 수 있습니다. HTTPContext를 통해 원래 요청에 액세스 할 수 있습니다.

IIS 6.0에서는 기본적으로 .NET Engine (.aspx ,, ASMX 등)에 매핑 된 URL이 web.config에 정의 된 자체 404 핸들러를 사용한다는 것을 알 수 있습니다. 문제 없어; ASPX 엔진 매핑을 편집하고 "파일이 존재 해야하는"Tickbox가 설정되어 있는지 확인하면 해당 페이지조차 IIS 404 페이지로 전송 될 수 있습니다. 이것은 .NET 핸들러에 매핑 되더라도 IIS 404 핸들러에 대한 모든 Boken 링크를 리디렉션합니다. 사람들은 깨진 모든 링크를 web.config 정의 404handler로 리디렉션하려는 실수를합니다. 모든 사람이 IIS에 정의 된 하나의 명령으로 가도록 강요하면 더 쉬워야합니다.

Eduardo Molteni의 답변은 한 가지를 제외하고는 작동합니다. 실제로 301 대신 브라우저 A 302를 통과합니다.

나는 대신 :

Context.Response.StatusCode = 301 
Context.Response.Redirect("/something/") 

그것은해야한다:

Context.Response.StatusCode = 301 
Context.Response.RedirectLocation = "/something") 

응답은 기본적으로 응답으로 설정 한 내용을 방해하고 있습니다 .Statuscode와 브라우저는 "302 발견"을 얻습니다.

검색 엔진이 302 대 301을 처리하는 방법은 확실하지 않으므로 문제가 아닐 수도 있습니다. 진정한 영구 리디렉션 (301)이 선호되는 것처럼 보입니다.

프레임 워크의 V4에있는 사람들에게는 새로운 옵션이있는 것 같습니다.

Response.RedirectPermanent("/something")

테스트하지는 않았지만 상태 코드로 301을 제공한다고 가정합니다. 자세한 내용 : httpresponse.redirectpermanent

Smart 404 핸들러 스크립트의 수정 된 버전을 사용합니다. http://evolvedcode.net/content/code_smart404/. 데이터베이스의 테이블을 기반으로 사용자 정의 매핑을 수행하기 위해 코드를 추가했습니다.

이 스크립트는 ASP.NET에서 쉽게 다시 작성한 다음 같은 방식으로 매핑 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top