当使用从无服务器Cloudflare Worker获取到我自己的托管在AWS EC2实例上的dotnetcore api时,我得到了403禁止响应。GET和POST。示例worker代码(也测试了init头,如user agent, accept等,但结果相同):
fetch('http://54.xxx.xxx.xxx/test')
然而,对api ip url的基本获取从本地javascript返回200和一个简单的托管网页。还有邮差和卷发
Cloudflare worker也可以毫无问题地获取其他api。
fetch('http://jsonplaceholder.typicode.com/posts')
最后我不得不使用AWS DNS url。
fetch('http://ec2-54-xxx-xxx-xxx.us-west-1.compute.amazonaws.com/test')
这个AWS elasticbeanstalk设置是尽可能基本的。单一t3a。具有默认安全组的Nano实例。我没有看到任何关于IP和DNS url使用的文档,但它们应该解析到相同的IP。此外,我没有看到任何选项来处理cloudflare方面的DNS问题。
stackoverflow也没有类似的问题。
所以在经历了很多痛苦之后,我只是在这里记录解决方案。
在amazon实例摘要下,您可以找到"公共IPv4地址"one_answers"Public IPv4 DNS"
从Cloudflare工作器获取公共dns工作
fetch('http://ec2-54-xxx-xxx-xxx.us-west-1.compute.amazonaws.com/test')
和获取公共ip返回状态403与statusttext "Forbidden">
fetch('http://54.xxx.xxx.xxx/test')
Cloudflare Workers可以发出出站HTTP请求,但只针对域名。Worker不可能向IP地址发出取回请求。
我无法确认你观察到的确切行为(你的帖子是9个月前,从那时起,Cloudflare Workers发生了一些变化),在过去的一个月左右,我观察到在IP地址上调用fetch()
导致工作人员看到"错误1003访问被拒绝";作为获取响应。
没有太多的信息,但是这里有关于错误1003的可用信息:
错误1003 Access Denied: Direct IP Access Not Allowed
常见原因—客户端或浏览器直接访问Cloudflare IP地址
解析-浏览到您的URL中的网站域名,而不是Cloudflare的IP地址。
正如您所发现的,如果您使用DNS名称,则fetch工作正常。