さくらとXrea、CGI設置でサーバエラー suexec policy violation と End of script output before headers が出た件
ひさびさにまとも?な記事です。久々にまとも?なことをやった証拠でもありますが。
久々に掲示板を設置
わけあって、さくらインターネットのサーバに、掲示板フリーソフト
ASKA BBS : KENT-WEB CGI/Perl フリーソフト
を設置することに。
デザインは今どきの人好みじゃないと思うのですが、
・スマホ対応
・広告が出ない(少なくともびみょーな広告が出ない)
という条件で探したら、こちらに落ち着きました。
CGIエラーではまる
ところが、さくらインターネットにCGIを設置してみると、ブラウザでは Hello! とだけ表示され、サーバではこんなエラーが出ていました。
suexec policy violation: see suexec log for more details: /home/../../index.cgi
End of script output before headers: index.cgi
以前 Xrea に設置したときは、特に悩まずすんなり設置できたはずなのに、なんでだろう?と悩みました。
サーバエラーが返ってくるのは、ググるとほぼ同じ原因で、たいていパーミッションの設定ミス。でも、そもそも、さくらインターネットで提供されている「クイックインストール」の中にも KENT-WEB の掲示板があり、それと同じパーミッションにしても、状況は変わらず。
試しに Xrea にも同じことをしても、やっぱり同じ現象になりました。はて、どうしたものか…。と思いつつ、
改行コードの違いが原因?
もう一声、ググったところで、以下の記事を見つけました。
MacでCyberduckを使っている人必見・アップロードしたCGIが動かない時に確認する方法 | くま同盟コンピュータLab
Cyberduckではアスキーモード・バイナリモードの転送の設定ができないため、CGIやPHPのプログラムを転送する時は予め、サーバーの環境(通常のWebサーバーはUnix系のLF)に合わせて改行コードを変更してから転送すること。
これで解決しました! 私は CotEditor を使っているので、改行コードは簡単に変換できました。2015年の記事ですが、この方にはとても感謝!です。
後から見直してみると、昔 設定した掲示板のバックアップから転送したものはエラーが出なかったのは、改行コードがなぜか「LF」になっていたからのようです。当時の転送ソフトが何だったかは思い出せませんが(Fetchの時代だったか?)以前はアスキーかバイナリーかを拡張子で選別して転送する設定がありましたよね? うん、絶対あった。
それにしても
Mac上でCRで改行されたCGIプログラムもアスキーモードでLinuxへ転送すると自動的に改行コードをLFに変換され、Linux上でも問題なくCGIが動くというわけです。
は知りませんでした。そんなマジックがあったんですね。改行コードがLinux系の LF じゃないと、デフォルトではバイナリーとみなされ転送された結果、改行のないダラダラテキストとなり、CGIとして(今回は Perl)エラーになってしまうのか、と思っておりました。全然わかってなかったようです。
さて、Cyberduck でファイルを上書き転送すると、パーミッションは転送元のものに戻ってしまうので(この設定はどこかにあるのかもしれない)そこはご注意。
今時の人は、Mac の FTP ソフトは何を使っているんでしょうか。
今回もお読みいただき、ありがとうございました。