このページは福井県立大学の田中求之が2006年1月まで運用していた Mac のサーバ運用に関する会議室 「Web Scripter's Meeting」の記録です。情報が古くなっている可能性がありますのでご注意ください。

質問です:sdocイベントのaction_pathの設定値をだます?

発言者:なかゐ
( Date Saturday, March 07, 1998 01:26:22 )


 AppleScriptで、action_pathで渡されるcgiの相対パス情報を、そのスクリプ
ト内で任意に指定することは可能でしょうか?

 具体的な処理内容としては、cgiで読み込んだHTMLファイルの中身をreturnで
ブラウザに返す際に、ファイル中に埋め込まれている画像ファイル等のロケーショ
ン情報が、そのページからの相対パスで設定されていた場合に、そのファイルが
正しく読み込まれない(ページからではなく、cgiからの相対パスになってしまう)
のを回避したいのですが。

 cgiと同一階層のHTMLファイルについては問題ないのですが、他の階層からcgi
が呼び出された場合にこの障害が起こるケースがあります。ですからaction_path
の設定値を適宜変更して、参照元をcgiではなくHTMLファイルそのものにしてやれ
ば設定どおりのページが再現されると考えたのですが...。

- 考えられる他の対処方法 -
・refererパラメータの内容を加工して田中氏の逸品osaxで対象ロケーションを
 xReplaceする。
・参照先のHTMLファイル中のロケーション情報を全て絶対パスに書き直す(手動)。
・対象階層ごとにcgiを配置する(絶対やらない)。

 う゛〜もっとスマートに(笑)いかないものでしょうか?どなたかご教授お願い
します。

※ちなみにWeb共有を使用しております。

田中求之 さんからのコメント
( Saturday, March 07, 1998 16:52:59 )

一番スマートな解決法は、面倒なようですが、画像のパスなどをすべて絶対パスに
修正することでしょう。

スクリプトによって、サイト内のページのリンクを一括して修正することは可能です
ので、手動でいちいち訂正しなくても済むとは思います。

action_path を CGI 側で書き換えても効果がないはずです。というのは、
相対パス->絶対パスの変換はブラウザ側で行いますが、この際、ブラウザは
HTML の URL を起点にしますので、かならず CGI を起点に評価を行う
ようになっています。ですから、CGI 側でパラメーターを書き換えても
効果はありません。



なかゐ さんからのコメント
( Monday, March 09, 1998 02:06:08 )

どうもありがとうございます。

なるほど、ブラウザを騙すのはダメなんですね。相対パス→絶対パス変換の前に何とか
手を打つことができればと思ったんですが...浅はかでいた。

結局のところ、自動/手動のどちらににしろ、コンテンツを加工するしかないのかぁ。
xReplaceの処理速度は申し分なく速いのですが、周りのスクリプトの実行が遅いので、
タグを探し出して指定されているロケーションの先頭部分の識別処理、なんか入れたり
したら、ロケーション参照のHTMLタグが増えればきっと「重たいページ」と思われて
しまうんでしょうね。

余談:この時期の上越の雪は最悪(全然関係ないけど)。おっと、もうにじAMだ。

清 秀紀 さんからのコメント
( Monday, March 09, 1998 09:56:29 )

>一番スマートな解決法は、面倒なようですが、画像のパスなどをすべて絶対パスに
>修正することでしょう。

こういった用途用のウェブサイト構築手助けソフトウェアで
いいのをご存じの方いらっしゃいます?

ザックリ探してみたところでは、たいてい「帯に短し」で……。

田中求之 さんからのコメント
( Monday, March 09, 1998 16:04:05 )

>こういった用途用のウェブサイト構築手助けソフトウェアで
>いいのをご存じの方いらっしゃいます?

私はスクリプト書いてど〜っとやってしまいますが (^_^;;



清 秀紀 さんからのコメント
( Monday, March 09, 1998 19:49:44 )

$$DocumentRoot$$ = Macintosh HD:WebSTAR:

といったルールを決めるのが面倒で…… ;)

