web-dev-qa-db-ja.com

file:スキームを使用してhtml内のローカルファイルを指定する方法は?

Apacheサーバーに組み込まれたOS Xでホストされているhtmlファイルを読み込んでいます。そのファイル内で、次のように同じディレクトリ内の別のhtmlファイルにリンクしています。

<a href="2ndFile.html"><button type="submit">Local file</button>

これは動作します。しかし、(入るには長すぎる理由で)私は代わりにfile:スキームを使用して実験していますが、何も動作しません。ファイルを使用して上記の行を書き換える方法は次のとおりです。

<a href="file://192.168.1.57/~User/2ndFile.html"><button type="submit">Local file</button>

(192.168.1.57は現在のIPアドレスです)

次のように変更しても機能しません。

<a href="file://Name-Of-MacBookPro/~User/2ndFile.html"><button type="submit">Local file</button>

しかし、ファイルが見つかりません。file:スキームを使用してどのように指定する必要がありますか?

30
Gruntcakes

file: URLスキームは、クライアントマシン上のファイルを参照します。 file:スキームにはホスト名がありません。ファイルのパスを指定するだけです。したがって、ローカルマシン上のファイルはfile:///~User/2ndFile.htmlになります。 3つのスラッシュに注意してください。 URLのホスト名の部分は空なので、パスの先頭のスラッシュはURLの先頭の二重スラッシュの直後に続きます。また、ユーザーのパスを展開する必要があります。 ~file: URLで展開しません。したがって、file:///home/User/2ndFile.html(ほとんどのUnix)、file:///Users/User/2ndFile.html(Mac OS X)、またはfile:///C:/Users/User/2ndFile.html(Windows)が必要です。

多くのブラウザは、セキュリティ上の理由から、サーバーからローカルファイルにロードされるファイルからのリンクを許可しません。そのため、HTTP経由で読み込まれたページからこれを行うことができない場合があります。他のローカルページからfile: URLにのみリンクできる場合があります。

48
Brian Campbell

「ファイル」プロトコルはネットワークプロトコルではありません。したがって、file://192.168.1.57/~User/2ndFile.htmlはあまり意味がありません。

問題は、最初のファイルをどのようにロードするかです。それは本当にWebサーバーを使用して行われますか?本当のように聞こえません。もしそうなら、なぜ同じプロトコル、おそらくhttpを使用しないのですか?プロトコルを単に切り替えて、2つの異なるプロトコルを同じ方法で使用することは期待できません...

最初のファイルは実際にはApacheサーバーを使用してロードされていると思われますが、単にファイルを開くだけですか? href = "2ndFile.html"は、単に「相対URL」を使用するため、機能します。これにより、ブラウザーは最初の(現在の)ファイルを取得した場所と同じプロトコルとパスを使用します。

2
arkascha

「file://」URLプロトコルは、ローカルマシンのファイルシステム内のファイルを見つけるためにのみ使用できます。このhtmlコードはブラウザによって解釈されるため、「ローカルマシン」はブラウザを実行しているマシンです。

ファイルが見つからないというエラーが表示される場合、ファイルが見つからないためと思われます。ただし、ブラウザのセキュリティ制限にもなります。一部のブラウザでは、ファイルシステム以外のhtmlページからファイルシステムファイルを参照できません。ブラウザを実行しているマシンのコマンドラインからファイルパスを使用して、これがブラウザの制限であり、正当なファイルの欠落ではないことを確認できます。

1
james turner

以前同様の問題があり、私の場合、ファイルは別のマシンにあったので、ネットワークドライブzをファイルのフォルダーの場所にマッピングし、Tomcatでコンテキストを作成したので、Webプロジェクトでコンテキスト経由でHTMLファイルにアクセスできました

0