2011-01-14 2 views
0

반대의 경우 URL이없는 경우에만 URL을 다시 작성할 수 있습니까? 예를 들어, 절편 404s.재 작성된 대상 URL이있는 경우에만 ISAPI-Rewrite를 사용하여 URL을 다시 쓸 수 있습니까?

여기에 컨텍스트가 있습니다. 우리 사이트는 천천히 ASP 클래식에서 ASP.NET으로 마이그레이션하고 있습니다. 천천히, 나는 9000 + .asp 페이지를 한 번에 한 페이지 씩 .aspx로 변환하는 것을 의미합니다.

우리는 검색 엔진에서 순위를 잃지 않도록 모든 깨진 링크를 방지하고자합니다. 즉, .aspx URL이 .aspx 페이지에서 제공 되더라도 계속 존재해야한다는 것을 의미합니다.

내가 할 수 있기를 원하는 것은 대상 URL이 실제로 존재하지 않는 한 실제로 실행하여 .asp를 반환하지 않는 한 .asp -> .aspx를 다시 작성하는 ISAPI-Rewrite 규칙을 사용하는 것입니다. ASP.

아직 somepage.asp를 .aspx로 변환하지 않은 경우 URL이 다시 작성되지 않고 somepage.asp가 표시됩니다. somepage.asp가 사라지면 URL은 somepage.aspx로 다시 작성되어 실행되고 반환되지만 웹 브라우저/검색 엔진은 somepage.asp를 수신했다고 생각합니다.

미래에 어떤 시점에서 .aspx 페이지에 canonical url을 설정하고 검색 엔진이 편리하게 따라 잡을 수 있도록합니다.

참고 : IIS에서 custom 404를 사용하여 파일 시스템을 검사하고 대상 .aspx 페이지가있는 경우 Server.Transfer를 수행했지만 asp classic에서 asp.net으로 전송할 수는 없습니다. ("지정된 '페이지 언어 ="C# "옵션이 알 수 없거나 유효하지 않습니다. 오류'8000d001 '")이 방법이 작동하는 유일한 방법은 Server.Transfer 대신 301/302 리디렉션을 수행 한 것입니다. 이 시점에서 우리에게 바람직하지 않습니다. (관리는 편집증이며 옵션이 없다고 말합니다.)

+0

404를 검색하려면 웹 요청을해야하며 ISApi-Rewrite가 처리하지 못하는 것입니다. 이 작업을 수행하는 유일한 방법은 수동으로 ASP 파일을 변환 할 때 한 번에 하나씩 ini 파일에 추가하는 것입니다. –

+0

또는 물건이 폴더에 있으면 (잘하면 9,000+ 페이지 사이트에 해당), 한 번에 한 폴더 씩 할 수 있습니다. –

+0

@Chris 실제로 많은 폴더가 있습니다. 그러나 일부 폴더에는 수천 페이지가 들어 있기 때문에 전체 디렉토리를 한꺼번에 처리하는 데 직원 및 시간 제약이 따르는 것은 비현실적입니다. –

답변

0

나는 그것을 알아 냈다. Chris Haas가 제안한 것처럼 404 페이지의 처리기를 .aspx 페이지로 만들면 대상 페이지가 존재할 때 Server.Transfer를 수행 할 수 있고 그렇지 않은 경우 일반 404 상태가 반환되도록 할 수 있습니다. 그래서 이런 식으로 :

<%@ Page Language="c#" %> 

<%@ Import Namespace="System.IO" %> 
<script RunAt="server"> 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     String requestedUrl = Request.ServerVariables["HTTP_X_REWRITE_URL"]; 

     if (requestedUrl.EndsWith(".asp", StringComparison.CurrentCultureIgnoreCase)) { 
      String targetUrl = requestedUrl + "x"; 
      String targetPath = Server.MapPath(targetUrl); 

      if (File.Exists(targetPath)) { 
       Server.Transfer(targetUrl); 
      } 
     } 
     Response.Status = "404 Not Found"; 
    } 

</script> 

여전히 쿼리 스트링으로 테스트해야하지만 지금까지는 각 케이스를 완벽하게 처리합니다. 시간이 올 때 관리가 괜찮 으면 Server.Transfer를 중지하고 영구적으로 301 Moved로 변경합니다. IIS가 디렉토리별로 오류 페이지를 설정할 수 있으므로 우리가 할 때도 다소 선택적 일 수 있습니다.

덧붙여 말하자면 ISAPI_Rewrite 3에는 파일 검사 옵션이있을 수 있지만 우리 서버에는 v2 만 있습니다.

0

개인적으로 콘텐츠가 이동 중이면 페이지가 새로운 위치로 이동되었음을 나타내는 301 리다이렉트를하는 프로세스를 작성하고자합니다. 그게 사실입니다.

이렇게하면 새 콘텐츠의 색인이 생성되고 적절하게 링크됩니다.

+0

301/302 리디렉션은 경영진이 우리의 순위에 위험을 감수하지 않기 때문에 옵션이 아닙니다. –

+0

301과 302 사이에는 큰 차이가 있습니다. 첫 번째는 영구적이며 두 번째는 일시적입니다. 301은 콘텐츠 위치가 이동했다는 것을 SE에 알리는 것뿐만 아니라 순위를 유지해야하므로 희망 위치에서 새 위치로 색인을 업데이트 할 것입니다. –

+0

@James 다른 방향을 요구하는 이유와 이유에 대해 제한을 두는 것이 "희망"입니다. –