asp.net-core - 使用中间件设置响应的虚拟路径
asp.net-core - Set response's virtual path with middleware
设置
- ASP.NET-Core Web 应用程序托管于
https://first-domain.com/
- 使用 load-balancer 将站点置于
https://second-domain.com/some/path
下,这样对 https://second-domain.com/some/path/Page1
的请求会将请求传递给 https://first-domain.com/Page1
- 转发请求时发送headers:
X-Original-Host = 'second-domain.com'
X-Original-BasePath = 'some/path'
X-Original-Url = 'https://second-domain.com/some/path/Page1'
- 页面使用 ASP.NET 根路径字符 (
~
) 来引用相对于应用程序根目录的资源。
- 使用 ASP.NET-Core middleware 根据 headers 动态路由请求。
问题
我的中间件正确地将请求路由到页面。基于 headers,对 https://second-domain.com/some/path/PageX
的请求正确检索了位于 https://first-domain.com/PageX
的资源。
但是,使用 ASP.NET 根路径字符 (~
) 的 PageX
的 URL 正在解析为 /
,因此客户端会尝试访问资源https://second-domain.com/
不存在。
例如,如果 PageX.cshtml
有一个 <img src="~/myImage.png>
标签,客户端的浏览器将尝试检索资源 https://second-domain.com/myImage.png
而不是 https://second-domain.com/some/path/myImage.png
问题
有没有办法通过 ASP.NET-Core middleware 操纵请求 and/or 响应,以便动态解析 ASP.NET 根路径 (~
)?
换句话说,我正在尝试通过 IIS/Azure.
动态设置虚拟路径而不使用 infrastructure-defined 虚拟路径
这可以通过从中间件设置 context.Request.PathBase
来完成。
设置
- ASP.NET-Core Web 应用程序托管于
https://first-domain.com/
- 使用 load-balancer 将站点置于
https://second-domain.com/some/path
下,这样对https://second-domain.com/some/path/Page1
的请求会将请求传递给https://first-domain.com/Page1
- 转发请求时发送headers:
X-Original-Host = 'second-domain.com'
X-Original-BasePath = 'some/path'
X-Original-Url = 'https://second-domain.com/some/path/Page1'
- 页面使用 ASP.NET 根路径字符 (
~
) 来引用相对于应用程序根目录的资源。 - 使用 ASP.NET-Core middleware 根据 headers 动态路由请求。
问题
我的中间件正确地将请求路由到页面。基于 headers,对 https://second-domain.com/some/path/PageX
的请求正确检索了位于 https://first-domain.com/PageX
的资源。
但是,使用 ASP.NET 根路径字符 (~
) 的 PageX
的 URL 正在解析为 /
,因此客户端会尝试访问资源https://second-domain.com/
不存在。
例如,如果 PageX.cshtml
有一个 <img src="~/myImage.png>
标签,客户端的浏览器将尝试检索资源 https://second-domain.com/myImage.png
而不是 https://second-domain.com/some/path/myImage.png
问题
有没有办法通过 ASP.NET-Core middleware 操纵请求 and/or 响应,以便动态解析 ASP.NET 根路径 (~
)?
换句话说,我正在尝试通过 IIS/Azure.
动态设置虚拟路径而不使用 infrastructure-defined 虚拟路径这可以通过从中间件设置 context.Request.PathBase
来完成。