Назад | Перейти на главную страницу

CloudFront Dynamic Content и Apache с использованием нескольких виртуальных хостов

Я попытался настроить CloudFront так, чтобы он указывал на Elastic Load Balancer.

Я вижу, что запросы достигают веб-сервера (который настроен как несколько виртуальных хостов), однако запросы всегда заканчиваются на странице /var/www/error/noindex.html.

Если я удалю CloudFront из www DNS, сайты будут нормально работать на apache через ELB.

Также у меня есть CName www для каждой настройки домена.

Есть какие-нибудь мысли о том, почему эти запросы CloudFront попадают на страницу с ошибкой?

Спасибо

эту проблему теперь решает Amazon.

Проверьте эту ссылку: https://forums.aws.amazon.com/message.jspa?messageID=552969#552969

И эта ссылка: http://aws.amazon.com/blogs/aws/enhanced-cloudfront-customization/

Cloudfront в настоящее время не имеет возможности передать заголовок Host обратно в источник. Вместо этого он передает хост, указанный в поле происхождения распространения Cloudfront. Таким образом, при просмотре страницы через ELB будет правильно передано имя хоста, которое вы указываете в браузере, обратно в ваш веб-экземпляр (таким образом, вызывая правильный виртуальный хост), тот же запрос, сделанный через Cloudfront через ELB и на ваш веб-экземпляр, прибудет. в веб-экземпляре с именем хоста ELB. Знаю, расстраивает.

Они знают об этом (на момент написания); надеюсь, это скоро исправят:

https://forums.aws.amazon.com/thread.jspa?threadID=84588

Проблема может быть решена путем добавления одного шага в процесс запроса. Cloudfront пересылает «Исходное доменное имя» в качестве переменной заголовка «Хост» в запросе. Это информация, используемая вашим веб-сервером, чтобы решить, какой виртуальный хост использовать при обслуживании контента.

Предположим, вы хотите отправить своего посетителя на subdomain1.domain.com и subdomain2.domain.com, и оба они являются виртуальными хостами на одном и том же веб-сервере.

Сначала создайте записи CNAME в ваших облачных дистрибутивах. Используйте одно распределение для каждого поддомена следующим образом:

subdomain1.domain.com. 300 IN CNAME d1234567890.cloudfront.net.
subdomain2.domain.com. 300 IN CNAME d0987654321.cloudfront.net.

Вместо того, чтобы указывать ваши дистрибутивы Cloudfront непосредственно на балансировщик нагрузки, используйте промежуточный адрес в «Доменном имени источника». Итак, ваши настройки для дистрибутивов Cloudfront будут выглядеть примерно так:

d1234567890.cloudfront.net
Alternate Domain Names(CNAMEs): subdomain1.domain.com
Origin Domain Name:  subdomain1-intermediary.domain.com

d0987654321.cloudfront.net
Alternate Domain Names(CNAMEs): subdomain2.domain.com
Origin Domain Name:  subdomain2-intermediary.domain.com

Теперь создайте дополнительные записи CNAME, которые направляют промежуточные адреса на ваш балансировщик нагрузки:

subdomain1-intermediary.domain.com. 300 IN CNAME LOADBALANCER.eu-west-1.elb.amazonaws.com.
subdomain2-intermediary.domain.com. 300 IN CNAME LOADBALANCER.eu-west-1.elb.amazonaws.com.

Когда запрос проходит через балансировщик нагрузки и поступает на ваш сервер, он увидит либо subdomain1-intermediary.domain.com, либо subdomain2-intermediary.domain.com в заголовке «Host» запроса. Все, что вам нужно сделать, это определить свои виртуальные хосты. В IIS правила будут выглядеть так:

<rule name="rule1">
  <match url="(.*)" />
  <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
    <add input="{HTTP_HOST}" pattern="subdomain1-intermediary.domain.com" />
  </conditions>
  <serverVariables>
    <set name="HTTP_HOST" value="subdomain1.domain.com" />
  </serverVariables>
  <action type="None" />
</rule>
<rule name="rule2">
  <match url="(.*)" />
  <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
    <add input="{HTTP_HOST}" pattern="subdomain2-intermediary.domain.com" />
  </conditions>
  <serverVariables>
    <set name="HTTP_HOST" value="subdomain2.domain.com" />
  </serverVariables>
  <action type="None" />
</rule>