プロが教えるわが家の防犯対策術!

cgiでhtmlファイルを読み込み、状況に応じてcgiで内容の修正や追加をして表示させたいのですがどうしても元ファイルを読み込めません。

IN = "○○.html";
$line = open(IN, "r");

とか

$line = opne IN, "○○.html";

それに

$line = "○○.html";
open(IN, $line);
@line = <IN>;

など調べて出てきたもの一通りやってみたのですが、どうしても読み込みができません。
どうすればファイルの読み込みができるのでしょうか。
仕事でどうしてもやらなければならないので、ご存じの方お助けください。

A 回答 (6件)

openはCGIが実行されているOSが管理しているファイルを開くためのものです。

ファイルの相対パスか絶対パスを指定します。URLではありません。

http://○○.com/index.html等のURLのファイルを取得するには、HTTP等のネットワーク通信を経由してファイルを取得することになります。openとはまったく別の仕組みになります。

>将来的には同一サーバー・同一ドメイン
>今のところ、サーバーが全く別のところにあります。

前述の通り、openとHTTPは全く別物です。処理の負荷も全く違います。将来的にはopenを使う事になると思います(処理の負荷、速度を考慮して)。

その「将来」が近い将来なら、別サーバのファイルをCGIと同じサーバにコピーして、openを使って処理するCGIを作った方が良いと思います。今、HTTPを利用するCGIを作っても無駄になる可能性があります。


HTTPを利用する場合、openよりもかなり複雑なプログラムになります。(LWPなどのモジュールが利用できる場合は簡単で、数行のコードで済みますが・・・)

LWPなどのモジュールが利用できる場合

#!/usr/local/bin/perl
use LWP::Simple;
$url = "http://○○.com/index.html";
$content = get($url);
print $content;


モジュールが利用出来ない場合は、ここで説明するのは面倒なので、

http://ash.jp/perl/socket_http.htm

こちらのサイトなど参考にして下さい。



>ただ、テストで同一サーバーでもやってみましたがうまくいきません。

$filename の内容は? http://~ は使えませんよ。
CGIの有るディレクトリからの相対パスで指定してみてください。

この回答への補足

ありがとうございます。
LWPのモジュールが使えたので、教えていただいた数行のコードで読み込みできました。
そのまま画面表示のテストをしてみましたが、そのhtmlファイルに直接記述してあるものは全部読めました・・・が、cssやimageファイルは全く読み込んでくれません。
これはこれで仕方のないことなのでしょうか。
IEで表示したファイルのソースを見る限りでは直接開いたものと何ら変わりないようなのですが・・・
ここにも何かルールがあるのでしょうか。
お手間おかけしますがあともう少しだけアドバイスください。
よろしくお願いします。

補足日時:2007/03/23 13:27
    • good
    • 0

>そのhtmlファイルに直接記述してあるものは全部読めました・・・が、cssやimageファイルは全く読み込んでくれません。



