|
≪ CGI / SSI≫ |
CGI / SSI 設置・設定 |
≪
≪
≪
≪
≪
ファイル転送
≫- FTPで、転送する前にまず設置しようとしているサーバーのperlのパスを確認します。
「.cgi」「.pl」等のCGIファイル、1行目
通常は、
#!/usr/local/bin/perl
又は
#!/usr/bin/perl
ですが、サーバー管理者が任意のディレクトリーにインストールしていた場合はこれと異なりますので、 ダウンロードしたCGIが指定と違う場合インストールされているパスに変更します。
- CGI自作およびカスタマイズをした場合は、文法チェックを行いましょう。
ローカル又はtelnetで「perl」コマンドを使います。(例:test.cgi)
$ perl -cw test.cgi
test.cgi syntax OK
と「syntax OK」が出ればOKです。
- 転送の前にファイル内の改行コードについて少々...
OS 改行コード Windows CR (\r) + LF (\n) Macintosh CR (\r) UNIX LF (\n)
上記の表のように、各OSにて作られるテキストファイルの改行コードが異なります。
そこで、テキストファイルを転送する際にはそのOSに合った改行に変換させる為にアスキー転送を行います。
バイナリー転送をしますと、そのままの形式(オリジナル)で転送されますので改行コードが異なっているとCGIファイルの場合は書かれている文法が正常処理されなくなりサーバーエラーとなります。
そのようにならないよう次項を参照しながら転送をして下さい。
※ 備考:バイナリーファイルとは、機械語(2進法)で書かれているファイル。
(画像、動画、圧縮、アプリケーション、コンパイルされたプログラムファイル等)
- その他設定が済みましたら、FTPで「.cgi」「.pl」等のCGIファイル、「.txt」「.dat」「.csv」等のデーターファイルをアスキー(ASCII)転送をします。
転送方法を自動で転送している方は、ここでお気をつけ下さい。ご利用されていますFTPの初期設定で、特に「.dat」「.csvt」ファイルはアスキー転送の設定になっていない場合が多いですので、 転送する前に、「.dat」ファイルをアスキー転送の設定にしてから転送開始をするか又は、手動でアスキー転送をして下さい。
・FFFTPの場合 = 「A」ボタン
・WS_FTPの場合 = 「ASCII」にチェック
・Fetchの場合(Mac) = フォーマット「テキスト」を選択
( 注:初期設定 [Misc]にて「ISOコード変換をする」にチェックが入っている場合は外す )
※ FTP自動転送の追加設定方法 ・ FFFTPの場合
[オプション(O)]-[環境設定(S)]-[転送1]を開き、アスキー転送をするファイルの拡張子を追加します。
・ WS_FTPの場合
[Option]-[Extensions]を開き、アスキー転送をするファイルの拡張子を追加します。
・ Fetchの場合(Mac)
[カスタム]-[拡張子割り付け]-[追加]で設定画面を開き、ファイルの拡張子と転送形式を設定し[OK]で閉じる
※ 転送例 ・「.cgi」「.pl」「.dat」「.txt」→ [ASCII]
・「.jpg」「.gif」「.png」「.bmp」等の画像及び「.zip」「.lzh」等の圧縮ファイル→「BINARY」
≪
パーミッション
≫-
指定ファイルのFTPでの転送が全て終わりましたら、UNIXサーバーにおいてパーミッションの設定をします。
CGIファイル
FTPソフトにて特に設定をしていない限り、アップ後のファイルは[644]になっていますがこの属性では、 単なるファイルとしか認識しませんのでCGIは動きません。
そこで、アップしたCGIファイルにCGIを実行させる為に実行権を与えます。 通常、CGIは「nobody」等のユーザー名で実行される為、その他のユーザーがアクセス実行出来るように[実行]と[読み]の権限を与えます。
権限を上記の表の数値と照らし合わせると、「4+1=5」となりそれぞれに与えると[555]なります。 そして、自分にだけ(オーナー)に書き権限を加え「5+2=7」よって[755]となります。
余談?ですが、上記の場合他のユーザーに実行権を与えた訳ですからCGIは[005]でもサーバーの仕様にもよりますが動作するかと思います。 但し、自分がFTP等でファイルを読む事も出来なくなりますので、通常[755]又は[705]と設定します。
※ 備考 : FFFTPの場合は先ほどの開いた画面の[転送3]での設定で、アップ後自動でパーミッション設定するように出来ます。
書き込みの必要なデーターファイル
CGIファイルのパーミッションの説明で、自分にだけ(オーナー)に書き込み権限を加えました。
今度は、掲示板のような投稿書き込みの伴うデーターファイルでは全てのユーザーに読み書き権限が必要になりますので、自分だけにではなく権限を与え「4+2=6」で[666]の設定となります。
CGIによってファイルを自動育成させる格納ディレクトリー
これも上記データーファイルと同じ解釈で、書き込み権限がないディレクトリーファイルにはファイル(及びディレクトリー)を作成(書き込み)する事が出来ませんので、 書き込み権限「2」を追加し[777]とします。
CGIが自分のユーザー(オーナー)権限で実行される場合
この場合は、オーナーのみに[実行]及び[書き]権限を与えるだけで良いですので、CGI=[700]、データーファイル=[600]、ディレクトリー=[755]でもOKです。
FTPによるパーミッションの設定
・ FFFTPの場合
属性変更をするファイルを選択後、[コマンド(C)]-[属性変更(A)]を開き、後はチェックボックスに与える権限にチェックを入れるか、[現在の属性]の欄に数値を入れ[OK]ボタン。
・ WS_FTPの場合
属性変更をするファイルを右クリック-[chmod(UNIX)]を開き、チェックボックスに与える権限にチェックを入れ[OK]ボタン。・ Fetchの場合(Mac)
属性変更をするファイルを選択後、[リモート]-[permissionsの設定]を開き、チェックボックスに与える権限にチェックを入れ[OK]ボタン。
※ 備考 : telnetでのパーミッションの設定 [ $ chmod 755 xxx.cgi ]
パーミッション設定が終えたら...
設置したURLを確認しブラウザにてCGIにアクセスしてみましょう。
|
[ オーナー ] = 自分のユーザー名
[ グループ ] = グループになっている場合もあれば自分のみの場合もある
[ ユーザー ] = 上記以外のユーザー全て
≪
データーファイル
≫- 投稿や登録されるデーターファイル等は、何も施さない限りWEB上からそのままそのファイルが見られてしまいます。大切なデーターを扱う場合には注意を払う必要があります。
- データーファイル名は、分かりづらいファイル名に変更するか又は、ホームディレクトリー(www、publick_html等)より上位の層に設定が可能な場合はそちらへ配置する事をお勧め致します。
- .htaccessの設置が可能なサーバーの場合は、定められた記述にこれらファイルの拡張子を指定することによりアクセス制限を掛ける事が出来ますので必要に応じてアップするのも良いでしょう。
- 但し、cgi-binなど(CGIしかアクセス出来ない)のディレクトリーに設置の場合はこの限りではありません。
≪
SSIでのHTML記述
≫-
SSI / Server Side Includes (サーバーサイドインクルーズ)
SSIは利用可能か調べる
ご利用のWWWサーバーがSSIが使えるようになっているか確認して下さい。
もし、.htaccessファイルの設置が必要な場合は
[ AddType text/x-server-parsed-html .shtml ] や
[ Options +Includes ] 等、指定された記述を入れアスキーでアップして下さい。
セキュリティー上からSSI自体を許可していなかったり、一部の機能しか許可していない(コマンド実行は危険が多いので実行不可)場合が多いようです。
尚、これから書かれている、指定出来るパス等はサーバーの仕様にもよるとも思いますので参考としてご覧下さい。
コマンド等でCGI実行の埋め込み例 ( #exec )
○ <!--#exec cmd="./xxx.pl" --> ・ データー等のパス指定は、これを埋め込んだhtmlファイルの位置からみたパスで指定する。 ・ サーバーの仕様により埋め込んだhtmlファイルより上位のディレクトリーに対する相対パスや絶対パス又は、そのhtmlの直下での位置(同じディレクトリー)でないと実行出来ない場合もありますのでご注意下さい。 ※ 備考:WIN Apacheの場合は [ <!--#exec cmd="perl C:/cygwin/〜/xxx.pl" --> ] 等で動作するようですがApacheバージョンによるようです。
○ <!--#exec cgi="./xxx.cgi" --> ・ 引数を渡せる場合には、
<!--#exec cgi="./xxx.cgi?aaa=bbb&ccc=ddd" -->
で実行が可能(WIN AN HTTP Daemonでは可)です。
(但し、私が実験可能なApache環境ではバージョンにもよるのかもしれませんがUNIX、WIN共に不可でした。)
※ 「#exec」が許可されていないなどの場合は... ・ 次項の「#include」で実行が可能です。
<!--#include virtual="./xxx.pl?aaa=bbb&ccc=ddd" -->
<!--#include virtual="./xxx.cgi?aaa=bbb&ccc=ddd" -->
( 引数を渡す場合の例で無くても構いません。 但し、この時は特に.plの場合はヘッダ出力がない場合が多いですので [ print "Content-type: text/html\n\n"; ] などのヘッダを忘れずに記述の事。
備考: 引数を渡す他の方法 4項の環境変数を利用しCGIに渡す方法です。
<!--#set var="変数名" value="値" -->
<!--#include virtual="./xxx.cgi" -->
CGI側で [ $ENV{'変数名'}; ] で受け取れます。
(但し、WinでのApache2環境での結果。)
テキストファイルの埋め込み例 ( #include )
○ <!--#include virtual="./xxx.txt" --> ・ 「virtual=""」で指定出来るパスはホームディレクトリー内にあるファイルのパスであれば上位ディレクトリー指定も可。
○ <!--#include file="./xxx.txt" --> ・ 「file=""」で指定出来るパスはそのディレクトリー以下にあるファイルパス。
環境変数を利用した埋め込み例 ( #echo )
○ <!--#printenv --> ・ はじめに、そのサーバーで利用出来る環境変数を調べてみましょう。
<pre>
<!--#printenv -->
</pre>
で、表示させてみます。 利用出来る ≪ 環境変数 ≫ が表示されますので参照してみるのも良いかと思います。
※ <pre>〜</pre>は単に、表示結果をそのままの形で(改行を付けた形)表示させる為。
○ <!--#set var="A" value="B" --> ・ 又、一時的に環境変数を自分で作る事が出来ます。
「A」は変数名「B」はその値を指定します。
<!--#set var="TEST" value="1" -->
<!--#echo var="TEST" -->
表示結果例:1
○ <!--#echo var="DATE_LOCAL" --> (変数名DATE_LOCALを利用) ・ 結構よく使われると思われます、アクセス日時の表示です。
表示結果例:Wednesday, 26-Feb-2003 21:01:30 JST
○ <!--#echo var="LAST_MODIFIED" --> (変数名LAST_MODIFIEDを利用) ・ これも結構よく使われると思われます、これを埋め込んだファイルの最終更新日時の表示です。
表示結果例:Wednesday, 26-Feb-2003 21:01:30 JST
※ 日時表示フォーマット [ <!--#config timefmt="書式指定文字" --> ] ・ 上記方法「DATE_LOCAL」「LAST_MODIFIED」等のみのままでは少々見辛いと言う方は表示方法をフォーマットしてみます。
(※ サーバーにより使えない場合あり。)
<!--#config timefmt="%Y/%m/%d (%a) %H:%M:%S" -->
<!--#echo var="DATE_LOCAL" -->
表示結果例:2003/02/27 (Thu) 14:01:06
≪ 書式指定文字表> ≫
ファイル最終更新日時の埋め込み例 (#flastmod)
※ 上記、環境変数を利用しての場合と違い他のファイルを参照します。
○ <!--#flastmod virtual="./xxx.txt" --> ・ 指定パスに関しては#include同様
○ <!--#flastmod file="./xxx.txt" --> ・ 指定パスに関しては#include同様
※ 日時表示フォーマット [ <!--#config timefmt="書式指定文字" --> ] ・ フォーマットは前項の「日時表示フォーマット」同様。
ファイルサイズ値の埋め込み例 (#fsize)
○ <!--#fsize virtual="./xxx.txt" --> ・ 指定パスに関しては#include同様
○ <!--#fsize file="./xxx.txt" --> ・ 指定パスに関しては#include同様
※ サイズ表示フォーマット [ <!--#config sizeefmt="bytes" --> ] ・ 上記指定「bytes」は名の通りサイズ値をbytes表示します。他に「abbrev」(KやMに適切に表示短縮)もありますが、特に指定しなくても表示短縮されると思いますのでそうで無い場合指定してみて下さい。
<!--#config sizefmt="bytes" -->
<!--#fsize virtual="./xxx.txt" --> (通常表示 21K)
表示結果例:21,584
≪ 書式指定文字表 ≫
条件制御文の埋め込み例 (#if #elif #else #endif)
○ <!--#if expr="もし条件文" -->
<!--#elif expr="ではなく、もし条件文" -->
<!--#else --> (でなければ)
<!--#endif --> (条件制御終了)
条件によって表示文字を変える記述で「#elif」は下記のように幾つでも増やせます。又、条件演算子(&&、||、<、>、=、<=、>=、!=、!)や正規表現(/.../)も利用出来ます。
<!--#if expr="$HTTP_USER_AGENT = /Win/ && $HTTP_USER_AGENT = /MSIE/" -->
Windows IE
<!--#elif expr="$HTTP_USER_AGENT = /Win/ && $HTTP_USER_AGENT = /Mozilla/" -->
Windows Mozilla
<!--#elif expr="$HTTP_USER_AGENT = /Mac/ && $HTTP_USER_AGENT = /MSIE/" -->
Macintosh IE
<!--#elif expr="$HTTP_USER_AGENT = /Mac/ && $HTTP_USER_AGENT = /Mozilla/" -->
Macintosh Mozilla
<!--#elif expr="$HTTP_USER_AGENT = /Win/" -->
Windows ??
<!--#elif expr="$HTTP_USER_AGENT = /Mac/" -->
Macintosh ??
<!--#else -->
?? ??
<!--#endif -->
※ 上記例は、単にそのまま文字を表示させていますが、勿論文字の代わりに各前項の記述を埋め込む事が出来ます。
これを利用する事によって、htmlファイルに環境変数やコマンドを実行させてその結果を表示させる事が出来ます。
≪
CGI動作不良
≫-
どうしてもCGIエラーや動作が上手く行かない言う場合の確認事項
「500 Internal Server Error」の場合。
- CGIファイルがバイナリー(BINARY)転送になっている。
- 指定ファイルがアップされていない又は、場所指定が間違っている。
- 書込み権限の無いディレクトリーにファイルを作ろうとしている。(ロックファイル等)
- メールアドレス設定の際に文法エラーになった。
(ダブルクォートで囲まれている場合メールアドレスの「@」は「\@」とする又、何処かに全角空白が入ってしまっていないか確認)
- .htaccessも一緒にアップしている場合、.htaccessの記述ミスがある。
「403 Forbidden」の場合。
- パーミッションの設定に間違いがある(実行権が無い)
設定例
「.cgi」「.pl」→ [755] ( 「.pl」 サブルーチンの場合[644] )
「.dat」「.txt」 → 書き込みが必要な場合[666]、読み専用の場合[644]
- .htaccessアクセス制限においてホスト制限が掛かっている。
アクセス制限においての認証失敗した場合に表示
- パーミッションの設定に間違いがある(実行権が無い)
「404 Not Found 」の場合。
- 単にURLに間違いと思いますので、CGI名(大文字小文字の区別等)等再度確認して再度アクセスする
- 単にURLに間違いと思いますので、CGI名(大文字小文字の区別等)等再度確認して再度アクセスする
CGIがそのまま表示(テキスト表示)されてしまう。
- パーミッションの設定のし忘れ。
- CGI設置が許可されていないか「cgi-bin」などと設置ディレクトリーが指定されている
- .htaccess ファイルの設置が必要。(以下、ファイルの記述例)
・CGIの場合 AddType application/x-httpd-cgi .cgi
・SSIの場合 AddType text/x-server-parsed-html .shtml
[an error occurred while processing this directive]の場合。
- SSI実行でのエラーでは、このような表示がされますが、「500 Internal Server Error」での確認を一つ一つチェックしてみましょう。
- 又、指定出来ない(上位ディレクトリー)パスを指定しているかもしれません。
動作不良の早期解決には文法チェック....
- 「perl」コマンドで文法チェックをします。(例:test.cgi)
$ perl -cw test.cgi
Name "main::test"...省略....test.cgi line 29.
test.cgi syntax OK
と「syntax OK」が出ればOKですが、 上記の例では$testと言う変数は一度しか使われていないとのメッセージがあります。
他にも使っている場合は、不動作又はエラーの原因になりますのでスペルミスがないか確認して下さい。 - C言語の場合の文法チェック [ $ gcc -Wall test.c 等 ]
以上のような事が考えられますので、一つ一つ確認してみて下さい。- 「perl」コマンドで文法チェックをします。(例:test.cgi)
楽天売れ筋プログラミング入門書 etc ... | |
|
|
|