希望有人可以帮助我或指出我正确的方向。
我被要求了解如何让Akamai(或任何其他CDN或NGINX)修改实际的响应机构。
为什么?
我要让CDN将所有“http://”请求更改为“https://”,而不是将App代码修改为使用“//”来进行外部资源请求。
这可能吗?
有人知道吗?
答案 0 :(得分:14)
这似乎是可能通过多种不同的方法,但这并不是说建议实际上是怎样的。
这看起来可能有问题(例如:如果你重写了一些不应该被重写的内容怎么办?)和机器资源密集型(很多CPU周期来重复解析和消除响应主体)。
这是我发现的:
Nginx有http_sub_module似乎以一种相当简单的方式完成此任务,假设你想要替换的内容很简单,你只需要在每个页面上匹配一个模式,比如将<a href="http://example.com/...
替换为{ {1}},一次或多次。这种内容 - 似乎是粗略的,但根据你所处的情况(可能是对应用程序的有限控制之一),它可能会让你到那里。
看起来有一些名为http_substitutions_filter的东西,可能是非正式的,或者至少不是核心Nginx发行版的一部分,它可以对响应主体进行更强大的基于过滤器的重写。
Varnish seems to have一个类似的功能(可能是一个插件),但是HAProxy doesn't,因为除了进行gzip卸载外,它只处理标题并单独离开主体。其他支持反向代理的软件,如Apache或Squid,也可能提供一些有用的东西,你可以放在应用服务器前面。
无论如何,我的初步印象是,简单的字符串替换可能无法让你在那里,甚至基于正则表达式的替换也不足以在正则表达式中没有显着的复杂性,因为你总是冒险重写一些你不应该做的事情。
我建议&#34;真正需要发生的事情&#34;为了以最正确的方式实现此目的,将实际解释生成的HTML与DOM解析库,遍历树,并在将修订的文档交给请求者之前就地修改相关元素。这样,文档就会根据对其内容的上下文理解进行修改。
在我看来,这听起来很复杂,因为它是 - 所以我会再次建议你重新考虑你的计划方法,除非这超出了你的控制范围。
最后的想法:好奇心得到了我的好处,所以我接受了这个问题并改进了我编写的http反向代理(用于不同的目的),这样,根据内容类型,它实际上可以解析和遍历HTML在将响应主体返回给请求者之前,将结构作为适当的实体进行修改(如上所述)。
事实证明,正如我所料,这是一个相当处理器密集型的。我的测试内容是来自实际网站的29K真实HTML,包含56个<a href="https://example.com/...
和6个<a href ...>
元素,1 GHz Opteron 1218上的重写操作需要128 ms,而43 ms 2.4 GHz至强E5620。这些基准测试严格用于附加操作 - 不包括实际&#34;代理所需的(较少量)时间。功能本身。这个时间成本并非不可克服,但可能会增加大量的CPU时间。这比基于正则表达式的内容重写要长得多,但它更精确,不太可能破坏它接触的页面。
答案 1 :(得分:9)
Nginx的HttpSubsModule非常适合我:http://wiki.nginx.org/HttpSubsModule
从http更改为https应该像这样简单:
location / {
subs_filter_types text/html text/css text/xml;
subs_filter http.example.com https.example.com gi;
}
答案 2 :(得分:7)
语法相同但正确。
location / {
sub_filter_types text/html text/css text/xml;
sub_filter 'http.example.com' 'https.example.com';
}