Nguon: Microsoft Learn · .NET 8.0

YARP — Transform Request

Nguồn: YARP Request Transforms

Transform request bao gồm path, query, phiên bản HTTP, phương thức và header. Trong code, chúng được đại diện bởi đối tượng RequestTransformContext và được xử lý bởi các lớp kế thừa từ lớp trừu tượng RequestTransform.

Lưu ý:

Dưới đây là các transform tích hợp sẵn được nhận dạng qua key cấu hình chính. Các transform này được áp dụng theo thứ tự được chỉ định trong cấu hình route.

PathPrefix

Sửa đổi path của request bằng cách thêm tiền tố

KeyValueBắt buộc
PathPrefixMột path bắt đầu bằng '/'

Cấu hình:

json
{ "PathPrefix": "/prefix" }

Code:

csharp
routeConfig = routeConfig.WithTransformPathPrefix(prefix: "/prefix");
csharp
transformBuilderContext.AddPathPrefix(prefix: "/prefix");

Ví dụ: /request/path trở thành /prefix/request/path

PathRemovePrefix

Sửa đổi path của request bằng cách xóa tiền tố

KeyValueBắt buộc
PathRemovePrefixMột path bắt đầu bằng '/'

Cấu hình:

json
{ "PathRemovePrefix": "/prefix" }

Code:

csharp
routeConfig = routeConfig.WithTransformPathRemovePrefix(prefix: "/prefix");
csharp
transformBuilderContext.AddPathRemovePrefix(prefix: "/prefix");

Ví dụ: /prefix/request/path trở thành /request/path; /prefix2/request/path không bị thay đổi.

Transform này xóa tiền tố khớp khỏi path của request. Việc khớp được thực hiện trên ranh giới path segment (/). Nếu tiền tố không khớp thì không có thay đổi nào được thực hiện.

PathSet

Thay thế path của request bằng giá trị được chỉ định

KeyValueBắt buộc
PathSetMột path bắt đầu bằng '/'

Cấu hình:

json
{ "PathSet": "/newpath" }

Code:

csharp
routeConfig = routeConfig.WithTransformPathSet(path: "/newpath");
csharp
transformBuilderContext.AddPathSet(path: "/newpath");

Ví dụ: /request/path trở thành /newpath

PathPattern

Thay thế path của request bằng một template pattern

KeyValueBắt buộc
PathPatternMột path template bắt đầu bằng '/'

Cấu hình:

json
{ "PathPattern": "/my/{plugin}/api/{**remainder}" }

Code:

csharp
routeConfig = routeConfig.WithTransformPathRouteValues(
    pattern: new PathString("/my/{plugin}/api/{**remainder}"));
csharp
transformBuilderContext.AddPathRouteValues(
    pattern: new PathString("/my/{plugin}/api/{**remainder}"));

Transform này đặt path của request với giá trị đã cho và thay thế bất kỳ segment {} nào bằng giá trị route tương ứng. Các segment {} không có giá trị route khớp sẽ bị xóa. Segment {} cuối cùng có thể được đánh dấu là {**remainder} để chỉ ra đây là segment catch-all có thể chứa nhiều path segment.

Ví dụ:

BướcGiá trị
Định nghĩa route/api/{plugin}/stuff/{**remainder}
Path request/api/v1/stuff/more/stuff
Giá trị pluginv1
Giá trị remaindermore/stuff
PathPattern/my/{plugin}/api/{**remainder}
Kết quả/my/v1/api/more/stuff

QueryValueParameter

Thêm hoặc thay thế tham số trong query string của request

KeyValueBắt buộc
QueryValueParameterTên tham số query string
Set/AppendGiá trị tĩnh

Cấu hình:

json
{
  "QueryValueParameter": "foo",
  "Append": "bar"
}

Code:

csharp
routeConfig = routeConfig.WithTransformQueryValue(
    queryKey: "foo", value: "bar", append: true);
csharp
transformBuilderContext.AddQueryValue(
    queryKey: "foo", value: "bar", append: true);

Ví dụ:

BướcGiá trị
Query?a=b
QueryValueParameterfoo
Appendremainder
Kết quả?a=b&foo=remainder

QueryRouteParameter

Thêm hoặc thay thế tham số query string bằng giá trị từ cấu hình route

KeyValueBắt buộc
QueryRouteParameterTên tham số query string
Set/AppendTên của một giá trị route

Cấu hình:

json
{
  "QueryRouteParameter": "foo",
  "Append": "remainder"
}

