Computer Engineering/ASP.NET CORE

ASP.NET CORE의 URL rewrite 살펴보기

jordan.bae 2018. 8. 1. 00:37





URL rewrite (url 재작성) VS URL redirection


Url redirection 작업은 client 작업으로 서버를 왕복해야한다.



Url rewrite 작업은 서번 내에서 특정 url request 왔을 url 다시 작성해서 서버에 요청함으로써 client에서 서버를 왕복할 필요가 없다.


URL 재작성 미들웨어를 사용해야 하는 경우

Windows Server에서 IIS URL 재작성 모듈 사용할 없거나, Apache Server에서 Apache mod_rewrite 모듈 사용할 없거나, Nginx에서 URL 재작성 사용할 없거나, 또는 응용 프로그램이 HTTP.sys 서버(기존의 WebListener)에서 호스팅 되는 경우에 URL 재작성 미들웨어를 사용해야 합니다. IIS, Apache 또는 Nginx에서 서버 기반의 URL 재작성 기술을 사용하는 가장 이유는 미들웨어가 이런 모듈들의 모든 기능을 지원하지 않고 대부분 미들웨어의 성능이 모듈의 성능을 따라가지 못하기 때문입니다. 그러나 IIS 재작성 모듈의 IsFile  IsDirectory 제약 조건 같이 ASP.NET Core 프로젝트에서 동작하지 않는 일부 서버 모듈 기능도 존재합니다. 바로 이런 시나리오에서 대신 미들웨어를 사용합니다.

=> 최대한 단에서 URL 재작성을 하는 좋다. (성능상)

이용
    using (StreamReader apacheModRewriteStreamReader =
        File.OpenText("ApacheModRewrite.txt"))
    using (StreamReader iisUrlRewriteStreamReader =
        File.OpenText("IISUrlRewrite.xml"))
    {
// 처리하고자 하는 순서대로 여러 규칙을 연결하면 됩니다
        var options = new RewriteOptions()
            .AddRedirect("redirect-rule/(.*)", "redirected/$1")
            .AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2",
                skipRemainingRules: true)
            .AddApacheModRewrite(apacheModRewriteStreamReader)
            .AddIISUrlRewrite(iisUrlRewriteStreamReader)
            .Add(MethodRules.RedirectXMLRequests)
            .Add(new RedirectImageRequests(".png", "/png-images"))
            .Add(new RedirectImageRequests(".jpg", "/jpg-images"));
        app.UseRewriter(options);
    }

RedirectOption 인스턴스를 만들어주고 UserRewriter 인자로 넣어준다.


Redirect
 .AddRedirect("redirect-rule/(.*)", "redirected/$1") 사용하면 redirect 사용할 있고, 기본적으로 302 status code 응답한다.


301 vs 302 , 검색 엔진 최적화 관점

301 라디이렉트는 무엇인가요?
301 혹은 영구이동(Permanently Moved) 해당 URL 영구적으로 새로운 URL 변경되었음을 나타냅니다. 검색엔진 크롤러는 301 요청을 만나면 컨텐트가 완전히 새로운 URL 영원히 이동했다고 판단합니다.

301 언제써야 할까요?
예를들어 웹사이트의 도메인을 변경했거나 새로운 URL 구조로 개편했을 사용할 있습니다. 검색엔진은 301 요청을 만나면 컨텐트가 새로운 URL 영원히 이동했다고 판단합니다. 따라서 검색엔진은 과거 URL 페이지랭킹과 평가점수를 새로운 URL 이동시킵니다.

302 리다이렉트는 무엇인가요?
302 리다이렉트의 의미는 요청한 리소스가 임시적으로 새로운 URL 이동했음(Temporarily Moved) 나타냅니다. 따라서 검색엔진은 페이지랭킹이나 링크에 대한 점수를 새로운 URL 옮기지 않으며 기존 URL 그대로 유지합니다. 검색엔진이 기존 URL 보유한 페이지랭킹 점수는 그대로 유지하도록 하면서 컨텐트만 새로운 URL에서 조회하도록 해야할 유용합니다

302 언제써야 할까요?
예를들어 쇼핑몰과 같은 전자상거래 사이트를 운영한다고 생각해봅시다. 인기리에 팔리는 제품이 일시적으로 재고가 떨어지거나 혹은 특정한 계절이나 기간에만 한정적으로 파는 제품이였다고 가정해봅시다. 해당 제품이 보유한 사이트랭크를 유지하면서 사용자에게 일시적으로 제품이 품절됐음을 알리려면 어떻게 해야할까요? 이럴 301 사용하거나 혹은 페이지의 컨텐트를 변경하게 되면 사이트랭킹 점수가 달라지게 것입니다. 대신 302 사용하게 되면 검색엔진은 일시적으로 해당 URL 사이트랭크는 보존하게 되며 사용자는 새로운 URL 컨텐트를 보게 됩니다.

출처http://nsinc.tistory.com/168 [NakedStrength Inc.]


AddRedirectToHttps
AddRedirectToHttpsPermanent

URL Rewrite
AddRewrite
노트 : 일치 규칙은 비용이 많이 드는 작업이며 응용 프로그램의 응답 속도를 늦추므로 가능하면 항상 skipRemainingRules: true 사용하는 것이 좋습니다.
최대한 빠른 응용 프로그램 응답을 위해서는:
가장 자주 일치하는 규칙부터 가장 적게 일치하는 규칙 순으로 재작성 규칙을 정렬합니다.
일치가 발생하고 추가적인 규칙 처리가 필요하지 않다면 나머지 규칙의 처리를 생략합니다.

Ex)  /printing /modeling 보다 request수가 높으면 순서를 위에.

AddIISUrlRewrite
Apache rewrite module 관련글 (apache에서 설정하는 방법, 하는 이유)


메서드 기반 규칙 , 직접 만들고 싶을

Add(Action<RewriteContext> applyRule)
public static void RedirectXMLRequests(RewriteContext context)
{
    var request = context.HttpContext.Request;
    // Because we're redirecting back to the same app, stop
    // processing if the request has already been redirected
    if (request.Path.StartsWithSegments(new PathString("/xmlfiles")))
    {
        return;
    }
    if (request.Path.Value.EndsWith(".xml", StringComparison.OrdinalIgnoreCase))
    {
        var response = context.HttpContext.Response;
        response.StatusCode = StatusCodes.Status301MovedPermanently;
        context.Result = RuleResult.EndResponse;
        response.Headers[HeaderNames.Location] =
            "/xmlfiles" + request.Path + request.QueryString;
    }
}

IRULE 기반 규칙 , Add(IRule)
IRule 인터페이스를 상속 받은 controller


여기까지 MSDN 의 문서와 제가 공부하면서 개인적으로 
살펴본 내용을 추가해서 한 번 정리해봤습니다.

감사합니다.



반응형