- ベストアンサー
Location:ヘッダにネットワークパスを使うと FireFox で使えない?
OS:Windows-Xp(sp3)を使用しています。 IEは6.0、FireFoxは3.0.6を使っています。 http://sv01/cgi/downtest.cgi の位置にある、cgiを動作させたときに、そのCGIの中で、 print "Location: \\docsvr\test\data.lzh\n"; と書いてあると、 IEでは、\\docsvr\test\data.lzh ファイルのダウンロード確認画面が出てくることに対して、 FireFoxでは、HTTP 404 - ファイルが見つかりません。エラーになります。 その際、URL欄に、 http://sv01/cgi/\\docsvr\test\data.lzh のように表示されています。 FireFoxアドインの Live HTTP headersでモニタすると、 ------------------------------------------------- HTTP/1.x 301 Permanent Location: \\docsvr\test\data.lzh : と表示されますので、これは、FireFoxの仕様か設定かと思うのですが、 また、手で、FireFoxのURL欄に、 \\docsvr\test\data.lzh と書いてリターンすると、ファイルのダウンロード画面が出ますので、 CGIで実行時に、余分な、”http://sv01/cgi/”の文字を付与させなければ、良さそうなのですが、 IEと同様にファイルのダウンロード画面を呼び出させるためには、 何か方法があるでしょうか。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
まだ閉じられていないようなので補足。 CGIの仕様(perlやphpとApacheの間で実行される規格)では Locationヘッダに対して絶対パスは文法に適合しています。 例 print "Location: /docsvr/test/data.lzh\n"; HTTPの仕様としてLocationヘッダは絶対URLでなければならないのですが、 ApacheはCGIアプリケーションからのLocationヘッダを絶対URLへの書き換えを行わないため、このときに文法違反が起こります。 そのため、CGIとしては文法に適合していても、絶対URLで出力する事をおすすめします。 スキーム名(http://やfile://など)から始まらないURLが指定された場合は、 ブラウザの独自仕様で現在のドメイン名やパスを補完するようです。
その他の回答 (4)
- 神崎 渉瑠(@taloo)
- ベストアンサー率44% (1016/2280)
訂正です。 フルパスは/docsvr/test/data.lzhではなく、 /usr/home/username/public_html/docsvr/test/data.lzh というようなパスで、 上記の/docsvr/test/data.lzhは絶対パスですね。 ついでに相対パスは./docsvr/test/data.lzhみたいな形です。 > そのため、CGIとしては文法に適合していても、絶対URLで出力する事をおすすめします。 語弊があるので訂正。 そのため、CGIの仕様にかかわらず絶対URLで出力する事をおすすめします。
- 神崎 渉瑠(@taloo)
- ベストアンサー率44% (1016/2280)
Locationヘッダは絶対URLです。 つまりhttp://から書かないとダメです。 (絶対URLとフルパスは異なります。フルパスは/docsvr/test/data.lzh) IEの動作は独自拡張によるものだと思います。 あと、Windowsのディレクトリ指定でも/です。 ネットワークパスというのは、マイネットワークのディレクトリですかね? file:///docsvr/test/data.lzh とするか、 ネットワークドライブに割り当てて、 file:///e:/test/data.lzh などとすればアクセスできるかもしれません。
- php504
- ベストアンサー率42% (926/2160)
タイトルよく読んでませんでした ネットワークパスって書いてますね さっきの回答は無視してください
- php504
- ベストアンサー率42% (926/2160)
'\' はまずいでしょう \testが[TAB]estになっちゃいますよ(\nが改行のように\tはタブになる) URL区切りのつもりなら'/' にしましょう。 またLocationヘッダーはフルパスのURLで書くのが本来の仕様です print "Location: http://~/docsvr/test/data.lzh\n";
補足
ご回答ありがとうございました。 また、誤解のある表現ですみませんでした。 正確には、次のような感じになっています。 $url = "\\\\docsvr\\test\\data.lzh"; : print "Location: $url\n";
お礼
はい。ありがとうございます。 結局のところ、Location ヘッダには、 print "Location: http://~"; のような形式で書かないと、FireFoxでは正しく動いてくれないということになるでしょうか。 追加になりますが、よろしくお願いいたします。