angular
の同じserver
ブロックから複数のNginx
アプリを提供しています。したがって、ユーザーがホームページを経由せずに宣言した特定のカスタムAngular
ルートを直接参照できるようにするため(そして404ページを回避するため)、これらのルートをnginxから各angularアプリのindex.html
、location
ごとにtry_files
を追加しました:
server {
listen 80;
server_name website.com;
# project1
location / {
alias /home/hakim/project1/dist/;
try_files $uri /index.html;
}
# project2
location /project2/ {
alias /home/hakim/project2/dist/;
try_files $uri /index.html;
}
# project3
location /project3/ {
alias /home/hakim/project3/dist/;
try_files $uri /index.html;
}
}
この解決策は、Angular=ルートに移動するときに404エラーを回避しますが、問題は、/project2/
または/project3/
を参照すると、/project1/
にリダイレクトされるということです。適切なプロジェクトの/project-i/index.html
に転送する各場所を用意します。
一般に、1つのドメインに複数の独立したアプリを配置することは、セキュリティ上の問題です。
ただし、ここで直面しているのは、try_files
の動作の特殊性だと思います- http://nginx.org/r/try_files によると、
ファイルが見つからなかった場合、最後のパラメーターで指定されたURIへの内部リダイレクトが行われます。
事実上、これは、/index.html
仕様の後に追加のパラメーター(つまり、基本的には何でも)があった場合、コードが期待どおりに機能したことを意味します。ただし、そのような最終的なパラメータがないため、それぞれの場合に発生するのは、/
リクエストが行われたかのように、すべてがGET /index.html HTTP/1.1
location
にリダイレクトされることです作成されます(ただし、nginxの内部ですべて行われます)。
したがって、解決策として、内部リダイレクトのパスを同じlocation
内に維持するように修正するか(/projectX/index.html
など)、パスをそのままにして、最後のパラメーターにエラーコード(例:=404
、ファイルが常に存在している限りトリガーされない)。
例:try_files $uri /projectX/index.html;
、
または、try_files $uri /index.html =404;
。
のように:
location /projectX/ {
alias /home/projectX/dist/;
try_files $uri /projectX/index.html; # last param is internal redirect
}
または:
location /projectX/ {
alias /home/projectX/dist/;
try_files $uri /index.html =404;
}
要約すると、/projectX/index.html
は最後のパラメーターとしてのみ機能し、/index.html
は非最終パラメーターとしてのみ機能することに注意してください。
これが誰かを助けることを願っています
ステップ1-すべてのプロジェクトをビルドします
ng build --prod --base-href /project1/
ng build --prod --base-href /project2/
ng build --prod --base-href /project3/
ステップ2-nginxを設定します。try_files
セクションに追加された変更に注意してください
server {
listen 80;
server_name website.com;
# project1
location / {
alias /home/hakim/project1/dist/;
try_files $uri/ /project1/index.html;
}
# project2
location /project2/ {
alias /home/hakim/project2/dist/;
try_files $uri/ /project2/index.html;
}
# project3
location /project3/ {
alias /home/hakim/project3/dist/;
try_files $uri/ /project3/index.html;
}
}
ステップ-nginx設定を再読み込み
Sudo service nginx reload
基本的に異なるアプリである multilingual Angular application AOT builds のソリューションを試してください-同じアプリを複数回実行して、異なるディレクトリの異なるバンドルの異なる言語でビルドします。
--base.href =/projectx /を使用してアプリをビルドしてみてください。例:
ng build --base.href=/project1/
ng build --base.href=/project2/
ng build --base.href=/project3/
最初の場所を次のように変更します。
# project1
location /project1/ {
alias /home/hakim/project1/dist/;
try_files $uri /index.html;
}
現在のブロックはすべての「/」に一致し、リクエストに一致するのはこれが最初です。
プロジェクト2に追加してみてください。
<base href="/project2">