CloudFront caches objects based on all the request headers that it redirected from the browser to the source server, and not just the path.
For a response to be served from the cache, it must be returned in response to a previous request, which included the same request headers.
This is due to the fact that, at least in principle, different headers can initiate different server behavior, and a full-fledged cache has no right to assume otherwise.
To increase the cacheability of objects without jeopardizing its ability to serve the correct answers (that is, the identical response that the source server would return for this request), CloudFront blocks almost the request headers before sending the request to the beginning, and uses a split version of the request when performing a search in cache.
When the source server is a "Custom" source (i.e. not S3), you can choose which headers to forward to the source server.
But when the source server is S3, you still have a choice, but there are only three that can be redirected by choice ... and they are all CORS related.
[With the start of S3], you can configure CloudFront to forward and cache your objects based on only three headers: Access-Control-Request-Headers , Access-Control-Request-Method and Origin . Forwarding these headers allows CloudFront to distribute content to websites that are allowed to share resources across multiple resources (CORS). You cannot configure CloudFront to forward custom headers to Amazon S3.
http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/header-caching.html#header-caching-web
If the Origin: header is at least not redirected, then S3 will not be able to respond to it. Enabling forwarding of this header means that not only S3 will see it and will potentially change its response due to the CORS configuration in the bucket, but also that each Origin: option Origin: - for the same object - will lead to another (and correct) the response is returned by S3 and cached for future CloudFront compliance requests.
Custom headers cannot be redirected to S3 CloudFront because it is impractical - since S3 stores static content, the responses will not be different from other headers, so forwarding them will be pointless and reduce the speed of getting into the cache, and many (presumably) different answers are cached, but only served in response to requests that are accompanied by identical headers.