46

注: この質問は次のようにも読めます。

Java でハッシュバンのないクライアント側 MVC フレームワークのブックマークをサポートする方法。

hashtagsを使用するAngularアプリをhtml5mode. 無事設定できました

$locationProvider.html5Mode(true);

また、ランディング ページ (index.html) からのすべてのリンクは正常に機能します。

問題は、部分的な URL が直接参照されている場合、サーバー エンドポイントの定義がクライアント側で定義されたルートに結合されていないため、当然 404 が返されることです。

したがって、HTML5 がないと、SEO に適していないハッシュバングを取得できますが、HTML5 を使用すると、ランディング ページ (Angular をブートストラップするページ) 以外をブックマークすることはできません。

デフォルトのランディング ページ (index.html) を最初にリクエストすると機能する理由、つまり htpp://mydomain.com/ :

  1. ブラウザはサーバーから index.html をリクエストします
  2. サーバーは index.html を返し、ブラウザーは角度フレームワークをロードします
  3. URL の変更がクライアント側のルーターに送信され、適切なパーシャルが読み込まれます。

(つまり) http://mydomain.com/fooがブラウザーから直接要求された場合に機能しない理由:

  1. ブラウザがサーバーに mydomain/foo を要求します。
  2. リソースが存在しません
  3. サーバーが 404 を返す

この話には何かが欠けている、私には何がわからない。これが私が見ることができる唯一の2つの答えです...

  • それは設計によるものです。 これはどのように機能するはずですか?ユーザーは常にクライアント MVC フレームワークのブートストラップ ページ (通常は index.html) にアクセスし、そこから移動する必要があります。状態を保存できず、ブックマークする方法がないため、これは理想的ではありません...クロールは言うまでもありません。
  • サーバー ソリューション。 これはサーバー側のトリックで回避できますか? たとえば、すべてのリクエストで index.html を返し、すぐに追加のコンテキストで router を呼び出します。もしそうなら、これは AngularJS が完全にクライアント側であり、ハックのように見えるという目的に反しています。
4

3 に答える 3

3

私は自分の PHP サイトについて、これについてしばらく考えました。サーバー側のすべてのコードを/apiルートから切り離して、Angular から分離しておきます。これが、Apache構成を更新して思いついた解決策です。

RewriteEngine on
#let the php framework do its thing
RewriteRule ^(api/.*)$ index.php?url=$1 [QSA,L,NC]
#let angular do its thing
RewriteCond %{REQUEST_FILENAME} !-f      
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*) index.html [NC,L]

http://www.awnage.com/2013/10/10/taking-flight-with-angularjs/で、Flight PHP フレームワークを使用してこれを行う方法を書きました。

于 2013-10-10T15:41:25.807 に答える