ASP.NET Core에서 URL 재작성 미들웨어URL Rewriting Middleware in ASP.NET Core

작성자: Luke LathamMikael MengistuBy Luke Latham and Mikael Mengistu

예제 코드 살펴보기 및 다운로드(다운로드 방법)View or download sample code (how to download)

URL 재작성은 하나 이상의 미리 정의된 규칙을 기반으로 하는 요청 URL을 수정하는 작업입니다.URL rewriting is the act of modifying request URLs based on one or more predefined rules. URL 재작성은 위치 및 주소가 밀접하게 연결되지 않도록 리소스 위치와 해당 주소 간의 추상화를 만듭니다.URL rewriting creates an abstraction between resource locations and their addresses so that the locations and addresses are not tightly linked. URL 재작성이 중요한 몇 가지 시나리오가 있습니다.There are several scenarios where URL rewriting is valuable:

  • 서버 리소스에 대한 안정적인 로케이터를 유지하는 동시에 임시 또는 영구적으로 해당 리소스를 이동하거나 교체하기Moving or replacing server resources temporarily or permanently while maintaining stable locators for those resources.
  • 다른 응용 프로그램 간에 또는 한 응용 프로그램의 여러 영역 간에 요청 처리 분리하기Splitting request processing across different apps or across areas of one app.
  • 들어오는 요청의 URL 세그먼트를 제거, 추가, 또는 재구성하기Removing, adding, or reorganizing URL segments on incoming requests.
  • 검색 엔진 최적화(SEO, Search Engine Optimization)를 위해 공개 URL 최적화하기Optimizing public URLs for Search Engine Optimization (SEO).
  • 링크로 이동했을 때 제공되는 콘텐츠를 사용자가 예측할 수 있도록 친숙한 공개 URL 사용하기Permitting the use of friendly public URLs to help people predict the content they will find by following a link.
  • 안전하지 않은 요청을 보안 엔드포인트로 리디렉션하기Redirecting insecure requests to secure endpoints.
  • 이미지 핫링크 방지하기Preventing image hotlinking.

URL을 변경하기 위한 규칙은 Regex, Apache mod_rewrite 모듈 규칙, IIS 재작성 모듈 규칙 및 사용자 지정 규칙 로직 사용 등의 다양한 방법으로 정의할 수 있습니다.You can define rules for changing the URL in several ways, including Regex, Apache mod_rewrite module rules, IIS Rewrite Module rules, and using custom rule logic. 본문에서는 ASP.NET Core 응용 프로그램에서 URL 재작성 미들웨어를 사용하는 방법에 관한 지침과 URL 재작성에 관해서 살펴봅니다.This document introduces URL rewriting with instructions on how to use URL Rewriting Middleware in ASP.NET Core apps.

참고

URL 재작성은 응용 프로그램의 성능을 저하시킬 수 있습니다.URL rewriting can reduce the performance of an app. 가능한 한 규칙의 수와 복잡성을 제한해야 합니다.Where feasible, you should limit the number and complexity of rules.

URL 리디렉션 및 URL 재작성URL redirect and URL rewrite

URL 리디렉션URL 재작성 간의 단어 차이는 언뜻 보기에는 대단한 것 같지 않지만, 클라이언트에게 리소스를 제공할 때 많은 영향을 미칩니다.The difference in wording between URL redirect and URL rewrite may seem subtle at first but has important implications for providing resources to clients. ASP.NET Core의 URL 재작성 미들웨어는 두 가지 모두에 대한 요구를 만족합니다.ASP.NET Core's URL Rewriting Middleware is capable of meeting the need for both.

URL 리디렉션은 클라이언트 측 작업으로, 클라이언트는 다른 주소를 통해서 리소스에 접근하도록 지시받게 됩니다.A URL redirect is a client-side operation, where the client is instructed to access a resource at another address. 이 방식은 서버를 한 번 더 왕복해야만 합니다.This requires a round-trip to the server. 클라이언트로 반환된 리디렉션 URL은 클라이언트가 리소스에 대한 새로운 요청을 만들 때 브라우저의 주소 표시줄에 나타나게 됩니다.The redirect URL returned to the client appears in the browser's address bar when the client makes a new request for the resource.

/resource/different-resource로 리디렉션 된다고 가정하면, 먼저 클라이언트가 /resource를 요청합니다.If /resource is redirected to /different-resource, the client requests /resource. 그러면 서버는 리디렉션이 임시 또는 영구적임을 나타내는 상태 코드와 함께 해당 리소스를 /different-resource에서 가져가야 한다고 클라이언트에게 응답합니다.The server responds that the client should obtain the resource at /different-resource with a status code indicating that the redirect is either temporary or permanent. 마지막으로 클라이언트는 리디렉션 URL로 리소스에 대한 새로운 요청을 실행합니다.The client executes a new request for the resource at the redirect URL.

WebAPI 서비스 엔드포인트는 서버 측에서 버전 1(v1)에서 버전 2(v2)로 임시 변경됩니다.

요청을 다른 URL로 리디렉션 할 때 서버는 리디렉션이 영구적인지 또는 임시적인지 여부를 지정할 수 있습니다.When redirecting requests to a different URL, you indicate whether the redirect is permanent or temporary. 301 (영구 이동) 상태 코드는 클라이언트에게 리소스에 새로운 영구적인 URL이 존재하며 앞으로 이 리소스에 대한 모든 요청은 새로운 URL을 사용해야 한다고 지시하고자 하는 경우에 사용됩니다.The 301 (Moved Permanently) status code is used where the resource has a new, permanent URL and you wish to instruct the client that all future requests for the resource should use the new URL. 이렇게 301 상태 코드가 수신되면 클라이언트는 응답을 캐시할 수 있습니다.The client may cache the response when a 301 status code is received. 반면 302 (임시 이동) 상태 코드는 리디렉션이 임시적이거나 일반적으로 변경될 수 있는 경우에 사용되므로, 클라이언트는 리디렉션 URL을 저장했다가 나중에 다시 사용하거나 해서는 안 됩니다.The 302 (Found) status code is used where the redirection is temporary or generally subject to change, such that the client shouldn't store and reuse the redirect URL in the future. 보다 자세한 정보는 RFC 2616: 상태 코드 정의를 참고하시기 바랍니다.For more information, see RFC 2616: Status Code Definitions.

