Apigee 代理将相同的主机标头传递给目标

问题描述 投票:0回答:2

我有一个简单的 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 apigee-baas
2个回答
1
投票

这看起来很奇怪。默认情况下,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 文档


0
投票

对于 Apigee X,AssignMessage -> Set 选项不起作用。但是另外两个选项在 Target endpoints -> PreFlow:

中有效
  1. Javascript:

    context.setVariable('target.header.host',"my.host.name")

  2. 分配消息策略:

<?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/>
© www.soinside.com 2019 - 2024. All rights reserved.