介紹
當代理請求時,通常會修改請求或回應的一部分,以適應目的地伺服器的需求,或傳遞其他數據,例如使用者的原始IP位址。 此過程是透過轉換來實現。 轉換類型會針對應用程式全域定義,然後個別路由提供參數來啟用和設定這些轉換。 原始請求物件不會受到這些轉換的修改,只有代理請求會被修改。
YARP 不提供要求和回應本文的轉換功能,但您可以撰寫中介軟體來實現這一功能。
違約
預設情況下,所有路由都會啟用以下轉換。 您可以設定或停用它們,如本檔稍後所示。
- 主機 - 隱藏傳入要求的主機標頭。 Proxy 要求預設使用目的地伺服器位址中指定的主機名稱。 請參閱下方
RequestHeaderOriginalHost。 - X-Forwarded-For - 將用戶端的 IP 位址設定為 X-Forwarded-For 標頭。 請參閱下方
X-Forwarded。 - X-Forwarded-Proto - 將要求的原始設定 (HTTP/https) 設定為 X-Forwarded-Proto 標頭。 請參閱下方
X-Forwarded。 - X-Forwarded-Host - 將要求的原始主機設定為 X-Forwarded-Host 標頭。 請參閱下方
X-Forwarded。 - X-Forwarded-Prefix - 將請求的原始 PathBase(若有)設定到 X-Forwarded-Prefix 標頭。 請參閱下方
X-Forwarded。
例如,下列傳至 http://IncomingHost:5000/path的要求如下:
GET /path HTTP/1.1
Host: IncomingHost:5000
Accept: */*
header1: foo
會被轉換並代理到目的地伺服器 https://DestinationHost:6000/,使用默認設定,如下所示:
GET /path HTTP/1.1
Host: DestinationHost:6000
Accept: */*
header1: foo
X-Forwarded-For: 5.5.5.5
X-Forwarded-Proto: http
X-Forwarded-Host: IncomingHost:5000
轉換類別
轉換分為幾個類別:要求、回應,以及 回應預告片。 因為基礎的 HttpClient 不支援,因此不支援要求預告片。
如果內建的轉換集不足,則可以透過 擴充性來新增自定義轉換。
新增轉換
您可以透過組態或以程式化方式將轉換添加至路由。
來自設定
轉換可以在 RouteConfig.Transforms 上設定,而且可以從組態檔的 Routes 區段系結。 您可以修改和重載這些屬性,而不需重新啟動 Proxy。 轉換是透過設定一個或多個鍵值對字串來完成。
以下是常見轉換的範例:
{
"ReverseProxy": {
"Routes": {
"route1" : {
"ClusterId": "cluster1",
"Match": {
"Hosts": [ "localhost" ]
},
"Transforms": [
{ "PathPrefix": "/apis" },
{
"RequestHeader": "header1",
"Append": "bar"
},
{
"ResponseHeader": "header2",
"Append": "bar",
"When": "Always"
},
{ "ClientCert": "X-Client-Cert" },
{ "RequestHeadersCopy": "true" },
{ "RequestHeaderOriginalHost": "true" },
{
"X-Forwarded": "Append",
"HeaderPrefix": "X-Forwarded-"
}
]
},
"route2" : {
"ClusterId": "cluster1",
"Match": {
"Path": "/api/{plugin}/stuff/{**remainder}"
},
"Transforms": [
{ "PathPattern": "/foo/{plugin}/bar/{**remainder}" },
{
"QueryValueParameter": "q",
"Append": "plugin"
}
]
}
},
"Clusters": {
"cluster1": {
"Destinations": {
"cluster1/destination1": {
"Address": "https://localhost:10001/Path/Base"
}
}
}
}
}
}
所有組態條目都會被視為不區分大小寫,不過目的地伺服器可能會將處理後的值視為區分大小寫或不區分大小寫,例如路徑。
本檔稍後會討論這些轉換的詳細數據。
想要將其自定義轉換與組態的 Transforms 區段整合的開發人員,可以使用以下所述的 ITransformFactory 來執行此動作。
從程式碼
您可以呼叫 AddTransforms 方法,以程式化方式將轉換新增至路由。
在 AddTransforms 之後可以呼叫 AddReverseProxy,以提供用於配置轉換的回呼函數。 每次建置或重建路由時,都會叫用此回呼,並允許開發人員檢查 RouteConfig 資訊,並有條件地為其新增轉換。
AddTransforms 回呼提供一個 TransformBuilderContext,於其中可以新增或設定轉換。 大部分的轉換會提供 TransformBuilderContext 擴充方法,使其新增變得更加容易。 這些延伸模組記載於下方,其中包含個別的轉換描述。
TransformBuilderContext 也包含一個 IServiceProvider,用於存取任何所需的服務。
services.AddReverseProxy()
.LoadFromConfig(_configuration.GetSection("ReverseProxy"))
.AddTransforms(builderContext =>
{
// Added to all routes.
builderContext.AddPathPrefix("/prefix");
// Conditionally add a transform for routes that require auth.
if (!string.IsNullOrEmpty(builderContext.Route.AuthorizationPolicy))
{
builderContext.AddRequestTransform(async transformContext =>
{
transformContext.ProxyRequest.Headers.Add("CustomHeader", "CustomValue");
});
}
});
如需更進階的控制,請參閱下列 ITransformProvider。