我接到一项任务,我不确定如何处理。我要求做的是向CloudFront添加自定义标头,并使Apache使用此自定义标头为网站提供服务。当未设置标头时,我还需要回退到正常使用。
我的主网站: www.domain.com 是在CloudFront上设置的,原点设置为 prod.domain.com 。该网站在服务器上设置为 www.domain.com (这不能更改)
我想要做的是在CloudFront中设置一个自定义标头,它将定义网站名称,并在我的虚拟主机中使用此标头来加载正确的网站。
为了举例,我添加了标题: company-host-name ,并将值设置为 www.domain.com 。 CloudFront来源为 prod.domain.com ,并已更新DNS以指向此新域的服务器IP。到目前为止一直很好,但现在尝试从服务器加载 prod.domain.com 。
我想要做的是使用自定义标头来加载网站,而不是Apache处理它的默认方式。如果没有设置标题,我仍然需要后备。我认为只需将此标头设置为HOST标头就足够了。
我的服务器规格:
# cat /etc/centos-release
CentOS release 6.8 (Final)
# httpd -v
Server version: Apache/2.2.15 (Unix)
Server built: May 11 2016 19:28:33
我还需要知道如何在Apache 2.4中执行此操作,但现在2.2必不可少。
我尝试过使用标题并将其添加到我的http.conf
<IfModule mod_headers.c>
<IfDefine company_host_name>
Header set Host "%{company_host_name}e"
</IfDefine>
</ifModule>
我希望用自定义标头值覆盖Host标头。我认为这应该足够了,但我似乎无法让它发挥作用。
也许我过于复杂,需要退后一步。所以我在这里寻求帮助,我认为这不会太困难。
感谢您提供的任何帮助。
虚拟主机
<VirtualHost *:80>
ServerName www.domain.com
ServerAlias prod.domain.com
RequestHeader set Host "www.domain.com"
DocumentRoot /var/www/vhosts/domain.com/public_html
<Directory /var/www/vhosts/domain.com/public_html>
Options -Indexes +FollowSymLinks -MultiViews
AllowOverride All
</Directory>
ErrorLog /var/www/vhosts/domain.com/logs/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog /var/www/vhosts/domain.com/logs/access.log combined
<IfModule mod_php5.c>
php_value error_log /var/www/vhosts/domain.com/logs/php_error.log
php_value newrelic.appname "domain.com - PHP"
</IfModule>
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "*"
</IfModule>
#INCLUDES
</VirtualHost>
答案 0 :(得分:1)
从您的问题描述中我了解到您希望原始服务器prod.domain.com
能够为www.domain.com.
提供内容。
Apache通过比较每个VirtualHost块中的ServerName / ServerAlias值与&#34; Host&#34;来选择正确的DocumentRoot来传递内容。请求客户端在请求中发送的标头。 CloudFront将始终充当源服务器的最终用户,并始终将prod.domain.com
作为主机头发送到源服务器。
主机:CloudFront将值设置为原始域名 与请求的对象相关联。
因此,原始服务器上应该有{1}个VirtualHost块可以处理来自Cloudfront的请求。
但是,正如您所说,网站只能以prod.domain.com
运行,这两个域都应该由同一个VirtualHost块提供服务。在这里,我假设应用程序使用&#34; Host&#34;标题值&#34; www.domain.com&#34;生成内容。
因此,在现有的www.domain.com
VirtualHost中,添加ServerAlias和RequestHeader set指令,如下所示:
www.domain.com
现在,由于ServerAlias是prod.domain.com,因此Cloudfront的请求将从此DocumentRoot提供。 此外,由于主机请求标头将始终覆盖到www.domain.com,因此您的应用程序应该能够生成内容。
您不必使用Cloudfront添加自定义标头,但是您在问题中提出的问题,可以按照以下步骤进行:
在AWS控制台中,选择CloudFront,然后选择&#34; Web Distribution&#34;有问题。从顶部的选项卡中,选择&#34;分发设置&#34;。
下一步选择&#34; Origins&#34;选项卡并单击&#34;编辑&#34;。
在原始自定义标题,标题名称和值<VirtualHost *:80>
ServerName www.domain.com
ServerAlias prod.domain.com
RequestHeader set Host "www.domain.com"
DocumentRoot /path/to/webserver
..
</VirtualHost>
字段中添加自定义标题company-host-name
在&#34;标题值&#34;领域。每次请求都会将其发送到原点。