cgiが動かないときの対処法

  • CGI

cgi を使用しているサイトで今までにあったエラーの種類とその対処法についてまとめています。以下に進む前に、cgi が本当に使えるサーバーなのか?という事は確認しておきましょう。

(1)全てのcgiファイルが動かない

internal server error になる

パーミッションが問題の可能性が高いです。cgi ファイルのパーミッションを755してみましょう。

ソースコードがそのまま表示されている、もしくは forbidden と表示される

cgi がそもそも関連付けられていないかもしれません。「cgi の拡張子は cgi ファイルとして動かしてね」という設定をします。関連付けをするためには、.htaccess に下記を記述し確認します。

.htaccess

Options -Indexes
Options +ExecCGI
AddType application/x-httpd-cgi .cgi .pl .pm
AddHandler cgi-script cgi pl pm

これでも動かない場合は、cgi を置いたディレクトリに実行権限がない可能性があります。レンタルサーバーなら cgi を動かせるディレクトリが限られている(例えば cgi_bin というディレクトリ以下のみ cgi が動作する)ため、マニュアル等を読んで確認してみてください。

(2)cgiのファイルで動くもの、動かないものがある

動いているものが存在しているという事は、cgi そのものは動作する環境にはあるはずなので何らかの設定が間違っている可能性があります。

perlパスを確認する

特定の cgi ファイルだけ動かないのであれば、perl パスが間違っているのかもしれません。cgi ファイルの一行目には「perl パス」が記述してあります。
このパスの perl を使用するので、間違っていると読み込めずにエラーになります。サーバーによって異なるので適当なものを設定します。cgi ファイルを開き確認してみてください(一行目にあることが多いです)。

#!/usr/local/bin/perl

perlパスは正しいのに動かない

perlパスが正しくても動かない時があります。これは、perl パスの後ろに認識できない改行コードが入っているのが原因です。

改行コードについて

改行というのはユーザー側では見えませんが、実はこちらには見えていないだけで行末に下記のコードがくっついていると考えてください。これは OS によってそれぞれ異なります。

  • Windows … CR+LF
  • Mac … CR
  • Linux … LF

HTML でも改行する時は<br>タグを使いますよね?OS によって色んな<br>タグがあるようなものです。

これを踏まえて、例えば Windows でファイルを作った時に改行コードとして CR+LF が行末にくっついてるとします。そのファイルを Linux で開こうとすると、LF は改行コードとして認識できても、CR が余計になります。そのため、もしプログラムを実行するときにこの CR が邪魔になってしまい正しく動作しない事があります。

ファイルをアップロードするときにはASCIIモードでアップすることで改行コードを自動変換してくれるため、恐らくこの問題は起きません。

考えられる原因

  • 転送方式をBinary(バイナリ)モードでファイルをアップロードしている
    Binaryモードでは、改行コードの変換を行なわれません。そのため不要な改行コードが入ることがあります。
  • SFTP で接続している
    SFTP(SSH File Transfer Protocol)には、転送モードがありません。常に Binary モードとして転送されるため改行コードが変換されません。

解決策

perl パスの行末にコメントアウト(––)を追加して、改行コードを含めてコメントとして認識させます。

#!/usr/local/bin/perl -- 

これで例えば改行コードが CR+LF のままでもコメントアウトされるため、正しく読み取ってくれます。