なかゐ さんからのコメント
( Monday, March 09, 1998 20:15:03 )

いまスクリプトを書いてますが、絶対/相対パスが同じHTML
ファイル内に混在した場合の分岐処理が少し面倒だというこ
とが解りました。

段落ごとに処理するのと、予めマスク処理をして一気にxReplace
するのとでは、どちらが高速なのでしょう?いま私が書いてる
のは後者ですが。

田中求之 さんからのコメント
( Monday, March 09, 1998 22:55:43 )

>段落ごとに処理するのと、予めマスク処理をして一気にxReplace
>するのとでは

具体的にはどういうことでしょうか? これだけではなんとも答えようがないのですが。

なかゐ さんからのコメント
( Tuesday, March 10, 1998 12:21:51 )

済みません、表現が不親切すぎました。

段落ごとというのは、HTMLファイルを1行ごとに読み込んで対象となる
テキストがあったら置き換えをして変数に格納していく方法で、
マスク処理を・・・というのはカテゴリーごとに冗長キャラクタを埋め
込んだ後、そのカテゴリーごとに一括置き換えする方法です。

マスク処理とは私が勝手に使っている言葉でした^^;。

こんな説明で足ります?

田中求之 さんからのコメント
( Wednesday, March 11, 1998 09:46:26 )

CGI 内部での処理のことだと思うのですが、具体的な処理がよくわかりません
ので、一般的なことしか言えませんが、ファイルを1行ごとに読み込むのは
かなり遅くなると思われます。処理速度を落とさないための秘訣は

1:ファイルの読み書きの回数をなるべく減らす
2: osax や他のアプリケーションの呼び出しもなるべく減らす
3:ファイル操作に、なるべく Finder は使わない

といったことがあげられます。

なかゐ さんからのコメント
( Saturday, March 14, 1998 03:45:43 )

一応、スクリプトとして形にはなったのですが、実際に実行しているのは68K機なの
で期待していたほどの速度は出ませんでした(対象ファイルが大きくなるほどムリが
でてくる)。

>3:ファイル操作に、なるべく Finder は使わない

...ことも考慮して、メインの処理内にFinder関連のスクリプトは2〜3行程度しか
記述してません。返すHTML以外のパラメータも必要な限り変数に常駐。
メインとなるパス置換処理はほとんどosaxに依存してますが、前のコメントからも
うかがえるように1行ずつ処理するよりは高速かと思われます。で、実際にブラウザ
から呼び出すと、「あー、こんなもんなのか〜」ぐらいの速度なんです。気が短い
人は「中止」を押したくなるぐらいの(ファイルサイズにも依りますが)。

結局、HTMLファイルの記述方法にあらかじめルールを設けて、cgi内ではなるべく条件
別処理をしないことがベターなんでしょうね。たとえば、パス名は絶対パスで記述する
とか、引用符で囲むとか、不要な空白は入れないとか。

指定されたURLのヒット数をカウントして、必要に応じてカウンタ(グラフィカルなカ
ウンタもIMGタグで対応)を表示するだけのCGIなんですが、予想以上に闘ってしまい
ました。カウンタ非表示ならばリダイレクトでURLを返すようにしているので、ストレ
スのない実行速度なんですが...。これでガマンするか。せっかくここまで作ったのに、
ちょっと口惜しいですね。

なかゐ さんからのコメント
( Friday, March 20, 1998 22:25:17 )

そのゴ、BASEタグを使えばよいと知りました。
返すHTMLデータの先頭に<BASE HREF=...>を加えると、そこから先の相対パスを
きちんと再現していました。面倒なURL置き換えスクリプトも全〜部取っ払ってしま
い、今では68kマシンですこぶる快調に動作しており、ファイルのダウンロード回数
のカウント等に大変重宝しております。

いやはや、初心者の勉強不足の愚かしさをつくづく痛感いたしましたとさ。
おしまい!

Post SCRIPT!
数々のアドバイスを有り難うございます。今後とも宜しくお願いします!