AWS CloudFuntion URL 変更

AWS CloudFront Functions を使用して、ブラウザリクエストの URL を書き換えてオリジンに送信するには、HTTP リクエストを別の URL にリダイレクトする関数を作成する必要があります。 AWS ドキュメントには、CloudFront Functions を使用して HTTP リクエストを別の URL にリダイレクトする方法が記載されています ¹。

また、Classmethod 社の記事には、CloudFront Functions でオリジンに手を加えずに URL リダイレクトを行う方法が記載されています ³。

ご参考までに、以下は CloudFront Functions で HTTP リクエストを別の URL にリダイレクトする例です ²。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function handler(event) {
  var request = event.request;
  var headers = request.headers;
  var uri = request.uri;
  var host = headers.host.value;
  var newurl = null;

  // Check the URI is '/abc/sign-up'.
  if (uri === "/abc/sign-up") {
    newurl = `https://${host}/sign-up`;
  }

  if (newurl !== null) {
    return {
      statusCode: 301,
      statusDescription: "Moved Permanently",
      headers: {
        location: { value: newurl },
      },
    };
  }

  return request;
}

この例では、URI が/abc/sign-upに一致した場合に、https://${host}/sign-upへリダイレクトしています。この例を参考に、ご自身の環境に合わせた関数を作成してください。

¹: AWS 公式ドキュメント ²: AWS 公式ドキュメント ³: Classmethod 社の記事

ソース: Bing との会話 2023/6/26

index.html を追加してファイル名を含まない URL をリクエストする

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
function handler(event) {
  var request = event.request;
  var uri = request.uri;

  // Check whether the URI is missing a file name.
  if (uri.endsWith("/")) {
    request.uri += "index.html";
  }
  // Check whether the URI is missing a file extension.
  else if (!uri.includes(".")) {
    request.uri += "/index.html";
  }

  return request;
}

atob は使えない / Buffer も使えない

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
var jwtDecode = function (jwt) {
  function atob(str) {
    return new Buffer(str, "base64").toString("binary");
  }
  function b64DecodeUnicode(str) {
    return decodeURIComponent(
      atob(str).replace(/(.)/g, function (m, p) {
        var code = p.charCodeAt(0).toString(16).toUpperCase();
        if (code.length < 2) {
          code = "0" + code;
        }
        return "%" + code;
      })
    );
  }

  function decode(str) {
    var output = str.replace(/-/g, "+").replace(/_/g, "/");
    switch (output.length % 4) {
      case 0:
        break;
      case 2:
        output += "==";
        break;
      case 3:
        output += "=";
        break;
      default:
        throw "Illegal base64url string!";
    }

    try {
      return b64DecodeUnicode(output);
    } catch (err) {
      return atob(output);
    }
  }

  var jwtArray = jwt.split(".");

  return {
    header: decode(jwtArray[0]),
    payload: decode(jwtArray[1]),
    signature: decode(jwtArray[2]),
  };
};