Ясно - PHP
http://php.net/manual/ru/function.header.phpvoid header(string $string [, bool $replace = true [, int $http_response_code ]])
Заголовок перезаписывается, если второй параметр не false.
Замечание:
Строка заголовка задающая состояние HTTP всегда будет отсылаться клиенту первой, вне зависимости от того был соответствующий вызов функции header() первым или нет. Это состояние можно перезаписать, вызывая header() с новой строкой состояния в любое время, когда можно отправлять HTTP заголовки.
Ну и вывода тела ответа не должно быть, т.к. при этом будет отослан ранее сформированный заголовок. Для предотвращения используй буферизацию (см. ob_start).
И еще прикольчик из доки:
Замечание:
ID сессии не будет передаваться вместе с заголовком Location, даже если включена настройка session.use_trans_sid. Его нужно передавать вручную, используя константу SID.