Code:

csharp
routeConfig = routeConfig.WithTransformQueryRouteValue(
    queryKey: "foo", routeValueKey: "remainder", append: true);
csharp
transformBuilderContext.AddQueryRouteValue(
    queryKey: "foo", routeValueKey: "remainder", append: true);

Ví dụ:

BướcGiá trị
Định nghĩa route/api/{*remainder}
Path request/api/more/stuff
Giá trị remaindermore/stuff
QueryRouteParameterfoo
Appendremainder
Kết quả?foo=more/stuff

QueryRemoveParameter

Xóa tham số được chỉ định khỏi query string của request

KeyValueBắt buộc
QueryRemoveParameterTên tham số query string

Cấu hình:

json
{ "QueryRemoveParameter": "foo" }

Code:

csharp
routeConfig = routeConfig.WithTransformQueryRemoveKey(queryKey: "foo");
csharp
transformBuilderContext.AddQueryRemoveKey(queryKey: "foo");

Ví dụ:

BướcGiá trị
Path request?a=b&foo=c
QueryRemoveParameterfoo
Kết quả?a=b

HttpMethodChange

Thay đổi HTTP method được dùng trong request

KeyValueBắt buộc
HttpMethodChangeHTTP method cần thay thế
SetHTTP method mới

Cấu hình:

json
{
  "HttpMethodChange": "PUT",
  "Set": "POST"
}

Code:

csharp
routeConfig = routeConfig.WithTransformHttpMethodChange(
    fromHttpMethod: HttpMethods.Put, toHttpMethod: HttpMethods.Post);
csharp
transformBuilderContext.AddHttpMethodChange(
    fromHttpMethod: HttpMethods.Put, toHttpMethod: HttpMethods.Post);

Transform này sẽ đổi các request PUT thành POST.

RequestHeadersCopy

Đặt có sao chép header của request đến sang request đi hay không

KeyValueMặc địnhBắt buộc
RequestHeadersCopytrue/falsetrue

Cấu hình:

json
{ "RequestHeadersCopy": "false" }

Code:

csharp
routeConfig = routeConfig.WithTransformCopyRequestHeaders(copy: false);
csharp
transformBuilderContext.CopyRequestHeaders = false;

Đặt xem có sao chép tất cả header của request đến vào proxy request không. Cài đặt này được bật mặc định và có thể tắt bằng cách cấu hình transform với giá trị false. Các transform tham chiếu đến header cụ thể vẫn sẽ chạy nếu cài đặt này bị tắt.

RequestHeaderOriginalHost

Chỉ định xem header Host của request đến có nên được sao chép sang proxy request không

KeyValueMặc địnhBắt buộc
RequestHeaderOriginalHosttrue/falsefalse

Cấu hình:

json
{ "RequestHeaderOriginalHost": "true" }

Code:

csharp
routeConfig = routeConfig.WithTransformUseOriginalHostHeader(useOriginal: true);
csharp
transformBuilderContext.AddOriginalHost(true);

Cài đặt này bị tắt mặc định và có thể bật bằng cách cấu hình transform với giá trị true. Các transform tham chiếu trực tiếp đến header Host sẽ ghi đè transform này.

RequestHeader

Thêm hoặc thay thế header của request

KeyValueBắt buộc
RequestHeaderTên header
Set/AppendGiá trị header

Cấu hình:

json
{
  "RequestHeader": "MyHeader",
  "Set": "MyValue"
}

Code:

csharp
routeConfig = routeConfig.WithTransformRequestHeader(
    headerName: "MyHeader", value: "MyValue", append: false);
csharp
transformBuilderContext.AddRequestHeader(
    headerName: "MyHeader", value: "MyValue", append: false);

Ví dụ:

code
MyHeader: MyValue

Transform này đặt hoặc nối thêm giá trị cho header được đặt tên. Set thay thế bất kỳ header hiện có nào. Append thêm một header bổ sung với giá trị đã cho. Lưu ý: việc đặt "" làm giá trị header không được khuyến nghị và có thể gây ra hành vi không xác định.

RequestHeaderRouteValue

Thêm hoặc thay thế header bằng giá trị từ cấu hình route

KeyValueBắt buộc
RequestHeaderRouteValueTên header
Set/AppendTên của một giá trị route

Cấu hình:

json
{
  "RequestHeaderRouteValue": "MyHeader",
  "Set": "MyRouteKey"
}

Code:

