ハマった。
(省略) End of script output before headers: test.cgi
コードをどうあがいてもうまく動かない。実行権限は与えているはず!
権限設定
結局権限かよ!て話ですが、こちらにこんな記述があるんです。
また、エックスサーバーではセキュリティ上、ユーザー/グループに実行権限のあるパーミッション(777など)ではプログラムは実行できません。
CGI/PHPファイルのパーミッションが 777 の場合や、パーミッションが 777 のフォルダ上にプログラムを設置している場合、エラーが発生しますのでご注意ください。
これだけ見て、「実行権限与えちゃダメなのかー」と削ってたのですが、別のページには
.cgi / .pl などの CGI 実行ファイル: 755, 705のいずれか
とありまして。
755はグループとOtherに実行権限与えてるし、705もOtherに実行権限を与えている。
つまり、与えてはいけないのは実行権限ではなく書込権限だったのだ…
というわけで、とりあえず書込権限を剥奪したら動きました。解決。
ついでに、それ以外の確認事項。CGIやAPIの基礎的なところ。
実行環境
# !/usr/bin/ruby
そのCGIを実行するための言語があるパス。サーバーによって微妙に異なることがあるので、公式サイトを見て確認するかSSHでサーバーにアクセスして
which ruby
とかやって見つけたパスを#!
のあとに書きましょう。
Content-Type
先程のエラーで言うところのheaders
に当たる内容です。
このCGIが何を返すのかを指定します。
rubyとかで.cgiファイルを実行した際に、返す内容の前にこれらが含まれている必要があります。
直接HTMLを表示させる場合もあれば、JSONで返してVueとかに受け渡すこともあります。
決まった文字列を入れます。この辺が参考になります。
- Content-Typeの一覧 - Qiita https://qiita.com/AkihiroTakamura/items/b93fbe511465f52bffaa
jsonの場合は
Content-Type: application/json
です。
僕の場合はrubyで書いてるので、
puts "Content-Type: application/json\n"
みたいな感じです。
Access-Control設定
これらもheaders
の内容です。GETかPOSTのどちらを使うのか、他ドメインからの実行に対応するのかなどを記述します。
よく使うやつはこんな感じ。
puts "Access-Control-Allow-Methods: GET,POST\n"
puts "Access-Control-Allow-Origin: *\n\n"
headerの直後の空行
先程、上に書いた最後の一行\n\n
は実は地味なハマリポイントです。
headers
と中身の間には、一行の空行を含ませる必要があります。どこに書くかは自由ですが、とにかく一行改行を入れて下さい。
とりあえず以上です。
以前自分がAPIぽいCGIを作ってたときにわからなかった内容をざっとまとめてみました。
誰かの参考になれば幸いです。
あと、ぶっちゃけサーバーサイドはあまり良く分かっていないので、もし間違い等ありましたらご指摘をお願いします。
では。