ローカル マシンでシングル ページ アプリ (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 がその「場所」を追跡する必要があります。ドキュメントルートに相対的です(これは私にとって非常に悪いことです)。
だから私の質問は、サーバー上のアプリの場所にとらわれず、できれば静的ホスティング以外のサーバー側のテクノロジーを必要とせずに、クライアント側のルーティングを行う正しい方法は何ですか。