ローカル マシンでシングル ページ アプリ (SPA) を作成していますが、ドキュメント ルートから数レベル下にあります。したがって、たとえば、私のインデックス ページは になりますhttp://localhost/projects/foo/index.html
。
私はDavis.jsを使用して履歴 API でクライアント側のルーティングを行っていますが、ルートには絶対 URL を使用することを推奨しています。たとえば、ルート<a href="/hello/world">
をトリガーします。/hello/world
にあるリンクをクリックするとhttp://localhost/projects/foo/index.html
、URL が に変更されるため、これは問題http://localhost/hello/world
です。アプリは通常どおり続行されますが (実際にページを離れたことがないため)、これは明らかに正しくありません。ただし、ページを更新すると、ファイルhttp://localhost/hello/world
が存在しないため、404 エラーが発生します。
相対リンクを使用<a href="hello/world">
すると、マークに近づくようになります。そのリンクをクリックすると URL が に変わりますが、ルートはトリガーされhttp://localhost/projects/foo/hello/world
ません。/hello/world
同じリンクをもう一度クリックすると、http://localhost/projects/foo/hello/hello/world
(double hello) が表示されます。繰り返しますが、望ましくない動作です。
現在、Davis はドメインのルートからルートを照合しているため/hello/world
、URL が の場合にのみトリガーされhttp://somewhere.tld/hello/world
ます。/hello/world
しかし、ドキュメント ルートから直接サービスを提供していたとしても、実際には存在しない問題がまだ残っています。
現時点で、私の現在の解決策は、デイビスにパスベースの代わりにハッシュベースのルーティングを使用させることです: http://localhost/projects/foo/index.html#/hello/world
. ブラウザは常に読み込まindex.html
れ、Davis には常に/hello/world
. さらに、ユーザーが Javascript をオンにしていれば、そのハッシュ フラグメントを含むリンクは常に機能します。(その場合は気にしていません)
私が見ることができる 1 つの解決策は、ベース URL をhttp://localhost/projects/foo/
にし、サーバーにそのディレクトリ内のすべてのリクエストを に書き換えさせindex.html
、すべてのリンクとルートがベース URL + フラグメント (のような) を指し、一致させることhttp://localhost/projects/foo/hello/world
です。したがって、技術的には、これらの URLはすべて存在し、すべてが同じファイルを指しているだけです。ただし、これには、(a) URL 書き換えが可能なサーバーが SPA を提供し (URL ハッシュ ソリューションはサーバーを必要とせず、ブラウザーのみを必要とする)、(b) SPA がその「場所」を追跡する必要があります。ドキュメントルートに相対的です(これは私にとって非常に悪いことです)。
だから私の質問は、サーバー上のアプリの場所にとらわれず、できれば静的ホスティング以外のサーバー側のテクノロジーを必要とせずに、クライアント側のルーティングを行う正しい方法は何ですか。