URL 재작성은 요청받은 리소스를 다른 리소스 주소에서 제공하는 서버 측 작업입니다.A URL rewrite is a server-side operation to provide a resource from a different resource address. URL 재작성 방식은 서버를 한 번 더 왕복할 필요가 없습니다.Rewriting a URL doesn't require a round-trip to the server. 재작성된 URL은 클라이언트로 반환되지 않고 브라우저의 주소 표시줄에 나타나지도 않습니다.The rewritten URL isn't returned to the client and won't appear in the browser's address bar. /resource/different-resource재작성 된다고 가정할 때, 클라이언트는 /resource를 요청하지만 서버는 내부적으로 /different-resource에서 리소스를 가져옵니다.When /resource is rewritten to /different-resource, the client requests /resource, and the server internally fetches the resource at /different-resource. 클라이언트는 재작성된 URL에서 리소스를 조회할 수는 있지만, 해당 요청을 만들고 응답을 받을 때 실제로는 리소스가 재작성된 URL에 존재한다는 정보는 알 수 없습니다.Although the client might be able to retrieve the resource at the rewritten URL, the client won't be informed that the resource exists at the rewritten URL when it makes its request and receives the response.

WebAPI 서비스 엔드포인트는 서버 측에서 버전 1(v1)에서 버전 2(v2)로 변경됩니다.

URL 재작성 예제 응용 프로그램URL rewriting sample app

URL 재작성 예제 응용 프로그램은 URL 재작성 미들웨어의 기능을 보여줍니다.You can explore the features of the URL Rewriting Middleware with the URL rewriting sample app. 예제 응용 프로그램은 재작성 및 리디렉션 규칙을 적용하고 재작성 또는 리디렉션된 URL을 보여줍니다.The app applies rewrite and redirect rules and shows the rewritten or redirected URL.

URL 재작성 미들웨어를 사용해야 하는 경우When to use URL Rewriting Middleware

Windows Server에서 IIS의 URL 재작성 모듈을 사용할 수 없거나, Apache Server에서 Apache mod_rewrite 모듈을 사용할 수 없거나, Nginx에서 URL 재작성을 사용할 수 없거나, 또는 응용 프로그램이 HTTP.sys 서버(기존의 WebListener)에서 호스팅 되는 경우에 URL 재작성 미들웨어를 사용해야 합니다. Use URL Rewriting Middleware when you are unable to use the URL Rewrite module with IIS on Windows Server, the Apache mod_rewrite module on Apache Server, URL rewriting on Nginx, or your app is hosted on HTTP.sys server (formerly called WebListener). IIS, Apache 또는 Nginx에서 서버 기반의 URL 재작성 기술을 사용하는 가장 큰 이유는 미들웨어가 이런 모듈들의 모든 기능을 지원하지 않고 대부분 미들웨어의 성능이 모듈의 성능을 따라가지 못하기 때문입니다.The main reasons to use the server-based URL rewriting technologies in IIS, Apache, or Nginx are that the middleware doesn't support the full features of these modules and the performance of the middleware probably won't match that of the modules. 그러나 IIS 재작성 모듈의 IsFileIsDirectory 제약 조건 같이 ASP.NET Core 프로젝트에서 동작하지 않는 일부 서버 모듈 기능도 존재합니다.However, there are some features of the server modules that don't work with ASP.NET Core projects, such as the IsFile and IsDirectory constraints of the IIS Rewrite module. 바로 이런 시나리오에서 대신 미들웨어를 사용합니다.In these scenarios, use the middleware instead.

패키지Package

프로젝트에 URL 재작성 미들웨어를 추가하려면 Microsoft.AspNetCore.Rewrite 패키지를 참조해야 합니다.To include the middleware in your project, add a reference to the Microsoft.AspNetCore.Rewrite package. 미들웨어의 기능은 ASP.NET Core 1.1 이상을 대상으로 하는 응용 프로그램에서 사용할 수 있습니다.This feature is available for apps that target ASP.NET Core 1.1 or later.

확장 및 옵션Extension and options

URL 재작성 및 리디렉션 규칙은 각 규칙에 대한 확장 메서드를 이용해서 RewriteOptions 클래스의 인스턴스를 생성하는 방식으로 설정합니다.Establish your URL rewrite and redirect rules by creating an instance of the RewriteOptions class with extension methods for each of your rules. 처리하고자 하는 순서대로 여러 규칙을 연결하면 됩니다.Chain multiple rules in the order that you would like them processed. 그리고 RewriteOptions는 URL 재작성 미들웨어가 app.UseRewriter(options);으로 요청 파이프라인에 추가될 때 URL 재작성 미들웨어에 전달됩니다.The RewriteOptions are passed into the URL Rewriting Middleware as it's added to the request pipeline with app.UseRewriter(options);.

