我有一个简单的 apigee 代理,但我可以在跟踪中看到一个问题,即去往目标的主机标头包含代理本身的主机。
即目标得到
Host: xx.apigeename.com
而不是:
Host: my.awsservername.com
目标与代理位于不同的域,因此这意味着目标服务器未正确处理请求(在本例中为 404)。
为什么 Apigee 可能会发送完全相同的主机标头而不对其进行转换?
我试图通过设置 TargetEndpoint 来明确设置它:
<TargetEndpoint name="xyzzy">
<Description/>
<FaultRules/>
<PreFlow name="PreFlow">
<Request>
<Headers>
<Header name="Host">{target.host}</Header>
</Headers>
</Request>
<Response>
</Response>
</PreFlow>
<PostFlow name="PostFlow">
<Request/>
<Response/>
</PostFlow>
<Flows/>
<HTTPTargetConnection>
<Properties/>
<URL>https://{targetBackend}/xyzzy</URL>
<SSLInfo>
<Enabled>true</Enabled>
<Protocols>
<Protocol>TLSv1.2</Protocol>
</Protocols>
</SSLInfo>
</HTTPTargetConnection>
</TargetEndpoint>
Apigee 对此的文档似乎非常模糊。
越来越令人沮丧。我们还有其他代理,无需执行任何特殊操作即可正常工作。
这看起来很奇怪。默认情况下,Apigee 不应这样做。您确定其他流程设置正确吗?无论如何..您可以尝试创建一个
AssignMessage
策略来添加正确的主机。
看看这个:https://docs.apigee.com/api-platform/reference/policies/assign-message-policy#Samples
./policies/hostPolicy.xml:
<AssignMessage name="hostPolicy" continueOnError="false">
<AssignTo createNew="false" type="request"></AssignTo>
<Set>
<Headers>
<Header name="Host">{target.host}</Header>
</Headers>
</Set>
</AssignMessage>
./targets/xyzzy.xml
<PreFlow name="PreFlow">
<Request>
<Step>
<Name>hostPolicy</Name>
</Step>
</Request>
</PreFlow>
注意:我还没有测试过这个。阅读有关政策的模糊 apigee 文档
对于 Apigee X,AssignMessage -> Set 选项不起作用。但是另外两个选项在 Target endpoints -> PreFlow:
中有效Javascript:
context.setVariable('target.header.host',"my.host.name")
分配消息策略:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AssignMessage continueOnError="false" enabled="true" name="AM-targethost">
<DisplayName>AM-targethost</DisplayName>
<Properties/>
<AssignVariable>
<Name>target.header.host</Name>
<Value>ERROR: request.header.host variable does not exist</Value>
<Ref>request.header.host</Ref>
</AssignVariable>
<IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
<AssignTo createNew="false" transport="http" type="request"/>
</AssignMessage>
这确保了 Apigee X 发送到后端的 http(s) 请求与传入请求具有相同的主机标头。 在
request.header.host
标签中使用变量 <Ref>
很重要,而不是在 <Value>
标签中,因为 Apigee 不会解析 <Value>
标签中的变量。如果 <Ref>
标签有内容,则使用 <Value>
标签的内容,以防 <Ref>
标签内容无法解析。
静态设置主机头也是可以的;然后“ref”标签保持为空:
<Name>target.header.host</Name>
<Value>demo.example.org</Value>
<Ref/>