Apache 2 - 特定の名前空間を SPA の index.html に再ルーティングする

Apache 2 - 特定の名前空間を SPA の index.html に再ルーティングする

私は Apache 2.4.29 HTTP サーバーから提供する Angular 10-SPA を持っていますが、過去にこれを実行して WSGI アプリケーション サーバーを提供したことがある以外、HTTP サーバー全般に関する実際の経験はほとんどありません。その HTTP サーバーはバックエンド (Django-Rest-Framework 経由でデータベースに接続する WSGI 経由の Django アプリケーション サーバー) にもサービスを提供しているため、SPA は入ってくるすべてのリクエストの受信者ではなく、特定のプレフィックス (例 ) で始まるリクエストのみを受け取ります。基本的に、ドメインの直後に this があるすべての URL がにあるSPA に提供されるwww.mypage.com/prefix/ように構成しようとしています。そうすれば、その特定のルートのページの構築がすぐに開始されるはずです。/prefixindex.htmlfrontendfolder

私はAngular ドキュメントapache2を使用したデプロイメントとapache2のドキュメントについて書き換えルールそして書き換え条件ディレクティブ。これは、sites-available/mypage.conf にあるものです。Directory タグ内のすべては、angular.io からコピーして貼り付けたものです。

        DocumentRoot /path/to/frontendfolder
        #DocumentRoot is not a typo, I'm not sure if DOCUMENT_ROOT calls that variable or not,
        #but there is nothing else called like it in neither the mypage.conf file, nor 
        #apache2.conf, nor envvars

        Alias /prefix /path/to/frontendfolder
        Alias /prefix/ /path/to/frontendfolder/index.html
        <Directory /path/to/frontendfolder>
                Require all granted
                RewriteEngine On
                # If an existing asset or directory is requested go to it as it is
                RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
                RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
                RewriteRule ^/prefix - [L]

                # If the requested resource doesn't exist, use index.html
                RewriteRule ^/prefix /index.html

        </Directory>

これにより、URL にアクセスしたときに少なくとも index.html を読み込むことができますmypage.com/prefix。mypage.com/prefix/page1 にアクセスして更新をクリックすると、Apache の「404 Not Found」が表示されます。

私の設定の何が問題なのでしょうか? この URL が有効なファイルにつながらない限り、/prefix で始まるものはすべて index.html にルーティングされると思っていたのですRewriteRule ^/prefix /index.htmlが、なぜそうならないのでしょうか?

答え1

あなたの設定は、どうかご容赦ください、混乱しているようです。

正しい、ドキュメントルートこれはタイプミスではありません。これは URL 空間をファイル システムにマッピングする基本的な Apache ディレクティブです。つまり、Alias、RewriteRule、またはその他の方法で上書きする場合を除き、Apache にリクエストに応答する場所を指示します。

どのような URL 空間マッピングを実現しようとしているのかよくわかりません。私の最善のアドバイスは、まずAliasRewriteRuleディレクティブをすべて削除し、 だけを残すことですDocumentRoot。その後、必要な URL マッピングが得られるか確認してください。たとえば、

DocumentRoot /path/to/frontendfolder

へのリクエストは、ファイル システム内でexample.com/prefixにルーティングされます/path/to/frontendfolder/prefix。それがディレクトリであり、たとえば index.html ファイルが含まれている場合、リクエストは によって応答されます/path/to/frontendfolder/prefix/index.html

これが出発点です。もしそれがあなたのニーズを満たさなければ、必要に応じてそれを上書きすることができます。エイリアスおよび RewriteRule ディレクティブ。Alias はよりシンプルで基本的なため、最初に使用してみて、より複雑なニーズがある場合は RewriteRule にフォールバックしてください。

幸運を!

ちなみに、RewriteCond のドキュメントには と記載されていますがDOCUMENT_ROOT、その値は明記されていません。ただし、DocumentRoot ディレクティブの値であると想定できます。

関連情報