public void Configure(IApplicationBuilder app)
{
    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);
    }

    app.Run(context => context.Response.WriteAsync(
        $"Rewritten or Redirected Url: " +
        $"{context.Request.Path + context.Request.QueryString}"));
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    var options = new RewriteOptions()
        .AddRedirect("redirect-rule/(.*)", "redirected/$1")
        .AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2", 
            skipRemainingRules: true)
        .AddApacheModRewrite(env.ContentRootFileProvider, "ApacheModRewrite.txt")
        .AddIISUrlRewrite(env.ContentRootFileProvider, "IISUrlRewrite.xml")
        .Add(RedirectXMLRequests)
        .Add(new RedirectImageRequests(".png", "/png-images"))
        .Add(new RedirectImageRequests(".jpg", "/jpg-images"));

    app.UseRewriter(options);
}

www 이외 요청을 www로 리디렉션Redirect non-www to www

이러한 옵션은 앱이 www 이외 요청을 www로 리디렉션하도록 허용합니다.Three options permit the app to redirect non-www requests to www:

URL 리디렉션URL redirect

요청을 리디렉션하려면 AddRedirect를 사용합니다.Use AddRedirect to redirect requests. 첫 번째 매개 변수에는 들어오는 URL의 경로와 일치하는 부분을 찾기 위한 정규식을 지정합니다.The first parameter contains your regex for matching on the path of the incoming URL. 두 번째 매개 변수는 대체 문자열입니다.The second parameter is the replacement string. 필요한 경우 세 번째 매개 변수로 상태 코드를 지정할 수 있습니다.The third parameter, if present, specifies the status code. 상태 코드를 지정하지 않는 경우 기본값을 리소스가 일시적으로 이동 또는 대체되었음을 나타내는 302(있음)로 지정합니다.If you don't specify the status code, it defaults to 302 (Found), which indicates that the resource is temporarily moved or replaced.

public void Configure(IApplicationBuilder app)
{
    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);
    }

    app.Run(context => context.Response.WriteAsync(
        $"Rewritten or Redirected Url: " +
        $"{context.Request.Path + context.Request.QueryString}"));
}
public void Configure(IApplicationBuilder app)
{
    var options = new RewriteOptions()
        .AddRedirect("redirect-rule/(.*)", "redirected/$1");

    app.UseRewriter(options);
}

개발자 도구가 활성화된 브라우저에서 /redirect-rule/1234/5678 경로로 샘플 앱에 대한 요청을 만듭니다.In a browser with developer tools enabled, make a request to the sample app with the path /redirect-rule/1234/5678. 그러면 정규식이 redirect-rule/(.*)의 요청 경로와 일치하므로 /redirected/1234/5678로 경로가 치환됩니다.The regex matches the request path on redirect-rule/(.*), and the path is replaced with /redirected/1234/5678. 이 리디렉션 URL은 302 (임시 이동) 상태 코드와 함께 클라이언트로 재전송됩니다.The redirect URL is sent back to the client with a 302 (Found) status code. 브라우저는 리디렉션 URL에 대한 새로운 요청을 만들고 이 주소는 브라우저의 주소 표시줄에 출력됩니다.The browser makes a new request at the redirect URL, which appears in the browser's address bar. 리디렉션 URL과 일치하는 예제 응용 프로그램의 규칙은 존재하지 않기 때문에 두 번째 요청은 응용 프로그램에서 200 (정상) 응답을 수신하고 응답 본문은 리디렉션 URL을 보여줍니다.Since no rules in the sample app match on the redirect URL, the second request receives a 200 (OK) response from the app and the body of the response shows the redirect URL. URL이 리디렉션 될 때 서버에 대한 왕복이 수행됩니다.A roundtrip is made to the server when a URL is redirected.

경고

리디렉션 규칙을 설정할 때 주의하시기 바랍니다.Be cautious when establishing your redirect rules. 리디렉션 규칙은 리디렉션 된 후를 비롯해서 응용 프로그램에 대한 각각의 요청을 대상으로 평가됩니다.Your redirect rules are evaluated on each request to the app, including after a redirect. 따라서 실수로 무한히 리디렉션 되는 루프를 만들기 쉽습니다.It's easy to accidently create a loop of infinite redirects.

원본 요청: /redirect-rule/1234/5678Original Request: /redirect-rule/1234/5678

요청 및 응답을 추적하는 개발자 도구가 있는 브라우저 창

표현식에서 괄호로 둘러쌓인 부분을 캡처 그룹(Capture Group) 이라고 합니다.The part of the expression contained within parentheses is called a capture group. 그리고 표현식에서 마침표(.)는 모든 문자와 일치함을 뜻합니다.The dot (.) of the expression means match any character. 마지막으로 별표(*)는 앞의 문자와 0번 이상 일치함을 나타냅니다.The asterisk (*) indicates match the preceding character zero or more times. 따라서 URL의 마지막 두 세그먼트, 1234/5678은 캡쳐 그룹 (.*)에 의해 캡쳐됩니다.Therefore, the last two path segments of the URL, 1234/5678, are captured by capture group (.*). 즉 요청 URL에서 redirect-rule/ 이후에 제공하는 모든 값이 이 단일 캡처 그룹에 의해서 캡처됩니다.Any value you provide in the request URL after redirect-rule/ is captured by this single capture group.

대체 문자열에서, 캡처된 그룹은 캡처의 일련번호가 뒤에 붙는 달러 기호($)를 통해서 문자열에 삽입됩니다.In the replacement string, captured groups are injected into the string with the dollar sign ($) followed by the sequence number of the capture. 첫 번째 캡처 그룹 값은 $1로 얻을 수 있고, 두 번째 캡처 그룹 값은 $2로 얻을 수 있으며, 이는 정규식에 포함된 캡처 그룹에 대해 순차적으로 계속됩니다.The first capture group value is obtained with $1, the second with $2, and they continue in sequence for the capture groups in your regex. 예제 응용 프로그램에서 리디렉션 규칙의 정규식에 캡처된 그룹은 단 하나뿐이므로 대체 문자열에 삽입되는 그룹도 $1 하나뿐입니다.There's only one captured group in the redirect rule regex in the sample app, so there's only one injected group in the replacement string, which is $1. 규칙이 적용되고 나면 URL은 /redirected/1234/5678로 변환됩니다.When the rule is applied, the URL becomes /redirected/1234/5678.