csharp
routeConfig = routeConfig.WithTransformRequestHeaderRouteValue(
    headerName: "MyHeader", routeValueKey: "key", append: false);
csharp
transformBuilderContext.AddRequestHeaderRouteValue(
    headerName: "MyHeader", routeValueKey: "key", append: false);

Ví dụ:

BướcGiá trị
Định nghĩa route/api/{*remainder}
Path request/api/more/stuff
Giá trị remaindermore/stuff
RequestHeaderFromRoutefoo
Appendremainder
Kết quảfoo: more/stuff

RequestHeaderRemove

Xóa header của request

KeyValueBắt buộc
RequestHeaderRemoveTên header

Cấu hình:

json
{
  "RequestHeaderRemove": "MyHeader"
}

Code:

csharp
routeConfig = routeConfig.WithTransformRequestHeaderRemove(headerName: "MyHeader");
csharp
transformBuilderContext.AddRequestHeaderRemove(headerName: "MyHeader");

Transform này xóa header có tên được chỉ định.

RequestHeadersAllowed

KeyValueBắt buộc
RequestHeadersAllowedDanh sách tên header được phép, phân tách bằng dấu chấm phẩy.

Cấu hình:

json
{
  "RequestHeadersAllowed": "Header1;header2"
}

Code:

csharp
routeConfig = routeConfig.WithTransformRequestHeadersAllowed("Header1", "header2");
csharp
transformBuilderContext.AddRequestHeadersAllowed("Header1", "header2");

YARP sao chép hầu hết header request sang proxy request theo mặc định (xem RequestHeadersCopy). Một số mô hình bảo mật chỉ cho phép proxy các header cụ thể. Transform này tắt RequestHeadersCopy và chỉ sao chép các header được chỉ định.

Lưu ý rằng có một số header YARP không sao chép mặc định vì chúng đặc thù cho kết nối hoặc nhạy cảm về bảo mật (ví dụ Connection, Alt-Svc). Việc đặt những tên header đó vào danh sách cho phép sẽ bỏ qua hạn chế đó nhưng rất không được khuyến khích.

Ví dụ: chỉ header1 và header2 được sao chép vào proxy request.

X-Forwarded

Thêm header với thông tin về request gốc của client

KeyValueMặc địnhBắt buộc
X-ForwardedHành động mặc định (Set, Append, Remove, Off) áp dụng cho tất cả X-Forwarded-\*Set
ForHành động áp dụng cho header này\* Xem X-Forwardedkhông
ProtoHành động áp dụng cho header này\* Xem X-Forwardedkhông
HostHành động áp dụng cho header này\* Xem X-Forwardedkhông
PrefixHành động áp dụng cho header này\* Xem X-Forwardedkhông
HeaderPrefixTiền tố tên header"X-Forwarded-"không

Hành động "Off" hoàn toàn tắt transform.

Cấu hình:

json
{
  "X-Forwarded": "Set",
  "For": "Remove",
  "Proto": "Append",
  "Prefix": "Off",
  "HeaderPrefix": "X-Forwarded-"
}

Code:

csharp
routeConfig = routeConfig.WithTransformXForwarded(
  headerPrefix = "X-Forwarded-",
  ForwardedTransformActions xDefault = ForwardedTransformActions.Set,
  ForwardedTransformActions? xFor = null,
  ForwardedTransformActions? xHost = null,
  ForwardedTransformActions? xProto = null,
  ForwardedTransformActions? xPrefix = null);
csharp
transformBuilderContext.AddXForwarded(ForwardedTransformActions.Set);
transformBuilderContext.AddXForwardedFor(headerName: "X-Forwarded-For", ForwardedTransformActions.Append);
transformBuilderContext.AddXForwardedHost(headerName: "X-Forwarded-Host", ForwardedTransformActions.Append);
transformBuilderContext.AddXForwardedProto(headerName: "X-Forwarded-Proto", ForwardedTransformActions.Off);
transformBuilderContext.AddXForwardedPrefix(headerName: "X-Forwarded-Prefix", ForwardedTransformActions.Remove);

Ví dụ:

code
X-Forwarded-For: 5.5.5.5
X-Forwarded-Proto: https
X-Forwarded-Host: IncomingHost:5000
X-Forwarded-Prefix: /path/base

Tắt header mặc định:

json
{ "X-Forwarded": "Off" }
csharp
transformBuilderContext.UseDefaultForwarders = false;

