AWS Cloudfront + Load Balancer, url changes from main domain to load balancer subdomain

This behavior likely results from the fact that by default CloudFront sets the Host: HTTP request header to the origin hostname, in this case elb.example.com. The application then presumably generates links based on that hostname.

If, instead, you configure CloudFront to whitelist that header for forwarding to the origin, the Host header sent by the browser (example.com) will be sent on to the application by CloudFront, so the application should behave more like you'd expect and use that value when generating the links. With this, CloudFront still uses the origin domain name to do the DNS lookup needed in order to establish the TCP connection to the origin (the ELB in this case), but stops injecting that hostname into the HTTP request headers.

http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/distribution-web-values-specify.html#DownloadDistValuesForwardHeaders

You'll find the host header under cache behavior settings -> cache based on selected request headers -> whitelist.


In the meantime things have changed a bit (on the AWS side) from the original answer. As it is still correct in it's core. (Adding the host header to the whitelist.) Now you need to configure this as a custom Cloudfront policy. You need to create this policy in the Cloudfront AWS console.

After you created the custom policy, you can configure this newly created policy using the 'behaviours' tab of your distribution. This can be done by changing the 'cache policy' to your newly created policy.