보안 엔드포인트에 대한 URL 리디렉션URL redirect to a secure endpoint

AddRedirectToHttps를 사용하면 HTTP 요청을 HTTPS(https://)를 사용하는 동일한 호스트 및 경로로 리디렉션할 수 있습니다.Use AddRedirectToHttps to redirect HTTP requests to the same host and path using HTTPS (https://). 상태 코드를 지정하지 않으면 미들웨어가 기본값인 302(임시 이동)를 설정합니다.If the status code isn't supplied, the middleware defaults to 302 (Found). 그리고 포트를 지정하지 않으면 미들웨어가 기본값인 null을 설정하는데, 이는 프로토콜이 https://로 변경되고 클라이언트가 포트 443을 통해서 리소스에 접근함을 뜻합니다.If the port isn't supplied, the middleware defaults to null, which means the protocol changes to https:// and the client accesses the resource on port 443. 예제에서는 상태 코드를 301(영구 이동)로 설정하고 포트를 5001로 변경하는 방법을 보여줍니다.The example shows how to set the status code to 301 (Moved Permanently) and change the port to 5001.

public void Configure(IApplicationBuilder app)
{
    var options = new RewriteOptions()
        .AddRedirectToHttps(301, 5001);

    app.UseRewriter(options);
}

AddRedirectToHttpsPermanent를 사용하면 안전하지 않은 요청을 HTTPS 프로토콜을 사용하는 (포트 443에서 https://를 사용하는) 동일한 호스트 및 경로로 리디렉션할 수 있습니다.Use AddRedirectToHttpsPermanent to redirect insecure requests to the same host and path with secure HTTPS protocol (https:// on port 443). 미들웨어는 상태 코드를 301(영구 이동)로 설정합니다.The middleware sets the status code to 301 (Moved Permanently).

public void Configure(IApplicationBuilder app)
{
    var options = new RewriteOptions()
        .AddRedirectToHttpsPermanent();

    app.UseRewriter(options);
}

참고

추가 리디렉션 규칙에 대한 요구 사항 없이 HTTPS로 리디렉션하는 경우에 HTTPS 리디렉션 미들웨어를 사용하는 것이 좋습니다.When redirecting to HTTPS without the requirement for additional redirect rules, we recommend using HTTPS Redirection Middleware. 자세한 내용은 HTTPS 적용 항목을 참조하세요.For more information, see the Enforce HTTPS topic.

예제 응용 프로그램을 통해서 AddRedirectToHttps 또는 AddRedirectToHttpsPermanent의 사용 방법을 확인해 볼 수 있습니다.The sample app is capable of demonstrating how to use AddRedirectToHttps or AddRedirectToHttpsPermanent. 먼저 RewriteOptions에 이 확장 메서드를 추가합니다.Add the extension method to the RewriteOptions. 모든 URL에서 앱에 대한 안전하지 않은 요청을 만듭니다.Make an insecure request to the app at any URL. 자체 서명된 인증서를 신뢰할 수 없다는 브라우저 보안 경고는 무시하면 됩니다. 또는 인증서를 신뢰할 예외를 만듭니다.Dismiss the browser security warning that the self-signed certificate is untrusted or create an exception to trust the certificate.

AddRedirectToHttps(301, 5001)에 대한 원본 요청: http://localhost:5000/secureOriginal Request using AddRedirectToHttps(301, 5001): http://localhost:5000/secure

요청 및 응답을 추적하는 개발자 도구가 있는 브라우저 창

AddRedirectToHttpsPermanent에 대한 원본 요청: http://localhost:5000/secureOriginal Request using AddRedirectToHttpsPermanent: http://localhost:5000/secure

요청 및 응답을 추적하는 개발자 도구가 있는 브라우저 창

URL 재작성URL rewrite

URL을 재작성하는 규칙을 만들려면 AddRewrite를 사용합니다.Use AddRewrite to create a rule for rewriting URLs. 첫 번째 매개 변수에는 들어오는 URL의 경로와 일치하는 부분을 찾기 위한 정규식을 지정합니다.The first parameter contains your regex for matching on the incoming URL path. 두 번째 매개 변수는 대체 문자열입니다.The second parameter is the replacement string. 세 번째 매개 변수, skipRemainingRules: {true|false}는 현재 규칙이 적용되는 경우에 추가 재작성 규칙을 건너뛸 것인지 여부를 미들웨어에 나타냅니다.The third parameter, skipRemainingRules: {true|false}, indicates to the middleware whether or not to skip additional rewrite rules if the current rule is applied.

public void Configure(IApplicationBuilder app)
{
    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);
    }

    app.Run(context => context.Response.WriteAsync(
        $"Rewritten or Redirected Url: " +
        $"{context.Request.Path + context.Request.QueryString}"));
}
public void Configure(IApplicationBuilder app)
{
    var options = new RewriteOptions()
        .AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2", 
            skipRemainingRules: true);

    app.UseRewriter(options);
}

원래 요청: /rewrite-rule/1234/5678Original Request: /rewrite-rule/1234/5678

요청 및 응답을 추적하는 개발자 도구가 있는 브라우저 창

