For a website that uses GitHub Pages and CloudFront, users can end up at your
original GH Pages hostname when it sends a 301 redirection.
GH Pages redirects clients at some circumstances like accessing a directory
without a trailing /, etc. This is a problem especially if you are using CF
to route requests based on paths, or need TLS and using a custom domain.
CloudFront allows Lambda functions to process requests and responses of both
viewers and origins. It currently only supports nodejs6.10 runtime property
and has a few restrictions but it allows me to address this specific problem.
Create a function from scratch (or modify the
cloudfront-modify-response-header blueprint). The execution role of the
function can be created from the Basic Edge Lambda permissions template.
After editing and testing the function, add a trigger, select your CF
distribution and Origin Request event.
The following script replaces http://gh-pages.example.com with
https://www.example.com in the Location response header.
'use strict';
exports.handler = (event, context, callback) => {
const response = event.Records[0].cf.response;
const headers = response.headers;
// Find Location header (all in lowercase)
const headerLocation = headers['location'];
if (headerLocation) {
var url = headerLocation[0]['value'];
// Update protocol and hostname
url = url.replace(/http:\/\/gh-pages\.example\.com/i,
'https://www.example.com');
headerLocation[0]['value'] = url;
}
callback(null, response);
};