明らかに、多くのmodリライトのディスカッションと回答がウェブ全体に存在しています。しかし、私はそれらを把握するのに苦労しています。だから私はここで尋ねようと思いました。
私は、Andy Joslinがここのコメントで説明したことを行うための書き換えルールを求めています: https://stackoverflow.com/a/11100438
これは、example.comのルートにある私の現在のdir構造です
/ apiへのリクエストを除くすべてのリクエストをapp/index.htmlにリダイレクトしたいと思います。
例えば:
http://example.com/categories/electronics/iPod は、実際には http://example.com/app/indexに行くようなものです。 html/categories/electronics/iPod
App/index.htmlの部分を非表示にしたいのですが。
次に、 http://example.com/api へのリクエストには例外があります。これらのURLパスにajaxリクエストを行う必要があるためです。
ありとあらゆるヘルプ/ガイダンスをありがとう。
ここにあなたを始めるためのものがあります(これを/.htaccessファイルに入れてください):
Options +FollowSymLinks
IndexIgnore */*
RewriteEngine on
# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_URI} !/api
# otherwise forward it to index.html
RewriteRule ^.*$ - [NC,L]
RewriteRule ^app/. /app/index.html [NC,L]
注:新しいApacheバージョンについては、次の回答も参照してください。これにより、はるかに簡単にFallbackResource
を使用できます。
この質問に対する受け入れられた回答は古くなっています。 Apache 2.2.16以降のconfファイルでFallbackResourceディレクティブを使用できるようになりました。
FallbackResource /app/index.html
FallbackResourceディレクティブで「/ api」ルートを無視する場合:
<Directory /api>
FallbackResource disabled
</Directory>
私の本番サーバーから:
<VirtualHost *:80>
ServerName XXX.com
DocumentRoot /home/www/XXX.com/www
# Local Tomcat server
<Location /api/>
ProxyPass http://localhost:8080/api/
ProxyPassReverse http://localhost:8080/api/
</Location>
RewriteEngine On
# If an existing asset or directory or API is requested go to it as it is
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d [OR]
RewriteCond %{REQUEST_URI} /api
RewriteRule ^ - [L]
# If the requested resource doesn't exist (and is not API), use index.html
RewriteRule ^ /index.html
ErrorLog logs/XXX.com-error.log
CustomLog logs/XXX.com-access.log common
</VirtualHost>
その点に注意してください "!"受け入れられた回答の「/ api」の前が正しくありません。
この回答の問題は、ファイルが見つからない場合でも404が必要なことです。ユーザーがフロントエンドアプリケーションをどのように構築しているかに応じて、CSSまたはその他のファイルが404を返すことは非常に一般的です。特に、より大きな動的アプリケーションを構築している場合や、フロントエンドの作業をアウトソーシングしている場合はそうです。また、angularルートは通常、ファイルシステム上の何にも関連していません。単一のディレクトリに絞り込むと、上記が機能する場合があります。たとえば、すべてに共通のプレフィックスを使用することがよくあります。 angularファイルシステムレイアウトに関連しないルート(/ ajs /)。
<Directory /ajs>
FallbackResource /app/index.html
</Directory>
それならもっと理にかなっていますが、それは私にはうまくいかないようです。共通のプレフィックスを使用すると、バックエンドに関係なく、バックエンドルールがはるかに単純になります。たとえば、リバースプロキシを使用していない場合は、単純なサーバー転送コントローラーをセットアップできます。また、Apache書き換えルールのモデリングが簡単になります。例えば:
RewriteEngine On
RewriteRule ^/ajs/(.+)$ /index.html
そうは言っても、私はこれまでにディレクトリ/フォールバックメソッドを見たことがないので、angular転送のみが必要な書き換えである場合に検討することに興味があります。ありがとうございます。
これは、スコットファーガソンの優れた答えのわずかなバリエーションと詳細です。 <Location>
よりも<Directory>
ディレクティブを使用する方が簡単です。 <Directory>
ディレクティブは、マシンごとに異なる絶対パス名を取ります。
Angularアプリのindex.html
は、Webサーバーのドキュメントルートの下のmy-app/index.html
にあり、http://localhost/my-app
を使用してアプリにアクセスするとします。
まず、ベースhrefが「/ my-app /」であることを確認してください。次に、httpd.conf
ファイルに以下を追加します。
<Location "/my-app">
FallbackResource /my-app/index.html
</Location>
これにより、/my-app/
の下のリソースが見つからない場合、Apacheはindex.htmlをロードします。
/my-app/api
のように、同じパスでAPI呼び出しを行う場合は、これらの呼び出しにFallbackResource
ルールを適用しないでください。だから追加:
<Location "/my-app/api">
FallbackResource disabled
</Location>