이 정규식에서 가장 먼저 주목해야 할 부분은 식의 가장 첫 문자인 캐럿(^)입니다.The first thing you notice in the regex is the carat (^) at the beginning of the expression. 이는 URL 경로의 시작 부분에서부터 일치가 시작된다는 것을 의미합니다. This means that matching starts at the beginning of the URL path.

redirect-rule/(.*)리디렉션 규칙에 대한 이전 예제에서는 정규식 시작 부분에 캐럿이 없기 때문에, 경로의 redirect-rule/ 앞부분에 어떤 문자가 나타나더라도 정상적으로 일치합니다.In the earlier example with the redirect rule, redirect-rule/(.*), there's no carat at the start of the regex; therefore, any characters may precede redirect-rule/ in the path for a successful match.

PathPath 일치Match
/redirect-rule/1234/5678 Yes
/my-cool-redirect-rule/1234/5678 Yes
/anotherredirect-rule/1234/5678 Yes

반면 ^rewrite-rule/(\d+)/(\d+) 재작성 규칙의 경우에는 오로지 rewrite-rule/로 시작하는 경로만 일치합니다.The rewrite rule, ^rewrite-rule/(\d+)/(\d+), only matches paths if they start with rewrite-rule/. 위의 리디렉션 규칙과 다음 재작성 규칙 간의 일치 여부의 차이를 비교해보시기 바랍니다.Notice the difference in matching between the rewrite rule below and the redirect rule above.

PathPath 일치Match
/rewrite-rule/1234/5678 Yes
/my-cool-rewrite-rule/1234/5678 아니요No
/anotherrewrite-rule/1234/5678 아니요No

표현식의 ^rewrite-rule/ 부분 뒤에는 계속해서 두 개의 캡처 그룹, (\d+)/(\d+)이 위치해 있습니다.Following the ^rewrite-rule/ portion of the expression, there are two capture groups, (\d+)/(\d+). 여기서 \d숫자 하나와 일치함을 뜻합니다.The \d signifies match a digit (number). 그리고 더하기 기호(+)는 앞의 문자와 한 번 이상 일치함을 나타냅니다.The plus sign (+) means match one or more of the preceding character. 따라서 URL은 반드시 숫자 뒤에 슬래시와 다른 숫자가 연이어 나타나는 부분을 포함해야 합니다.Therefore, the URL must contain a number followed by a forward-slash followed by another number. 이 캡쳐 그룹들은 $1$2를 통해서 재작성 URL에 삽입됩니다. These capture groups are injected into the rewritten URL as $1 and $2. 이 재작성 규칙의 대체 문자열은 캡처된 그룹을 쿼리 문자열에 배치합니다.The rewrite rule replacement string places the captured groups into the querystring. 즉, 요청 경로 /rewrite-rule/1234/5678/rewritten?var1=1234&var2=5678에서 리소스를 가져오도록 재작성됩니다.The requested path of /rewrite-rule/1234/5678 is rewritten to obtain the resource at /rewritten?var1=1234&var2=5678. 원본 요청에 쿼리 문자열이 존재할 경우 URL이 재작성될 때 보존됩니다.If a querystring is present on the original request, it's preserved when the URL is rewritten.

이때 리소스를 가져오기 위해서 서버를 왕복하지 않습니다.There's no roundtrip to the server to obtain the resource. 리소스가 존재할 경우 가져온 다음 200 (정상) 상태 코드와 함께 클라이언트에 반환됩니다.If the resource exists, it's fetched and returned to the client with a 200 (OK) status code. 클라이언트는 리디렉션 되지 않기 때문에 브라우저 주소 표시줄의 URL은 변경되지 않습니다.Because the client isn't redirected, the URL in the browser address bar doesn't change. 클라이언트와 관련된 URL 재작성 작업은 전혀 발생하지 않습니다.As far as the client is concerned, the URL rewrite operation never occurred.

참고

일치 규칙은 비용이 많이 드는 작업이며 응용 프로그램의 응답 속도를 늦추므로 가능하면 항상 skipRemainingRules: true를 사용하는 것이 좋습니다.Use skipRemainingRules: true whenever possible, because matching rules is an expensive process and reduces app response time. 최대한 빠른 응용 프로그램 응답을 위해서는:For the fastest app response:

  • 가장 자주 일치하는 규칙부터 가장 적게 일치하는 규칙 순으로 재작성 규칙을 정렬합니다.Order your rewrite rules from the most frequently matched rule to the least frequently matched rule.
  • 일치가 발생하고 추가적인 규칙 처리가 필요하지 않다면 나머지 규칙의 처리를 생략합니다.Skip the processing of the remaining rules when a match occurs and no additional rule processing is required.

Apache mod_rewriteApache mod_rewrite

AddApacheModRewrite를 사용하면 Apache mod_rewrite 규칙을 적용할 수 있습니다.Apply Apache mod_rewrite rules with AddApacheModRewrite. 규칙 파일이 응용 프로그램과 함께 배포되고 있는지 확인하시기 바랍니다.Make sure that the rules file is deployed with the app. mod_rewrite 규칙에 대한 자세한 내용 및 예제는 Apache mod_rewrite를 참조하세요.For more information and examples of mod_rewrite rules, see Apache mod_rewrite.

StreamReaderApacheModRewrite.txt 규칙 파일에서 규칙을 읽는 데 사용됩니다.A StreamReader is used to read the rules from the ApacheModRewrite.txt rules file.

public void Configure(IApplicationBuilder app)
{
    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);
    }

    app.Run(context => context.Response.WriteAsync(
        $"Rewritten or Redirected Url: " +
        $"{context.Request.Path + context.Request.QueryString}"));
}

