Help us understand the problem. What is going on with this article?

XSERVERでCGI/APIを走らせて500エラーが出たときに確認すること

More than 1 year has passed since last update.

ハマった。

(省略) End of script output before headers: test.cgi

コードをどうあがいてもうまく動かない。実行権限は与えているはず!

権限設定

結局権限かよ!て話ですが、こちらにこんな記述があるんです。

また、エックスサーバーではセキュリティ上、ユーザー/グループに実行権限のあるパーミッション(777など)ではプログラムは実行できません。
CGI/PHPファイルのパーミッションが 777 の場合や、パーミッションが 777 のフォルダ上にプログラムを設置している場合、エラーが発生しますのでご注意ください。

これだけ見て、「実行権限与えちゃダメなのかー」と削ってたのですが、別のページには

.cgi / .pl などの CGI 実行ファイル: 755, 705のいずれか

とありまして。

755はグループとOtherに実行権限与えてるし、705もOtherに実行権限を与えている。
つまり、与えてはいけないのは実行権限ではなく書込権限だったのだ…

というわけで、とりあえず書込権限を剥奪したら動きました。解決。

ついでに、それ以外の確認事項。CGIやAPIの基礎的なところ。

実行環境

test.cgi
#!/usr/bin/ruby

そのCGIを実行するための言語があるパス。サーバーによって微妙に異なることがあるので、公式サイトを見て確認するかSSHでサーバーにアクセスして

which ruby

とかやって見つけたパスを#!のあとに書きましょう。

Content-Type

先程のエラーで言うところのheadersに当たる内容です。
このCGIが何を返すのかを指定します。
rubyとかで.cgiファイルを実行した際に、返す内容の前にこれらが含まれている必要があります。
直接HTMLを表示させる場合もあれば、JSONで返してVueとかに受け渡すこともあります。

決まった文字列を入れます。この辺が参考になります。

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を作ってたときにわからなかった内容をざっとまとめてみました。
誰かの参考になれば幸いです。

あと、ぶっちゃけサーバーサイドはあまり良く分かっていないので、もし間違い等ありましたらご指摘をお願いします。
では。

sKawashima
perl→C→TTSneo→Java→Ruby→JS→TSと流れ着きました。 最近kaggleに挑戦中。 デザイナーです。
https://skawashima.com/blog
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした