- よく頂く質問(FAQ) -
- サーバエラー (500 Server Error) が出ます。
- Forbidden というエラーメッセージが出ます。
- 絶対パス(フルパス)と相対パスの違いは?
- 文字化けが生じてしまいます。
- 掲示板を複数設置したい。
- ログが突然消えてしまいました。
- CGIがダウンロード状態となります。
- プログラムの文法チェックを行いたい。
- 掲示板等での投稿時間がずれます。
- 掲示板又はチャットで画像アイコンが出ません。
- いつのまにかcoreという名前のファイルができました。
- UTF-8コードのプログラムでメールの一部が文字化けします。
- 日本語以外(中文、ハングル文字等)の2バイト文字を使いたい。
- 掲示板が荒らされます。
- suExec環境、CGIWrap環境とは何ですか?
サーバエラーが出ます
- これは汎用的なエラーメッセージでこれだけでは原因を特定できないのが正直なところです。
- しかしながら、一般的には以下の原因が考えられます。心当たりあるものに優先順位を付けてチェックしてみてください。
- プログラム先頭行のPerlのパス (#!/usr/bin/perlなど) の記述が正しくない。
- これはプロバイダによって異なりますので、プロバイダが用意するCGIの設置手順書を確認してみてください。
ただし、大抵は次の2つであることが多いようです。
#!/usr/bin/perl #!/usr/local/bin/perl
- telnetの利用できるプロバイダの方は which perl とコマンドを打ち込めばそのパスが表示されます。
- Perlのパスは必ず先頭行になければなりません。その前に「改行」や「スペース」行があってもだめですのでご注意ください。
- これはプロバイダによって異なりますので、プロバイダが用意するCGIの設置手順書を確認してみてください。
ただし、大抵は次の2つであることが多いようです。
- FTPの転送モードに誤りがある。
- FTPの転送モードには2種類あります。「テキスト (ASCII) モード」と「バイナリー (RAW) モード」です。
- CGIスクリプトやログファイル関連はほとんどのケースで「テキストモード」で転送します。「CGIスクリプト」と呼ばれるものはすべて「テキストモード」での転送ですので、間違いなく「テキストモード」で転送したかをFTPツールソフトの設定をご確認下さい。
- パーミッション(アクセス権)が正しくない
- プログラムのパーミッションが、実行権のある設定値(通常は755)になっていない可能性があります。
- プログラムや設定ファイルの修正時に、誤って文法違反を起こしてしまっている。
- 文法違反は、「Perlチェッカー」で文法チェックを行ってみてください。
- シフトJISで特殊文字を使用している。
- シフトJISの一部には、クォートの末尾にそのまま記述すると、サーバエラーになることがあります。
例: ― ソ 欺 圭 構 蚕 十 貼 表 予 申 兔 喀 杤 噂 饅
print "エスプレッソ"; # 文法エラーとなる print 'エスプレッソ'; # 文法エラーとなる
- 上記の場合、以下のようにエスケープ記号(¥)を直後に付加します。
print "エスプレッソ\"; print 'エスプレッソ\';
- 詳しくは、以下のページを参考にしてください。
- シフトJISの一部には、クォートの末尾にそのまま記述すると、サーバエラーになることがあります。
Forbidden - You don't have Permission denied というエラーメッセージが出ます
- これは大まかには2つの原因が考えられます。
- 設定されたパーミッション(アクセス権)に実行権がない。
- パーミッションを755または705(実行可能なアクセス権)に設定して下さい。
- パーミッションの設定方法は、大抵はFTPソフトで行いますので、お使いのソフトウェアの操作方法に従って慎重に行って下さい。
(参考:アクセス権について)
- CGIファイルが、プロバイダ側の指定するディレクトリ(又はCGI専用サーバ)に置かれていない。
- プロバイダの指定する所定のディレクトリ(cgi-binディレクトリ等)かまたは、 所定のCGI専用サーバに転送してください。
絶対パス(フルパス)と相対パスの違いは?
- 相対パスとは、あくまでも対象が自分の位置を起点としてみた位置関係を指します。
【相対パスの例】
public_html / index.html ... (1) | +-- cgi-bin / bbs.dat ... (2) | +-- bbs / bbs.cgi ... (3) | +-- member / chat.cgi ... (4)
- (3) から見た (1) の位置 [1つ上位の位置]
→ ../index.html - (3) から見た (2) の位置 [平行の位置]
→ ../cgi-bin/bbs.dat - (4) から見た (1) の位置 [2つ上位の位置]
→ ../index.html - (4) から見た (2) の位置
→ ../cgi-bin/bbs.dat
- (3) から見た (1) の位置 [1つ上位の位置]
- これに対して絶対パス(フルパス)とは、自分がどこにいても不変の位置を指します。ただし、フルパスには大きく2つの意味があるので注意が必要です。
サーバパス サーバ内のパスをいいます。 Unix系サーバでは、/ から始まります。
(例)/var/www/home/bbs/index.htmlURLパス URLのパスをいいます。 http://から記述します。
(例)http://www.example.com/bbs/index.html- サーバパスである「フルパス」については、以下の「Fullpathビューワー」を利用すると、正確なフルパスが表示されます。
文字化けが生じてしまいます
- 日本語の文字コードは、大まかには次の4種類が存在します。
Shift-JIS WindowsやMacintoshで使われる基本の文字コード EUC Unixで使われる基本の文字コード JIS 主に電子メール上で使用される文字コード。 UTF-8 国際標準の文字コードであるUnicodeの代表格の1つ。 近年はその使用割合が多くなってきた。
具体的には、次のような内容をチェックしてみてください。
- Shift-JIS特有の文字化け
- Shift-JISを使用するときに、特定の文字がダブルクォート内で文字化けが生じることがあります。
例: ― ソ 欺 圭 構 蚕 十 貼 表 予 申 兔 喀 杤 噂 饅
- この場合、エスケープ文字(¥マーク)を後につけるか、文字をシングルクォートにすることで、文字化けを防ぐことができます。
print "表示する\n"; # 文字化けする(悪い例) print "表\示する\n"; # 文字化けしない print '表示する', "\n"; # 文字化けしない
- 詳しくは、以下のページをご覧ください。
- Shift-JISを使用するときに、特定の文字がダブルクォート内で文字化けが生じることがあります。
- 半角カナや機種依存文字は使用禁止
- 半角カナや機種依存文字は、原則として使用禁止です。 掲示板等への投稿コメントに、これらの文字を使用すると、文字化けが生じることがあります。
- 具体的な機種依存文字は、以下のリンクを参照してください。
- FTPソフトが自動変換していないか?
- FTPソフトの設定で、転送するCGIスクリプトの文字コードを自動変換する機能が付いているものがありますが、ユーザの知らないうちに自動変換してしまうケースがあります。
- 表示画面全体が文字化けしてしまうケースでは、この原因も疑ってみましょう。
掲示板を複数設置したい
- 掲示板等を複数設置したい場合には、掲示板ごとにフォルダを分割して設置してください。
設置例
/vaw/www/home/ | +-- bbs1 / bbs.cgi | | | +-- lib / Jcode.pm | +-- data / bbs.dat | +-- bbs2 / bbs.cgi | +-- lib / Jcode.pm +-- data / bbs.dat
ログが突然消えてしまいました
- 掲示板やカウンターで、突然データファイルが消滅してしまうことがあります。 それは、データファイルの更新処理を行うときに、たまたま複数のアクセスが同じタイミングで重なった時に発生します。
- 通常は、flock関数を用いて、同時アクセスによるデータファイルの破損を回避するようにはしています。 しかしながら、サーバがアクセス過多により緩慢な状態にあるときなど、ごく稀に発生することがあります。
- これを「完全に」回避する方策は難しいため、データファイルはこまめにバックアップを取っておくようにします。
バックアップの具体的な方法
- FTPソフトでご自分のパソコンへデータファイルをダウンロードしておきます。
- もし何らかのデータ消失があったときに、パソコン側に保管してあるデータファイルを、サーバ側へアップロードすれば、データを復旧することができます。
CGIがダウンロード状態となります(又はソース表示されてしまいます)
- プログラムそのものがダウンロード状態になったり、ブラウザ上にソース表示される場合は、その原因は以下の2点が考えられます。
- サーバがCGIファイルだと認識していない。
- サーバ側でCGIプログラムの置くディレクトリが限定されていて、それ以外ディレクトリに置いてしまっているためです。 この場合は、プロバイダの設置手順書を確認し、所定のディレクトリへ正しく置き直します。
- プロバイダによっては、CGIを実行させるためには、ディレクトリに以下のような .htaccess という設定ファイルを置く必要がある場合があります。
AddType application/x-httpd-cgi .cgi
- サーバがWindowsサーバで、PerlIS仕様の場合
- これは画面を表示させるContent-typeヘッダー部を、次のように修正する必要がある場合があります。
■ 修正前
print "Content-type: text/html\n\n";
■ 修正後
print "HTTP/1.0 200 OK\n"; print "Content-type: text/html\n\n";
- これは画面を表示させるContent-typeヘッダー部を、次のように修正する必要がある場合があります。
プログラムの文法チェックを行いたい。
- お使いのサーバで、telnetが使用できるならば、以下のようなコマンドを打ち込むことで、プログラムの文法チェックを行うことができます。
■ チェックするプログラムが、bbs.cgiのとき
perl -c bbs.cgi
- しかしながら、telnetの使えないプロバイダの場合には、以下の「Perlチェッカー」をダウンロードして、利用することでウェブから容易に文法チェックを行うことができます。
掲示板等での投稿時間がずれます
- 掲示板等での投稿時間が実際の時刻とずれる場合、以下の2つのパターン毎に対処を行なってください。
- 時間単位でズレが生じる場合(数時間ずれる)
- 時間単位でずれる場合には、サーバ内の時刻がグリニッジ標準時になっているか(9時間ずれる)、又はサーバが海外にあるケースではその現地時間となっている場合があります。
- 時間取得の処理の部分では、localtime関数が記述してるあるところがありますので、その直前に以下の一行を書き加え、「日本時間」に修正します。
# 標準時刻を日本時間に合わせる例 $ENV{TZ} = "JST-9"; # これを追加 my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime();
あるいは、次のようにして、直接time関数に時刻修正を行う方法もあります。# 9時間のズレを修復する例 my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time - 9*60*60);
- 分単位でズレが生じる場合(数分ずれる)
- 分単位でズレが生じる場合には、これはサーバ機のシステム時計の時間ズレの可能性があります。
- この場合はプロバイダへ時刻修正の依頼を行う他ありません。
掲示板やチャットで画像アイコンが出ません
- YY-BOARD などアイコン対応の掲示板を設置した場合に、「画像アイコン」が出ないという質問をいただくことがあります。 これは大きく以下の2つの原因が考えられます。
- 画像への「パス指定」が正しくない
設定ファイル(init.cgi)での画像ディレクトリパスをよく確認します。
http://からの絶対パスで記述するのも1方法です。$cf{imgurl} = 'http://www.example.com/img';
- 画像を置いてはいけないディレクトリに転送している
プロバイダの設置規定上、HTMLファイル(画像ファイル含む)を置くディレクトリと、CGIファイルを置くディレクトリを分けている場合があります(cgi-binディレクトリでなど)。
このような環境下では、画像ファイルは、HTMLを置くディレクトリ側に配置するようにします。ディレクトリ構成例
/home/example | +-- cgi-bin / bbs.cgi ← CGIファイルはcgi-binディレクトリ限定 | +-- public_html / ← HTMLや画像はpublic_htmlディレクトリ配下限定 | +-- img / icon.gif ← 画像はcgi-bin配下ではなく、public_html配下に置く
いつのまにかcoreという名前のファイルができました
- いつのまにかCGIファイルを置くディレクトリ内に core という名前の大きなファイルが出来てしまうことがあります。
このcoreファイルが出来てしまう原因には、以下のようなことが考えられます。
- サーバの動作が不安定な場合
- サーバにインストールされるPerlとCGIプログラムの相性が良くない
- 大量データの検索などで、処理時間が異常にかかった時
- これはCGI実行中にプログラムが異常終了してしまうと、サーバはメモリ上に蓄えられていたプロセスを「core」というファイル名で吐き出してしまうためです。ファイル容量も比較的大きく(1〜2MB単位)、ディスクスペースも圧迫してしまうことがあります。
- coreファイルができた場合は、これを削除して構いませんが、頻繁に出来てしまう場合には、(サーバとの相性不一致と考えて)このCGIプログラムの使用を中止する他ありません。
UTF-8コードのプログラムでメールの一部が文字化けします
- POST-MAIL(UTF-8) や WEB MART など、UTF-8コードのプログラムでメール送信した場合、届いたメールの一部が文字化けすることがあります。
- テキストエディタでメール本文のテンプレートを編集した場合に、「BOM付き」で保存すると、このようなことが起こることがあります。UTF-8コードのテンプレートやプログラムを編集する場合は、必ずBOM無し(UTF-8N)で保存するようにします。
日本語以外(中文、ハングル文字等)の2バイト文字を使いたい
- 掲示板等で、中文、ハングル文字などの日本語以外での2バイト文字を使用したい場合には、文字コードとして Unicode を使用します。
- プログラム中に、Jcode.pm等によるコード変換処理がある場合には、それは日本語の場合ですので、すべて無効化にする改造が必要です。 以下のリンクを参考にしてみてください。
掲示板が荒らされます
- 掲示板あらしに悩まされる人も多いようです。しかしながらこればかりは「完全な対策」というのは難しいのが現状です。
- 対策方法としては、「LQアクセス制限ライブラリ」というアクセス制限用のライブラリが公開されていますので、これを組み込むことで対策の1つとすることはできます。以下のページを参考にしてみてください。
suExec環境、CGIWrap環境って何ですか?
- 通常のUNIX系のWWWサーバの場合、HTTPとして動作するCGIプログラムの所有者権限は nobody で動作します。 これに対して、SuExec環境やCGIWrap環境のWWWサーバの場合には、CGIプログラムはそのファイルの所有者権限 (ユーザ権限) でプログラムが起動し、ファイルの読み書きや実行がそのユーザ権限で実行できるため、セキュリティ的に安全になります。
- 何故ファイルの所有者権限で動作させたほうが安全かというと、例えば一般サーバでは、掲示板のログファイルはパーミッションを666又は606に設定します。
この3番目の数字が nobody の実行権限を意味しますが、これを「6」、つまり「読み書き可能」にする必要があります(ブラウザ上の操作が nobody であるため)。
所有者 自分 (owner) グループ (group) その他 (nobody) パーミッション 6 0 6 読む ( r ) = 4
書く ( w ) = 2
実行 ( x ) = 1
(例) 読み書きが可能 = r + w = 4 + 2 = 6
- しかしながら、このような環境では、例えばログファイルのURLを直接指定することでダウンロードさせることができたり、あるいは同一のサーバ内のID所有者などからもログファイルの読み書きが可能になってしまう危険性が考えられます。
そこで、CGIプログラムの実行を nobody ではなく owner 権限で動作させるようにして、ログファイルのパーミッションを 600 に指定可能にすれば、このような危険性がなくなることになります。
パーミッション例
種別 一般サーバ suEXECサーバ
CGIWrapサーバCGIファイル 755 or 705 701 or 700 ログファイル 666 or 606 600 読み出し専用ファイル
(ライブラリ、HTML等)644 or 604 600 ファイル生成ディレクトリ 777 or 707 701 or 700