첫 번째 매개 변수는 종속성 주입을 통해 제공되는 IFileProvider를 사용합니다.The first parameter takes an IFileProvider, which is provided via Dependency Injection. IHostingEnvironmentContentRootFileProvider를 제공하기 위해서 삽입됩니다.The IHostingEnvironment is injected to provide the ContentRootFileProvider. 두 번째 매개 변수는 규칙 파일, 즉 예제 응용 프로그램의 경우 ApacheModRewrite.txt에 대한 경로입니다.The second parameter is the path to your rules file, which is ApacheModRewrite.txt in the sample app.

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    var options = new RewriteOptions()
        .AddApacheModRewrite(env.ContentRootFileProvider, "ApacheModRewrite.txt");

    app.UseRewriter(options);
}

예제 응용 프로그램은 /apache-mod-rules-redirect/(.\*)에서 /redirected?id=$1로 요청을 리디렉션합니다.The sample app redirects requests from /apache-mod-rules-redirect/(.\*) to /redirected?id=$1. 그리고 응답 상태 코드는 302 (임시 이동)입니다.The response status code is 302 (Found).

# Rewrite path with additional sub directory
RewriteRule ^/apache-mod-rules-redirect/(.*) /redirected?id=$1 [L,R=302]

원본 요청: /apache-mod-rules-redirect/1234Original Request: /apache-mod-rules-redirect/1234

요청 및 응답을 추적하는 개발자 도구가 있는 브라우저 창

미들웨어는 다음과 같은 Apache mod_rewrite 서버 변수를 지원합니다:The middleware supports the following Apache mod_rewrite server variables:

  • CONN_REMOTE_ADDRCONN_REMOTE_ADDR
  • HTTP_ACCEPTHTTP_ACCEPT
  • HTTP_CONNECTIONHTTP_CONNECTION
  • HTTP_COOKIEHTTP_COOKIE
  • HTTP_FORWARDEDHTTP_FORWARDED
  • HTTP_HOSTHTTP_HOST
  • HTTP_REFERERHTTP_REFERER
  • HTTP_USER_AGENTHTTP_USER_AGENT
  • HTTPSHTTPS
  • IPV6IPV6
  • QUERY_STRINGQUERY_STRING
  • REMOTE_ADDRREMOTE_ADDR
  • REMOTE_PORTREMOTE_PORT
  • REQUEST_FILENAMEREQUEST_FILENAME
  • REQUEST_METHODREQUEST_METHOD
  • REQUEST_SCHEMEREQUEST_SCHEME
  • REQUEST_URIREQUEST_URI
  • SCRIPT_FILENAMESCRIPT_FILENAME
  • SERVER_ADDRSERVER_ADDR
  • SERVER_PORTSERVER_PORT
  • SERVER_PROTOCOLSERVER_PROTOCOL
  • TIMETIME
  • TIME_DAYTIME_DAY
  • TIME_HOURTIME_HOUR
  • TIME_MINTIME_MIN
  • TIME_MONTIME_MON
  • TIME_SECTIME_SEC
  • TIME_WDAYTIME_WDAY
  • TIME_YEARTIME_YEAR

IIS URL 재작성 모듈 규칙IIS URL Rewrite Module rules

AddIISUrlRewrite를 사용하면 IIS URL 재작성 모듈에 적용되는 규칙을 사용할 수 있습니다.To use rules that apply to the IIS URL Rewrite Module, use AddIISUrlRewrite. 규칙 파일이 응용 프로그램과 함께 배포되고 있는지 확인하시기 바랍니다.Make sure that the rules file is deployed with the app. 응용 프로그램을 Windows Server의 IIS에서 실행하고 있다면 미들웨어가 web.config 파일을 사용하도록 지정하지 마십시오.Don't direct the middleware to use your web.config file when running on Windows Server IIS. IIS를 사용할 경우, IIS 재작성 모듈과 충돌을 피할 수 있도록 규칙을 web.config 외부에 저장해야 합니다.With IIS, these rules should be stored outside of your web.config to avoid conflicts with the IIS Rewrite module. IIS URL 재작성 모듈 규칙에 대한 자세한 내용 및 예제는 Url 재작성 모듈 2.0 사용URL 재작성 모듈 구성 참조를 참조하세요.For more information and examples of IIS URL Rewrite Module rules, see Using Url Rewrite Module 2.0 and URL Rewrite Module Configuration Reference.

StreamReaderIISUrlRewrite.xml 규칙 파일에서 규칙을 읽는 데 사용됩니다.A StreamReader is used to read the rules from the IISUrlRewrite.xml rules file.

public void Configure(IApplicationBuilder app)
{
    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);
    }

    app.Run(context => context.Response.WriteAsync(
        $"Rewritten or Redirected Url: " +
        $"{context.Request.Path + context.Request.QueryString}"));
}

첫 번째 매개 변수는 IFileProvider를 사용하는 반면 두 번째 매개 변수는 XML 규칙 파일에 대한 경로입니다. 이는 샘플 앱에서 IISUrlRewrite.xml입니다.The first parameter takes an IFileProvider, while the second parameter is the path to your XML rules file, which is IISUrlRewrite.xml in the sample app.

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    var options = new RewriteOptions()
        .AddIISUrlRewrite(env.ContentRootFileProvider, "IISUrlRewrite.xml");

    app.UseRewriter(options);
}

예제 응용 프로그램은 /iis-rules-rewrite/(.*)에서 /rewritten?id=$1로 요청을 재작성합니다.The sample app rewrites requests from /iis-rules-rewrite/(.*) to /rewritten?id=$1. 그리고 응답은 200 (정상) 상태 코드로 클라이언트에 전송됩니다.The response is sent to the client with a 200 (OK) status code.

<rewrite>
  <rules>
    <rule name="Rewrite segment to id querystring" stopProcessing="true">
      <match url="^iis-rules-rewrite/(.*)$" />
      <action type="Rewrite" url="rewritten?id={R:1}" appendQueryString="false"/>
    </rule>
  </rules>
