如何将s3的json文件返回到特定的网址,但仅返回该网址

时间:2019-05-11 06:36:05

标签: reactjs amazon-web-services amazon-s3 react-router amazon-cloudfront

我有一个在其他地方设置的特殊URL,无法更改。

mydomain.com/discountCards

每当服务器向mydomain.com/discountCards发送提取调用时,我都需要从s3存储桶中返回一个JSON

问题是:

我在mydomain.com上使用带有React-Router的react应用程序。因此,转到mydomain.com/discountCards会显示一个白色的反应页面(因为该网址中没有任何内容)

我正在尝试将Cloudfront设置为直接链接到有效的s3 JSON文件-但问题是:

它仅适用于mydomain.com/discountCards.json,不适用于mydomain.com/discountCards

所以。...现在我的s3存储桶中有一个名为DiscountCards.json的文件-但我需要将其作为没有“ .json”的DiscountCard。

还是其他?

如何使用AWS s3,cloudfront和Route 53从s3作为特定域从此s3返回此.json?

就像我说的那样,我使用指向我的s3文件的cloudfront进行了所有设置,但是这要求我在URL中包含文件扩展名(我不能这样做,该URL已经在mydomain.com/ DiscountCards不是discountCards.json)

这是为了使其他网站和应用程序可以获取该URL并返回json。还有其他方法可以实现吗?

2 个答案:

答案 0 :(得分:1)

我创建了一个lambda函数,该函数与CloudFront结合使用将帮助您实现所需的内容而无需任何重定向。

创建一个S3存储桶,我将其设置为带有两个文件index.htmldiscountCards.json的静态主机。 Static site Settings

在CloudFront中:-

Cloudfront settings创建一个以S3存储桶静态网站为源的CF。不要使用下拉菜单中的S3存储桶。您使用了不正确的来源,即JSON文件。只能将存储桶用作源,将文件夹用作源路径。

接下来,使用以下代码创建一个lambda函数: Lambda Creation

exports.handler = async (event, context, callback) => {
    const request = event.Records[0].cf.request;
    const headers = request.headers;
    const origin = request.origin;
    const response = event.Records[0].cf.response;

    console.log("The initial origin is " + JSON.stringify(origin)); //Shows the original origin 
    console.log("The Initial request is " + JSON.stringify(request)); //Shows the original origin request  
    const originDomain = origin.custom.domainName;

    // Checks the request uri for the `/discountCards` and replaces it with `/discountCards.json 
    if (request.uri == "/discountCards") {
        request.uri = "/discountCards.json";
    }

    console.log("The final origin is " + JSON.stringify(origin)); //Shows the final origin
    console.log("The final request is " + JSON.stringify(request)); //Shows the final request
    callback(null, request); };

lambda函数将把request.uri修改为您要提供的文件,并且由于它是由CloudFront提供的,因此浏览器中的URL将保持不变。

保存lambda函数并使用版本号/标记发布它。

转到CloudFront分配>行为(选择默认行为)>编辑。转到页面底部以进行lambda函数关联,选择“ Origin request”,然后粘贴lambda函数ARN(可从lambda函数页面的右上角获取),然后保存并使缓存无效。 It should Look like this. at the end

The bucket site index.html!

The bucket with contents of discountCards.json

具有Route53 + Cloudfront + Lambda的实际站点

End Result 瞧!该页面将在所需路径上提供JSON文件!!没有任何重定向。请记住使缓存无效

答案 1 :(得分:1)

  

所以....现在我的s3存储桶中有一个名为discountCards.json的文件-   但我需要将其作为没有“ .json”的DiscountCard

将文件discountCard.json保存为没有.json扩展名的discountCard。见下图

enter image description here

然后在元数据下的属性上将content-type添加到application/json,请参见下图

enter image description here

现在可以通过此网址https://s3.amazonaws.com/stackkkover/discountCards

访问存储桶

此答案的灵感来自此帖子https://stackoverflow.com/a/27046083/3521330

我希望这个答案会有所帮助。谢谢。