LoginSignup
0

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-03-26

ハマった。

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

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0