</rewrite>

원본 요청: /iis-rules-rewrite/1234Original Request: /iis-rules-rewrite/1234

요청 및 응답을 추적하는 개발자 도구가 있는 브라우저 창

원하지 않는 방식으로 응용 프로그램에 영향을 주는 서버 수준 규칙이 구성된 활성 IIS 재작성 모듈이 존재할 경우 응용 프로그램에 대한 IIS 재작성 모듈을 비활성화할 수 있습니다.If you have an active IIS Rewrite Module with server-level rules configured that would impact your app in undesirable ways, you can disable the IIS Rewrite Module for an app. 보다 자세한 내용은 IIS 모듈 비활성화를 참고하시기 바랍니다.For more information, see Disabling IIS modules.

지원되지 않는 기능Unsupported features

ASP.NET Core 2.x로 출시된 미들웨어는 다음과 같은 IIS URL 재작성 모듈 기능을 지원하지 않습니다.The middleware released with ASP.NET Core 2.x doesn't support the following IIS URL Rewrite Module features:

  • 아웃바운드 규칙Outbound Rules
  • 사용자 지정 서버 변수Custom Server Variables
  • 와일드카드Wildcards
  • LogRewrittenUrlLogRewrittenUrl

ASP.NET Core 1.x로 출시된 미들웨어는 다음과 같은 IIS URL 재작성 모듈 기능을 지원하지 않습니다.The middleware released with ASP.NET Core 1.x doesn't support the following IIS URL Rewrite Module features:

  • 전역 규칙Global Rules
  • 아웃바운드 규칙Outbound Rules
  • 재작성 맵Rewrite Maps
  • CustomResponse 작업CustomResponse Action
  • 사용자 지정 서버 변수Custom Server Variables
  • 와일드카드Wildcards
  • Action:CustomResponseAction:CustomResponse
  • LogRewrittenUrlLogRewrittenUrl

지원되는 서버 변수Supported server variables

미들웨어는 다음과 같은 IIS URL 재작성 모듈 서버 변수를 지원합니다:The middleware supports the following IIS URL Rewrite Module server variables:

  • CONTENT_LENGTHCONTENT_LENGTH
  • CONTENT_TYPECONTENT_TYPE
  • HTTP_ACCEPTHTTP_ACCEPT
  • HTTP_CONNECTIONHTTP_CONNECTION
  • HTTP_COOKIEHTTP_COOKIE
  • HTTP_HOSTHTTP_HOST
  • HTTP_REFERERHTTP_REFERER
  • HTTP_URLHTTP_URL
  • HTTP_USER_AGENTHTTP_USER_AGENT
  • HTTPSHTTPS
  • LOCAL_ADDRLOCAL_ADDR
  • QUERY_STRINGQUERY_STRING
  • REMOTE_ADDRREMOTE_ADDR
  • REMOTE_PORTREMOTE_PORT
  • REQUEST_FILENAMEREQUEST_FILENAME
  • REQUEST_URIREQUEST_URI

참고

PhysicalFileProvider를 이용해서 IFileProvider를 가져올 수도 있습니다.You can also obtain an IFileProvider via a PhysicalFileProvider. 이 방식이 재작성 규칙 파일의 위치에 대해 더 많은 유연성을 제공할 수 있습니다.This approach may provide greater flexibility for the location of your rewrite rules files. 재작성 규칙 파일이 서버의 지정한 경로에 배포되는지 확인하시기 바랍니다.Make sure that your rewrite rules files are deployed to the server at the path you provide.

PhysicalFileProvider fileProvider = new PhysicalFileProvider(Directory.GetCurrentDirectory());

메서드 기반 규칙Method-based rule

메서드를 이용해서 직접 규칙 로직을 구현하고 싶다면 Add(Action<RewriteContext> applyRule)를 사용하면 됩니다.Use Add(Action<RewriteContext> applyRule) to implement your own rule logic in a method. RewriteContext는 메서드에서 사용할 수 있는 HttpContext를 노출합니다.The RewriteContext exposes the HttpContext for use in your method. RewriteContext.Result는 추가적인 파이프라인 처리가 수행되는 방법을 결정합니다.The RewriteContext.Result determines how additional pipeline processing is handled.

RewriteContext.Result 작업Action
RuleResult.ContinueRules(기본값)RuleResult.ContinueRules (default) 계속 규칙 적용Continue applying rules
RuleResult.EndResponse 규칙 적용을 중지하고 응답 전송Stop applying rules and send the response
RuleResult.SkipRemainingRules 규칙 적용을 중지하고 다음 미들웨어에 컨텍스트 보내기Stop applying rules and send the context to the next middleware
public void Configure(IApplicationBuilder app)
{
    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);
    }

    app.Run(context => context.Response.WriteAsync(
        $"Rewritten or Redirected Url: " +
        $"{context.Request.Path + context.Request.QueryString}"));
}
public void Configure(IApplicationBuilder app)
{
    var options = new RewriteOptions()
        .Add(RedirectXMLRequests);

    app.UseRewriter(options);
}

샘플 앱은 .xml로 끝나는 경로에 대한 요청을 리디렉션하는 메서드를 보여 줍니다.The sample app demonstrates a method that redirects requests for paths that end with .xml. 가령 /file.xml을 요청할 경우 /xmlfiles/file.xml로 리디렉션됩니다.If you make a request for /file.xml, it's redirected to /xmlfiles/file.xml. 상태 코드는 301 (영구 이동)으로 설정하고 있습니다.The status code is set to 301 (Moved Permanently). 리디렉션의 경우 명시적으로 응답의 상태 코드를 설정해야 하며, 그렇지 않으면 200 (정상) 상태 코드가 반환되고 클라이언트에서 리디렉션이 발생하지 않습니다.For a redirect, you must explicitly set the status code of the response; otherwise, a 200 (OK) status code is returned and the redirect won't occur on the client.

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;
    }
}

