Apigee Proxy передает тот же заголовок хоста цели
У меня есть простой прокси-сервер apigee, но я вижу в трассировке проблему, когда заголовок Host, идущий к цели, содержит хост самого прокси.
то есть цель получает
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 имеет по этому вопросу, кажется очень расплывчатой.
Это становится супер расстраивающим. У нас есть другие прокси, которые работают нормально, не делая ничего особенного.
2 ответа
Это кажется странным. Apigee не должен делать это по умолчанию. Вы уверены, что другие потоки настроены правильно? Во всяком случае.. вы можете попытаться создать AssignMessage
политика, которая добавляет правильный хост. Взгляните на это: https://docs.apigee.com/api-platform/reference/policies/assign-message-policy
./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>
NB: я не проверял это. Прочитайте смутные документы 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>my.host.name</Value>
<Ref/>
</AssignVariable>
<IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
<AssignTo createNew="false" transport="http" type="request"/>
</AssignMessage>