我有一个AWS Amplify实例来启动我拥有的REACT应用程序。它还具有SSL证书,因此我可以通过输入以下内容在浏览器上访问该应用: https://myreactapp.com(不是我的真实应用网址,仅是示例)
我有一个在没有SSL证书的Elastic Beanstalk实例上运行的Web servlet,并且我的REACT应用程序通过以下代码段与之交互:
var myObject = {
data1: this.state.data1,
data2: this.state.data2
}
$.ajax({
type: "POST",
url: 'http://<my-backend-webservices-app>.us-east-1.elasticbeanstalk.com/doSomething', // works only from React app when running on local machine (http://localhost:3000), not from https url
contentType: 'application/x-www-form-urlencoded; charset=utf-8',
data: myObject,
success: function(response) {
console.log('success -- ' + response);
},
function(errMsg) {
alert('Major Error');
}
});
此代码运行良好,当我在计算机上本地运行React App时,我从 my-backend-webservices-app 获得了响应。因为当我在本地使用它时,react应用程序位于http://localhost:3000上(注意它不是https),并且它与也在http上的Elastic Beanstalk实例通信。
但是,当我从带有SSL证书的AWS Amplify运行我的React应用程序时,它抱怨来自HTTPS的RESTFul请求无法与http url通信。这是来自浏览器的错误:
jquery.js:8676混合内容:位于的页面 'https://master。<.....>。amplify <...>。com /已通过HTTPS加载, 但请求了不安全的XMLHttpRequest端点 'http://.us-east-1.elasticbeanstalk.com/doSomething'。 该请求已被阻止;内容必须通过HTTPS提供。
所以我想解决的问题是向我的ElasticBeanStalk实例添加一个SSL证书。因此,首先我创建了一个子域 services.myreactapp.com ,其中主域是 myreactapp.com ,然后我分配了我的ElasticBeanstalk实例(其中my-backend-webservices-app是)到该 services.myreactapp.com 子域。
然后,我进入了AWS的证书管理器服务页面,并请求将公共证书分配给services.myreactapp.com子域。
所以现在我将上面代码片段的URL更新为使用https而不是http:
url: 'https://<my-backend-webservices-app>.us-east-1.elasticbeanstalk.com/doSomething',
但是现在,只要我的来自https的React应用向后端servlet发出请求,它就会挂起。
有什么想法我想念的吗?
答案 0 :(得分:0)
转到AWS路线53,在DNS管理中创建指向您的beantalk URL的CNAM DNS记录,例如-
services.myreactapp.com -> xyz.us-east-1.elasticbeanstalk.com
然后在您的React应用中使用services.myreactapp.com
作为URL。同样,在执行此操作之前,请确保您能够访问https://services.myreactapp.com
的后端,然后可以检查运行状况API(如果有)进行测试。注意-这可能需要一些时间才能使services.myreactapp.com生效。
答案 1 :(得分:0)
这里没有什么要强调的。
仅当使用负载平衡器时,才可以将从ACM获得的证书应用于Elasticbeanstalk。在这种情况下,您只需在Elasticbeanstalk配置页面中选择证书即可。
参考: 为Elasticbeanstalk负载平衡器配置ssl-https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/configuring-https-elb.html
您必须将证书应用于在Elasticbeanstalk或其代理(例如nginx)中运行的应用程序。您可以使用.ebextensions
来实现。
参考:
https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/https-singleinstance-nodejs.html
subdomain.example.com
指向Elasticbeanstalk的DNS名称A
记录以将services.myreactapp.com
指向您的Elasticbeanstalk dns名称。确保在创建Yes
记录时选择别名A
。最后,您可以在前端应用程序中使用subdomain.mydomain.com
而不是elasticbeanstalk dns名称。
希望这会有所帮助,祝你好运。