Laravel handles all request/response logic itself - so having this code also try to do the same caused conflicts e.g. the Content-Type being ignored - and sometimes the file content wouldn't come through, which seemed to be a problem with the ETags. With this, I have my own HeaderSetter pass the header values and status codes to Laravel's response class and all is well.