我正在尝试在.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);
}
问题是,尽管任何浏览器都将响应正确地呈现为原始HTML页面,但是返回页面中包含的任何script
或link
(任何相对URL)都将失败。
上面的代码中缺少什么来使浏览器正确解析内部相对URL?
在上面的示例中,如果运行它,则会从google.com
中显示https://localhost:44307/api/test
页面,但相对URL-s中的图像和其他内容丢失了,因为它们无法解析内部相对网址。
在混乱中,我尝试在请求和响应中使用Referer
和Host
之类的属性,但是没有取得任何进展。
在需要的地方。我们需要通过IFRAME使用第三方网站,并且该网站要求提供Authorization
标头,因此上述代理应该这样做,然后返回该网站,因此可以直接使用API链接,像这样:<iframe src="https://localhost:44307/api/test">
-此示例应在iframe中呈现完整的google.com
网站,但仅呈现HTML。
答案 0 :(得分:0)
大量的网站使用相对路径来获取其资源(脚本/链接/图像/等),因为它很方便并且允许它们在不同的环境中工作。例如,拥有开发服务器,登台服务器和生产服务器要求每个服务器都能够加载适当的内容。话虽这么说,您有几个选择,但是它们将要求您解析那里的内容:
您可以使用代理链接替换其对内部源的所有引用,以便为每种资源添加标题。
您可以将其所有相对路径替换为原始域的绝对路径,以便所有资源请求都绕过您的代理。取决于其安全性,可以解决一些问题。
正如某些人所提到的,这两种解决方案都不会使拥有健壮的解决方案变得容易,并且还需要解析CSS和JavaScript以获取相对路径。不幸的是,这并不是一件容易的事,但可能比尝试使用某种类型的虚拟化要容易得多。
要替换内容,可以使用HTMLAgilityPack之类的内容。我已经在一些项目中使用了它,并且效果很好,并且拥有一个相当不错的社区。 p>
这位绅士发布了一个如何做类似HERE的事情的例子。