header()で出力できます。
void header( string $string // ヘッダ文字列 [, bool $replace = TRUE // FALSEとすると、同じ形式のヘッダを追加できる [, int $http_response_code // HTTPレスポンスコード ]] )PHP: header - Manual
これはすべての出力より先に行う必要があります。さもなくば、Warning: Cannot modify header information - headers already sent by (output started at C:\localhost\index.php:1)のようになり、正しく動作しません。
ファイルのエンコーディングがUTF-8のときには、BOMがあってはなりません。さもなくばヘッダより先にBOMが出力されることになり、予期せぬ結果を生じます。
第2引数の$replaceでは、同じ形式のヘッダが存在した場合に置換するかどうかを指示します。たとえば次のようにヘッダを出力した場合、
header( 'Foo:100' ); header( 'Foo:200' ); header( 'Bar:300' );
次のように、同じ形式のヘッダは後のものによって置換されてしまいます。
Foo: 200 Bar: 300
このとき第2引数にFALSEを指定すると、先のものに追加されるようになります。
header( 'Foo:100' ); header( 'Foo:200', FALSE ); header( 'Bar:300' );
Foo: 100, 200 Bar: 300
第3引数の$http_response_codeでは、HTTPのステータスコードを指定できます。たとえば、
header( 'Foo:100', FALSE, 400 );
とすると、HTTPのレスポンスは「400 Bad Request」となります。一方で
header( 'HTTP/1.1 404 Not Found', FALSE, 400 );
のようにヘッダ文字列でレスポンスを指定した場合には、このレスポンスのコードは無視されます。
ヘッダ文字列をHTTP/から始めることで、任意のHTTPレスポンスを返せます。
header( 'HTTP/1.1 404 Not Found' );
コンテンツタイプをtext/plainとすると、HTMLなどのタグはエスケープしなくともテキストとして表示されるようになります。これはデバッグに便利です。
header( 'Content-Type: text/plain' );