HTMLの基礎的な内容だと思いますが・・・(^^;

HTML内に相対アドレスで指定されているファイルは当然そのままでは開けません。絶対アドレスに書き換えるか、参照している全てのファイルをCGI側のサーバにコピーするかどちらかです。


>お手間おかけしますがあともう少しだけアドバイスください。

私の分かる範囲でしたら、時間の許す限り何でもお答えしますが、先行きが怪しくなってきたので一度整理させて下さい。あと少しでは済まない感じがしますよ(^^;


>cgiでhtmlファイルを読み込みたい
最初の質問は解決しました。別サーバのhtmlファイルを読み込むことは出来ました。
で、それを使って最終的に「何がしたいのか?」が分かりません。

現在htmlが有るサーバ:サーバAとします。
現在CGIが有るサーバ:サーバBとします。

サーバAはインターネット上に公開済みですよね?
サーバBもインターネット上に構築中でしょうか?それともローカルでテスト中でしょうか?

サーバBのCGIでサーバAのhtmlファイルを読み込んで、一部を修正して、その先は?

ひょっとしてサーバAのサイトを丸ごとサーバB上に再現しようと言う計画でしょうか?
    • good
    • 0
この回答へのお礼

勘違いしておりました。
そりゃそうですよね。開けるはずがない。
コンピュータが行う作業の順番が完全に勘違いして初歩的なことを聞いてしまいました。(元ファイルが先にリンク先にデータを読みに行って、全て引き連れて今回の処理にやってくる・・・なんて訳の分からない勘違いしてました)
お恥ずかしい限りです。

ということで全て解決しました。
結局今回やりたかったのは自社運営しているショッピングサイトの拡張に関わることだったんです。
商品ジャンルを増やすということで、現在のショッピングサイトのデザインイメージにそぐわないものが加わる。。。
元は元でそれなりに機能しているから残して、新サイトを立ち上げて、でもでもそこでも今の商品も混ぜて売ろうと・・・
なので一部は元のhtmlファイルを流用しようと・・・
1つのおっきな容量のサーバーを借りて統合すればこんなことしなくてもすんだのでしょうが、複数のドメインなどを取るタイミングでその時々で安いところを選んだ結果サーバーがバラバラになってしまいました。
素人質問に丁寧にお答えいただきありがとうございました。

お礼日時:2007/03/23 16:16

>ちなみにindex.htmlのところはhttp://○○.com/index.htmlと変えてます。



これはダメですよ。
同じサーバのファイルなら、httpではなく、ファイルのパスを指定します。

別のサーバのファイルなら、openでは開けません。
別の手段で取得可能です。

同じサーバのファイルか、別のサーバのファイルか補足願います。

この回答への補足

将来的には同一サーバー・同一ドメイン(サブドメインで分けて同じメインドメインで統一予定)を予定していますが、今のところサーバーの契約条件など諸条件もあり、サーバーが全く別のところにあります。
ドメインも基本的に関係ない(所有者は同じですが)ドメインです。

つまりは今回の件では全く別サーバーのファイルになります。
ただ、テストで同一サーバーでもやってみましたがうまくいきません。
アドバイスよろしくお願いします。

補足日時:2007/03/22 21:30
    • good
    • 0

#2です。

念のため修正します。

>print "File Open Error";
print "<html><body>File Open Error</body></html>";

タグ入れるの忘れてました。

この回答への補足

普通に問題なく表示しました・・・

補足日時:2007/03/22 21:29
    • good
    • 0

文法的な問題ではないように思います。



まず、CGIは実行されてますか?
ファイルのパーミッションや、1行目のperlのパスは問題ないですか?

下記のスクリプトの実行結果はどうなりますか?

#!/usr/local/bin/perl

$filename = "index.html";

if(open(IN,$filename)){
@lines = <IN>;
close(IN);
print "Content-Type: text/html\n";
print "\n";
print @lines;
}else{
print "Content-Type: text/html\n";
print "\n";
print "File Open Error";
}
exit;

この回答への補足

cgiは実行されてます。
正常に稼働しているcgiファイルと同じフォルダに置き、属性は707で、1行目などのPerlのパスも元々正常稼働しているファイルをコピペしてますので、間違いないと思います。

教えていただいたスクリプトを実行したところ
File Open Error
とでました。
ちなみにindex.htmlのところはhttp://○○.com/index.htmlと変えてます。
スクリプト自体はエラーが出ないのですが、標準入力でデータが取得できません。
perlの構文やパーミッションなどcgiファイルそのものとは全く別のところに問題でもあるのでしょうか。

補足日時:2007/03/22 19:33
    • good
    • 0

CGIって サーバが返す仕掛けの事を言ってるだけで言語の事を指してるわけじゃない


何を使ってるのか判らないので答えようが無いんだけど?

http://www.google.co.jp/search?q=perl%20%E3%83%9 …

この回答への補足

明記するの忘れてました。
言語はperlです。

補足日時:2007/03/22 19:29
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!