Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
nginx:对代理\u传递响应头执行操作_Nginx_Reverse Proxy_Proxypass - Fatal编程技术网

nginx:对代理\u传递响应头执行操作

nginx:对代理\u传递响应头执行操作,nginx,reverse-proxy,proxypass,Nginx,Reverse Proxy,Proxypass,我希望使用nginx作为前端代理,但是根据响应的MIME类型(Content-type头),它可以有条件地代理到另一个URL 例如,假设我有1%的客户使用不处理PNG的用户代理。对于该UA,如果响应类型为image/png,我想再次代理传递到一个特殊的URL,该URL将获取png并为我转换它 理想情况下,对于99%不需要这种特殊处理的用户,我会在不影响性能和缓存的情况下这样做。我无法修改后端应用程序。(否则,我可以让它检测UA并修复响应,或者发送一个X-Accel-Redirect以让nginx

我希望使用nginx作为前端代理,但是根据响应的MIME类型(Content-type头),它可以有条件地代理到另一个URL

例如,假设我有1%的客户使用不处理PNG的用户代理。对于该UA,如果响应类型为image/png,我想再次代理传递到一个特殊的URL,该URL将获取png并为我转换它

理想情况下,对于99%不需要这种特殊处理的用户,我会在不影响性能和缓存的情况下这样做。我无法修改后端应用程序。(否则,我可以让它检测UA并修复响应,或者发送一个X-Accel-Redirect以让nginx运行另一个位置块。)

如果这是不可能的,或者性能不好,我会从哪里开始编写模块以达到预期的效果?在中,哪个扩展点最接近实现这个逻辑


编辑:似乎我可以使用Lua执行子请求,然后检查那里的响应头。但这意味着通过Lua传递每个请求,这似乎不是最理想的

尽管我确信有足够的理由去做你想做的事情,但你实际的
图像/png
示例并不像看上去那么简单。浏览器不再像以前png是新浏览器时那样在其
Accept
HTTP请求头中包含
image/png
,因此,您必须拥有真正古老浏览器的整个检测和映射表

此外,从架构的角度来看,还不太清楚您想要实现什么

  • 如果这是静态数据,那么为什么首先要将其代理到后端,而不是直接从nginx提供静态数据?
    \.png$
    正则表达式是否与受影响的请求URI不匹配?您能否在不涉及后端的情况下解决此问题,或者甚至在不首先将错误的请求发送到后端的情况下重写请求

  • 如果这真的是动态的,那么为什么您需要浪费时间来发出请求,而只是为了接收不可接受类型的回复,而不是根据您对应用程序工作方式的了解来创建特殊情况映射表,并从一开始就绕过不必要的请求,而不是在以后丢弃它们

  • 如果应用程序真的是一个黑匣子,并且你需要一个通用的解决方案,该解决方案适用于任何应用程序,那么还不清楚用例是什么,以及为什么必须提出额外的请求,而这些请求只能被丢弃

如果您真的希望只处理图像/png示例中1%的流量,那么将所有请求从受影响的1%旧浏览器重定向到一个单独的后端可能是有意义的,该后端具有满足您需要的逻辑


坦白地说,如果你想把目标锁定在非常古老的浏览器上,那么我认为png支持应该是你最后的担忧。许多Web应用程序都包含非常复杂和专用的JavaScript,这些JavaScript甚至无法在具有新用户代理字符串的新浏览器中工作,更不用说那些甚至不支持png的旧Web浏览器了。

。我想你可以有一些类似于 if($content\u type~‘无论您的内容类型是什么’){ 代理传递“ur\U url” }


这对你有用吗?

PNG更像是一个例子。另一个可能是为无法运行JavaScript的搜索引擎转换文本/html。我们的目标是搞乱一小部分流量,但在我得到响应之前,我不确定是否需要搞乱响应-nginx处于边缘,没有任何资产。我通过几次内部重写和Lua实现了一些功能。为搜索引擎转换JavaScript也是一个值得怀疑的用例——这通常是谷歌明确禁止的,而且还不清楚你希望如何在转换随机应用程序方面比谷歌更聪明,特别是在设计中,您只需在后端处理完第一个请求后就放弃它。我认为你应该有两个后端,并根据必须采取的行动重定向到其中任何一个——这可能比尝试编写自己的模块要简单得多。谷歌实际上明确地告诉你为他们的引擎转换页面。-无论出于何种原因,谷歌迄今为止拒绝将其爬虫程序变成一个完整的浏览器,因此无论好坏,它显然无法处理完全使用JS的新应用程序。问题是,在看到响应的内容类型之前,您不知道请求是否需要特殊处理。我会看看是否可以发布一个简短版本的我们使用Lua的想法。这并不难,只是有点复杂。@MichaelGG,谢谢你指出ajax爬行规范;然而,这又回到了我的答案中的要点——您应该使用多个后端来解决这个问题,其中每个请求将只发送到其中一个,而不是两个。如果您对应用程序有足够的了解,可以将页面转换为ajax爬行,那么您当然也可以完全基于原始请求,确定地预测来自原始后端的回复将是什么
内容类型。因此,我仍然没有看到从后端查看
内容类型
回复以有条件地发出第二个请求的用例。我们将使用无头浏览器(as-a-service,BromBone)发出请求并组装内容类型html的响应。我们实际上并没有使用转义片段,因为这很烦人,但谷歌鼓励使用转义片段的事实似乎表明,为任何给定页面创建HTML快照都没有问题。因此,/bla/bar出现了,它可能是一个关于bla-bar的图像或HTML页面。在得到答复之前我们不会知道。一旦我们得到响应,如果是HTML,我们就将请求传递给渲染后端,希望它能预渲染(通过自己的crawing)