私は Apache 2.4.29 HTTP サーバーから提供する Angular 10-SPA を持っていますが、過去にこれを実行して WSGI アプリケーション サーバーを提供したことがある以外、HTTP サーバー全般に関する実際の経験はほとんどありません。その HTTP サーバーはバックエンド (Django-Rest-Framework 経由でデータベースに接続する WSGI 経由の Django アプリケーション サーバー) にもサービスを提供しているため、SPA は入ってくるすべてのリクエストの受信者ではなく、特定のプレフィックス (例 ) で始まるリクエストのみを受け取ります。基本的に、ドメインの直後に this があるすべての URL がにあるSPA に提供されるwww.mypage.com/prefix/
ように構成しようとしています。そうすれば、その特定のルートのページの構築がすぐに開始されるはずです。/prefix
index.html
frontendfolder
私は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 空間マッピングを実現しようとしているのかよくわかりません。私の最善のアドバイスは、まずAlias
とRewriteRule
ディレクティブをすべて削除し、 だけを残すことです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 ディレクティブの値であると想定できます。