원본 요청: /file.xmlOriginal Request: /file.xml

file.xml에 대한 요청 및 응답을 추적하는 개발자 도구가 있는 브라우저 창

IRule 기반 규칙IRule-based rule

Add(IRule)를 사용하여 IRule 인터페이스를 구현하는 클래스에서 사용자 고유의 규칙 논리를 캡슐화합니다.Use Add(IRule) to encapsulate your own rule logic in a class that implements the IRule interface. IRule을 사용하면 메서드 기반 규칙 방식을 사용하는 것보다 더 많은 유연성을 얻을 수 있습니다.Using an IRule provides greater flexibility over using the method-based rule approach. 구현 클래스에는 ApplyRule 메서드에 대한 매개 변수를 전달할 수 있는 생성자가 포함될 수 있습니다.Your implementaion class may include a constructor, where you can pass in parameters for the ApplyRule method.

public void Configure(IApplicationBuilder app)
{
    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);
    }

    app.Run(context => context.Response.WriteAsync(
        $"Rewritten or Redirected Url: " +
        $"{context.Request.Path + context.Request.QueryString}"));
}
public void Configure(IApplicationBuilder app)
{
    var options = new RewriteOptions()
        .Add(new RedirectImageRequests(".png", "/png-images"))
        .Add(new RedirectImageRequests(".jpg", "/jpg-images"));

    app.UseRewriter(options);
}

예제 응용 프로그램은 extensionnewPath 매개 변수 값들이 다양한 조건을 만족하는지 검사합니다.The values of the parameters in the sample app for the extension and the newPath are checked to meet several conditions. extension매개 변수는 값을 포함하고 있어야 하고, 그 값은 .png, .jpg, 또는 .gif 중 하나이어야 합니다.The extension must contain a value, and the value must be .png, .jpg, or .gif. 만약 newPath가 유효하지 않으면 ArgumentException이 던져집니다.If the newPath isn't valid, an ArgumentException is thrown. image.png를 요청하면 /png-images/image.png로 요청이 리디렉션 됩니다.If you make a request for image.png, it's redirected to /png-images/image.png. 그리고 image.jpg를 요청하면 /jpg-images/image.jpg로 요청이 리디렉션 됩니다.If you make a request for image.jpg, it's redirected to /jpg-images/image.jpg. 상태 코드는 301 (영구 이동)으로 설정하고 규칙 처리를 중지하고 응답을 전송하도록 context.Result를 설정합니다.The status code is set to 301 (Moved Permanently), and the context.Result is set to stop processing rules and send the response.

public class RedirectImageRequests : IRule
{
    private readonly string _extension;
    private readonly PathString _newPath;

    public RedirectImageRequests(string extension, string newPath)
    {
        if (string.IsNullOrEmpty(extension))
        {
            throw new ArgumentException(nameof(extension));
        }

        if (!Regex.IsMatch(extension, @"^\.(png|jpg|gif)$"))
        {
            throw new ArgumentException("Invalid extension", nameof(extension));
        }

        if (!Regex.IsMatch(newPath, @"(/[A-Za-z0-9]+)+?"))
        {
            throw new ArgumentException("Invalid path", nameof(newPath));
        }

        _extension = extension;
        _newPath = new PathString(newPath);
    }

    public void ApplyRule(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(_newPath)))
        {
            return;
        }

        if (request.Path.Value.EndsWith(_extension, StringComparison.OrdinalIgnoreCase))
        {
            var response = context.HttpContext.Response;
            response.StatusCode = StatusCodes.Status301MovedPermanently;
            context.Result = RuleResult.EndResponse;
            response.Headers[HeaderNames.Location] = 
                _newPath + request.Path + request.QueryString;
        }
    }
}

원본 요청: /image.pngOriginal Request: /image.png

image.png에 대한 요청 및 응답을 추적하는 개발자 도구가 있는 브라우저 창

원본 요청: /image.jpgOriginal Request: /image.jpg

image.jpg에 대한 요청 및 응답을 추적하는 개발자 도구가 있는 브라우저 창

정규식 예제Regex examples

GoalGoal 정규식 문자열 및Regex String &
일치 예제Match Example
대체 문자열 및Replacement String &
출력 예제Output Example
경로를 쿼리 문자열로 재작성Rewrite path into querystring ^path/(.*)/(.*)
/path/abc/123
path?var1=$1&var2=$2
/path?var1=abc&var2=123
후행 슬래시 제거Strip trailing slash (.*)/$
/path/
$1
/path
후행 슬래시 적용Enforce trailing slash (.*[^/])$
/path
$1/
/path/
특정 요청 재작성 방지Avoid rewriting specific requests ^(.*)(?<!\.axd)$ 또는 ^(?!.*\.axd$)(.*)$^(.*)(?<!\.axd)$ or ^(?!.*\.axd$)(.*)$
예: /resource.htmYes: /resource.htm
아니요: /resource.axdNo: /resource.axd
rewritten/$1
/rewritten/resource.htm
/resource.axd
URL 세그먼트 재정렬Rearrange URL segments path/(.*)/(.*)/(.*)
path/1/2/3
path/$3/$2/$1
path/3/2/1
URL 세그먼트 대체Replace a URL segment ^(.*)/segment2/(.*)
/segment1/segment2/segment3
$1/replaced/$2
/segment1/replaced/segment3

추가 자료Additional resources