我在我的网站前面配置了CDN。当您通过我的自定义DNS或CDN DNS访问网站时,一切工作正常。我的问题是当我想使用IP而不是DNS时。
当我在我的CDN DNS名称上进行nslookup时,我得到了一个IP列表。如果我从那里抓取一个IP地址并尝试访问网站,我会得到一个403禁止请求。
为什么CDN只接受DNS请求而不接受IP请求?
如果我的CDN前面有一个代理,尝试使用代理IP访问我的网站,如何使用指向CDN的代理IP访问网站?
这是一个有线的要求和耗时,我一直在寻找正确的答案。似乎没有人给出解决方案。
干杯!
发布于 2018-03-23 22:52:22
为什么只接受
请求而不接受IP请求?
CloudFront不是以这种方式设计的。它是一个庞大的、全球分布的系统。当您查找CloudFront分发版的IP地址时,您将收到CloudFront预期接收流量的地址列表:
位于相同地理区域的浏览器
您需要一种方法来确定您希望CloudFront在处理您的请求时使用哪个发行版。
在超文本传输协议模式下,它使用由浏览器发送的Host:超文本传输协议报头。在HTTPS模式下,它使用TLS SNI值和Host:报头。
如果您使用代理来访问CloudFront,则需要代理为HTTPS注入一个HTTP头,并为Host正确设置SNI值。
例如,在HAProxy中,设置主机标头,覆盖任何已经存在的此类标头。
http-request set-header Host dzczcexample.cloudfront.net当然,您也可以使用为您的发行版配置的任何一个备用域名值。
对于SNI:
backend my-cloudfront-backend
server my-cloudfront dzczcexample.cloudfront.net:443 ssl verify none sni str(dzczcexample.cloudfront.net)(来源:https://serverfault.com/a/830327/153161)
但这只是最小的基线工作配置,因为CloudFront具有这种简单设置忽略的功能。
如上所述,CloudFront将返回一个IP地址列表,该列表应用于访问(1)您的站点,(2)从您所在的位置,(3)立即访问。地址列表可以而且会有所不同。CloudFront似乎能够动态管理和分配其工作负载,并通过将流量从一组服务器移动到另一组服务器,从一个边缘位置移动到另一个边缘位置,通过修改DDoS响应...因此,您的代理需要使用返回的多个地址,并且需要刷新其DNS值,以便始终连接到CloudFront希望其连接的位置,以获得最佳行为和性能。
此外,不要忽视这样一个事实,代理服务器将通过代理附近的边缘连接到CloudFront,而不是浏览器附近,因此这不是您在生产中经常使用的东西,尽管它确实有一些有效的用例。(我在CloudFront的两端使用HAProxy已经有几年了,用于某些应用程序--其中一些现在已经被Lambda@Edge取代了,但我离题了)。
这是有线的怪异吗?要求
不怎么有意思。多年来,基于名称的虚拟主机一直是标准实践。在我看来,当您设置web服务器时,它通常也会响应Host报头中的IP地址,这几乎是历史上的一个意外。配置良好的web服务器不会这样做--如果您( web浏览器)不知道您请求的是哪台主机,并且只是向我的IP发送请求,那么我( web服务器)应该告诉您,我不知道您想从我这里得到什么,因为您更有可能是出于恶意原因、或良性但恼人的原因(扫描)或由于错误配置而到达的。你也不希望搜索引擎蜘蛛在IP地址上找到你的内容。不利于上市,不利于搜索引擎优化。
发布于 2018-03-24 00:47:59
这个代理的问题是我不能配置报头。我正在考虑添加另一个代理,在那里我有控制权,然后用我想要的值修改标头。但这并不是一个好的解决方案,就像从一个代理跳到另一个代理一样。
我认为我应该更多地依赖DNS和主机名,而不是IP,这对我来说很好,我更喜欢使用正确的DNS名称。
谢谢你的透彻解释,你澄清了很多事情。
https://stackoverflow.com/questions/49450168
复制相似问题