Khi proxy kết nối đến máy chủ đích, kết nối đó độc lập với kết nối client đã tạo tới proxy. Máy chủ đích có thể cần thông tin kết nối gốc để kiểm tra bảo mật và tạo URI tuyệt đối cho các liên kết và chuyển hướng đúng cách.

Transform này được bật mặc định ngay cả khi không được chỉ định trong cấu hình route.

{Prefix}For: Giá trị header được lấy từ HttpContext.Connection.RemoteIpAddress — địa chỉ IP của caller trước đó.

{Prefix}Proto: Giá trị header được lấy từ HttpContext.Request.Scheme — cho biết caller trước đó đã sử dụng HTTP hay HTTPS.

{Prefix}Host: Giá trị header được lấy từ header Host của request đến. Điều này độc lập với RequestHeaderOriginalHost.

{Prefix}Prefix: Giá trị header được lấy từ HttpContext.Request.PathBase.

Forwarded

Thêm header với thông tin về request gốc của client (theo chuẩn RFC)

KeyValueMặc địnhBắt buộc
ForwardedDanh sách phân tách bằng dấu phẩy có thể chứa: for, by, proto, host(none)
ForFormatRandom/RandomAndPort/RandomAndRandomPort/Unknown/UnknownAndPort/UnknownAndRandomPort/Ip/IpAndPort/IpAndRandomPortRandomkhông
ByFormatRandom/RandomAndPort/RandomAndRandomPort/Unknown/UnknownAndPort/UnknownAndRandomPort/Ip/IpAndPort/IpAndRandomPortRandomkhông
ActionHành động áp dụng (Set, Append, Remove, Off)Setkhông

Cấu hình:

json
{
  "Forwarded": "by,for,host,proto",
  "ByFormat": "Random",
  "ForFormat": "IpAndPort",
  "Action": "Append"
}

Code:

csharp
routeConfig = routeConfig.WithTransformForwarded(
    useHost: true, useProto: true, forFormat: NodeFormat.IpAndPort, 
    ByFormat: NodeFormat.Random, action: ForwardedTransformAction.Append);

Ví dụ:

code
Forwarded: proto=https;host="localhost:5001";for="[::1]:20173";by=_YQuN68tm6

Header Forwarded được định nghĩa bởi RFC 7239. Nó hợp nhất nhiều chức năng giống với các header X-Forwarded không chính thức.

Bật transform này sẽ tắt các transform X-Forwarded mặc định vì chúng mang thông tin tương tự ở định dạng khác. Các transform X-Forwarded vẫn có thể được bật tường minh.

Định dạng ByFormat và ForFormat:

Định dạngMô tảVí dụ
RandomĐịnh danh bị làm mờ được tạo ngẫu nhiên mỗi requestby=_YQuN68tm6
RandomAndPortĐịnh danh Random cộng với portby="_YQuN68tm6:80"
RandomAndRandomPortĐịnh danh Random cộng với định danh ngẫu nhiên cho portby="_YQuN68tm6:_jDw5Cf3tQ"
UnknownDùng khi không biết danh tính của thực thể trướcby=unknown
UnknownAndPortUnknown cộng với port nếu cóby="unknown:80"
UnknownAndRandomPortUnknown cộng với định danh ngẫu nhiên cho portby="unknown:_jDw5Cf3tQ"
IpĐịa chỉ IPv4 hoặc IPv6 kèm ngoặc vuôngby="[::1]"
IpAndPortĐịa chỉ IP cộng với portby="[::1]:80"
IpAndRandomPortĐịa chỉ IP cộng với định danh ngẫu nhiên cho portby="[::1]:_jDw5Cf3tQ"

ClientCert

Chuyển tiếp chứng chỉ client được dùng trên kết nối đến như một header tới đích

KeyValueBắt buộc
ClientCertTên header

Cấu hình:

json
{ "ClientCert": "X-Client-Cert" }

Code:

csharp
routeConfig = routeConfig.WithTransformClientCertHeader(headerName: "X-Client-Cert");
csharp
transformBuilderContext.AddClientCertHeader(headerName: "X-Client-Cert");

Ví dụ:

code
X-Client-Cert: SSdtIGEgY2VydGlmaWNhdGU...

Vì kết nối đến và đi là độc lập, cần có cách truyền chứng chỉ client đến sang máy chủ đích. Transform này khiến chứng chỉ client (lấy từ HttpContext.Connection.ClientCertificate) được mã hóa Base64 và đặt làm giá trị cho tên header đã cho.

Transform này chỉ áp dụng nếu chứng chỉ client đã có trên kết nối.