ここからは、CGIについて扱っていく。
HTTPヘッダの"Content-Type"を付けるには、CGIプログラムにもそれを書かないといけない。
(大文字小文字を区別しないので、"Content-Type"でも"Content-type"でもいいけど、"Content-type"と書く人が多いなあ・・・。)
/* ヘッダファイルのインクルード */ #include <stdio.h> /* 標準入出力 */ /* main関数の定義 */ int main(void){ /* CGIとして文字列の出力. */ printf("ABCDE"); /* printfで"ABCDE"(改行無し)の出力. */ /* プログラムの終了 */ return 0; /* 0を返して正常終了. */ }
"ABCDE"という文字列をCGIのページに出したい場合には、標準出力に出力するだけ。
$ vi content_type.c $ gcc content_type.c -o content_type.cgi
$ sudo cp content_type.cgi /var/www/cgi-bin/ $ cd /var/www/cgi-bin/ $ ls -al content_type.cgi -rwxr-xr-x 1 root root 8520 xxx xx xx:xx content_type.cgi $
/var/www/cgi-binに置いて、実行権限があればいい。
あらら、Internal Server Error。
こういう時のエラーの原因を特定するのがCGIはめんどい・・・。
エラーログを見ると、
[xxx xxx xx xx:xx:xx.638888 2021] [cgi:error] [pid 21033] [client xxx.xxx.xx.xx:61571] End of script output before headers: content_type.cgi
ヘッダの前にスクリプト出力が終わったよと・・・。
ちょっとなにいってんのかわからない・・・。
本来HTTPとしては、ヘッダ行を出力して、1行空けて、ボディ行("ABCDE"の事)を書いていくのだけど、何のヘッダも出力してないということはあり得ないと思うので、
/* ヘッダファイルのインクルード */ #include <stdio.h> /* 標準入出力 */ /* main関数の定義 */ int main(void){ /* CGIとして文字列の出力. */ printf("\n"); /* printfで改行を出力. */ printf("ABCDE"); /* printfで"ABCDE"(改行無し)の出力. */ /* プログラムの終了 */ return 0; /* 0を返して正常終了. */ }
改行を前に置いただけにしてみた。
そしたらうまくいっちゃった。
とはいえ、
Content-typeは付いてない。
たぶんtext/plainとして判断されてる。
"Content-type: text/plain"をちゃんと指定。
今度はちゃんとついてる。
Sample/cgi/Content-type/Content-type/src/Content-type at master · bg1bgst333/Sample · GitHub