我正在尝试在 .NET Core REST 服务中实现一个简单的代理,这样我就可以注入额外的身份验证标头,然后像普通网站一样将其返回给任何客户端。
简化的形式如下所示:
[HttpGet]
public async Task<ContentResult> Get()
{
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "http://google.com");
/* some extra headers injection happens here */
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadAsStringAsync();
return Content(result, "text/html", Encoding.UTF8);
}
Run Code Online (Sandbox Code Playgroud)
问题在于,虽然任何浏览器都能将响应正确呈现为原始 HTML 页面,但返回页面中的任何script或(任何相对 URL)包含都会失败。link
上面的代码中缺少什么才能使浏览器正确解析内部相对 URL?
在上面的示例中,如果我运行它,我会google.com从 my 中显示页面https://localhost:44307/api/test,但相对 URL 中的图像和其他内容丢失,因为它们无法解析内部相对 URL。
在困惑中,我尝试在请求和响应中使用诸如Referer和 之类的属性Host,但没有取得任何进展。
哪里需要它。我们需要通过 IFRAME 使用第三方网站,而该网站需要存在Authorizationheader,因此上面的代理应该做到这一点,然后返回网站,因此可以直接使用 API 链接,如下所示:<iframe src="https://localhost:44307/api/test">- this示例应该google.com在 iframe 内呈现完整的网站,但它仅呈现 HTML。
许多网站使用相对路径来获取资源(脚本/链接/图像/等),因为它很方便,并且允许它们拥有不同的工作环境。例如,拥有一台开发服务器、一台临时服务器和一台生产服务器要求每台服务器都能够加载适当的内容。话虽如此,您有几个选择,但它们将要求您解析其中的内容:
您可以将所有对内部源的引用替换为指向代理的链接,以便为每个资源添加标头。
您可以将它们的所有相对路径替换为原始域的绝对路径,以便所有资源请求绕过您的代理。根据其安全性,可能会出现一些问题。
正如一些人所提到的,这些解决方案都无法轻松获得可靠的解决方案,并且还需要解析 CSS 和 JavaScript 以获得相对路径。不幸的是,这并不完全是一件容易的任务,但可能比尝试使用某种虚拟化要容易得多。
要替换内容,您可以使用HTMLAgilityPack之类的东西。我已经在几个项目中使用过它,它运行得很好并且有一个非常好的社区。
这位先生在这里发布了一个如何做非常类似的事情的例子。
| 归档时间: |
|
| 查看次数: |
1184 次 |
| 最近记录: |