URL의 ASP.NET Core 미들웨어를 다시 작성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
  • 공용 Url에 대 한 검색 엔진 최적화 SEO () 최적화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
  • 이미지 hotlinking 방지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.

A URL 리디렉션 는 클라이언트 쪽 작업으로, 다른 주소에서 리소스에 액세스 하려면 클라이언트에 명령입니다.A URL redirect is a client-side operation, where the client is instructed to access a resource at another address. 서버에 대 한 왕복 걸리며 클라이언트는 리소스에 대 한 새 요청을 클라이언트로 반환 된 리디렉션 URL 브라우저의 주소 표시줄에 나타납니다.This requires a round-trip to the server, and 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, 서버 클라이언트에서 리소스를 가져와야 하는 응답 /different-resource 리디렉션 임을 나타내는 상태 코드와 함께 임시 또는 영구 합니다.If /resource is redirected to /different-resource, the client requests /resource, and 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 서비스 끝점 v2 (버전 2) 서버를 일시적으로 변경 버전 (v1) 1에서에서 되었습니다.

를 다른 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.

A 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 서비스 끝점 (v1) 버전 1에서에서 v2 (버전 2) 서버에서 변경 되었습니다.

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

URL 다시 쓰기 미들웨어를 사용 하 여 사용할 수 없는 경우는 URL 재작성 모듈 Windows 서버에서 iis는 Apache mod_rewrite 모듈 Apache 서버의 Nginx에URL다시쓰기, 응용 프로그램에서 호스팅되는 또는 HTTP.sys 서버 (이전의 WebListener).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). 기술을 사용 하는 서버 기반 URL 다시 쓰기 IIS, Apache 또는 Nginx 주된 이유는 있는지 미들웨어 이러한 모듈의 전체 기능을 지원 하지 않습니다 및 미들웨어의 성능을 때문일 수와 일치 하지 않습니다는 모듈입니다.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. 그러나 일부의 기능은 사용 하지 않는 ASP.NET Core 프로젝트와 같은 서버 모듈의 IsFileIsDirectory IIS 재작성 모듈의 제약 조건입니다.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

미들웨어를 프로젝트에 포함 하려면 추가에 대 한 참조는 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);합니다.The RewriteOptions are passed into the URL Rewriting Middleware as it's added to the request pipeline with app.UseRewriter(options);.

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

URL 리디렉션URL redirect

사용 하 여 AddRedirect 요청을 리디렉션할 수 있습니다.Use AddRedirect to redirect requests. 첫 번째 매개 변수는 받는 URL의 경로에 일치 하는 regex의 포함 되어 있습니다.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.

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

개발자 도구를 사용 하도록 설정 된 브라우저에서 요청 경로로 샘플 응용 프로그램을 할 /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. 요청 경로 일치 하는 regex 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

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

괄호 안에 포함 된 식의 일부 라고는 캡처 그룹합니다.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. 캡처된 그룹이 하나만 있는에서 경우 리디렉션 규칙 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.

<a name=url-redirect-to-secure-endpoint>

보안 끝점을 URL 리디렉션URL redirect to a secure endpoint

사용 하 여 AddRedirectToHttps 동일한 호스트 및 HTTPS를 사용 하 여 경로에 HTTP 요청을 리디렉션할 수 (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.

var options = new RewriteOptions()
    .AddRedirectToHttps(301, 5001);

app.UseRewriter(options);

사용 하 여 AddRedirectToHttpsPermanent 안전 하지 않은 요청을 동일한 호스트와 보안 HTTPS 프로토콜을 사용 하 여 경로 리디렉션하도록 (https:// 포트 443).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).

샘플 응용 프로그램은 사용 하는 방법을 보여 주는 수 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.

사용 하 여 원래 요청 AddRedirectToHttps(301, 5001):/secureOriginal Request using AddRedirectToHttps(301, 5001): /secure

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

사용 하 여 원래 요청 AddRedirectToHttpsPermanent:/secureOriginal Request using AddRedirectToHttpsPermanent: /secure

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

URL 다시 쓰기URL rewrite

사용 하 여 AddRewrite Url을 다시 작성 하기 위한 규칙을 만듭니다.Use AddRewrite to create a rules for rewriting URLs. 첫 번째 매개 변수는 들어오는 URL 경로에 일치 하는 regex의 포함 되어 있습니다.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.

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

원래 요청:/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 의미 숫자 (number)합니다.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. 그룹은 다시 작성된 URL에 삽입이 캡처 $1$2합니다.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 (OK) 상태 코드를 사용 하 여 클라이언트에 반환 합니다.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

사용 하 여 Apache mod_rewrite 규칙 적용 AddApacheModRewrite합니다.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.

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

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

샘플 응용 프로그램에서 요청을 리디렉션합니다 /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

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

지원 되는 서버 변수Supported server variables

미들웨어는 다음 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
  • I P V 6IPV6
  • 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_PORT
  • SERVER_PROTOCOLSERVER_PROTOCOL
  • 시간TIME
  • 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

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

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

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

샘플 응용 프로그램의 요청을 다시 작성 /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

출시 미들웨어 2.x ASP.NET 코어는 다음과 같은 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

지원 되는 서버 변수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

참고

가져올 수도 있습니다는 IFileProvider 통해는 PhysicalFileProvider합니다.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. context.Result 확인 방법을 추가 파이프라인 처리 됩니다.The context.Result determines how additional pipeline processing is handled.

컨텍스트입니다. 결과context.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
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);
}

샘플 응용 프로그램으로 끝나는 경로 대 한 요청을 리디렉션하는 방법을 보여 줍니다. .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 (OK) 상태 코드가 반환 되 고 클라이언트에 리디렉션도 발생 하지 않습니다.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 implement your own rule logic in a class that derives from IRule. 사용 하는 IRule 규칙 메서드 기반 방식을 사용 하 여 보다 큰 유연성을 제공 합니다.Using an IRule provides greater flexibility over using the method-based rule approach. 파생 된 클래스에 대 한 매개 변수에서 전달 될 수 있는 생성자를 포함 될 수 있습니다는 ApplyRule 메서드.Your derived class may include a constructor, where you can pass in parameters for the ApplyRule method.

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

샘플 응용 프로그램에 대 한 매개 변수 값의 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 throw 됩니다.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 문자열 &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)])$
예:/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