私は、フランス語と英語の両方をサポートするi18nを使用してangular-5アプリケーションを作成しました。次に、サポートされている言語ごとにアプリの個別のバージョンをデプロイしました
-dist | ___ ja / | | __ index.html | ___ fr / | __ index.html
また、次のnginx構成を追加して、両方の言語でアプリケーションを提供しました。
server { root /var/www/dist; index index.html index.htm; server_name Host.local; 場所^ /(fr | en)/(。*)$ { try_files $ 2 $ 2//$1/index.html; } }
私がやりたかったのは、両方のアプリケーションに対応し、英語版とフランス語版を切り替えられるようにすることです。
たとえば、私がHost.local/en/something
切り替えた場合Host.local/fr/something
「something」ページのフランス語版を取得する必要があります。
私が共有したnginx構成では、アプリを閲覧するときにページを更新するたびに404 not foundエラーが表示され、アプリを個別に閲覧したり、アプリを切り替えたりすることもできません。
私は何を取りこぼしたか?それを達成するための適切なNginx confは何ですか?
iisでも同じことを行いました。最初に、「base-href」オプションを使用してアプリをビルドする必要があります。
ng build --output-path=dist/fr --prod --bh /fr/
ng build --output-path=dist/en --prod --bh /en/
そしてnginxのためにこの設定を使用してください
location /fr/ {
alias /var/www/dist/fr/;
try_files $uri$args $uri$args/ /fr/index.html;
}
location /en/ {
alias /var/www/dist/en/;
try_files $uri$args $uri$args/ /en/index.html;
}
/ en/somerouteから/ fr/somerouteへのナビゲーションでは、言語スイッチャーがあるコンポーネントの現在のルーターのURLを取得できます
getCurrentRoute() {
return this.router.url;
}
言語セレクタをクリックすると、選択した言語で同じルートにリダイレクトします。
<li *ngFor="let language of languages;let i=index" >
<a href="/{{language.lang}}/#{{getCurrentRoute()}}" (click)="changeLanguage(language.lang)">
{{language.lang}}
</a>
</li>
言語メソッドを変更する
changeLanguage(lang: string) {
const langs = ['en', 'fr'];
this.languages = this.allLanguages.filter((language) => {
return language.lang !== lang;
});
this.curentLanguage = this.allLanguages[langs.indexOf(lang)].name
localStorage.setItem('Language', lang);
if (isDevMode()) {
location.reload(true);
}
}
ビルドした後:
ng build --prod --base-href /fr/ --output-path dist/fr
ng build --prod --base-href /en/ --output-path dist/en
ビルドをnginx serveディレクトリにコピーします:
cp -r dist/* /usr/share/nginx/my-app
それから私は私のために働く2つの異なるNGINX設定を見つけました:
server {
root /usr/share/nginx/my-app;
location /en/ {
autoindex on;
try_files $uri$args $uri$args/ /en/index.html;
}
location /fr/ {
autoindex on;
try_files $uri$args $uri$args/ /fr/index.html;
}
# Default to FR
location / {
# Autoindex is disabled here + the $uri$args/ is missing from try_files
try_files $uri$args /fr/index.html;
}
}
server {
listen 80 default_server;
index index.html;
location /en/ {
alias /usr/share/nginx/my-app/en/;
try_files $uri$args $uri$args/ /en/index.html;
}
location /fr/ {
alias /usr/share/nginx/my-app/fr/;
try_files $uri$args $uri$args/ /fr/index.html;
}
# Default to FR
location / {
alias /usr/share/nginx/my-app/fr/;
try_files $uri$args $uri$args/ /fr/index.html;
}
}
注:ルートパスソリューションでは、autoindex on
オプションですが、$uri$args/
からtry_files
の部分も削除する必要があります。そうしないと、「 「[directory]」のディレクトリインデックスは禁止されているエラーです 」.
[〜#〜] fyi [〜#〜]:役立つと思います ROOTとALIASに関するすばらしい説明 。
Angular CLI: 6.0.7
Node: 8.11.2
Angular: 6.0.3
Angular 9には、すべての言語バージョンを一度にビルドする新しいオプションがあります。また、構成されたbaseHrefにロケールを追加することにより、アプリケーションの各バージョンのベースHREFを設定します。
ng build --prod --localize
次に、すべてのビルドをnginx serveディレクトリにコピーする必要があります
COPY /dist/my-app/ /usr/share/nginx/my-app/
そして、前の回答に示されているようにnginxを構成します。
http://nginx.org/r/try_files が機能する方法には、よくある誤解があります。ドキュメント(上記のリンクから)をよく見ると、_try_files
_ディレクティブの最初と中間のパラメーターのタイプは「file」ですが、最後のパラメーターは「uri」と呼ばれています。これは、あなたの場合、 http://nginx.org/r/location を修正して正規表現を適切に処理するためです(location
コードに_~
_がありません)修飾子)、コメントで確認すると、無限ループになる可能性があります。
一般的に、正規表現をnginxで使用することはお勧めできません。正規表現の使用を回避できる単純な状況で最大のパフォーマンスを得るため、英語とフランス語にそれぞれ1つずつ、2つの独立した場所を用意することをお勧めします。
_location /fr/ {
try_files $uri /fr/index.html =410;
}
location /en/ {
try_files $uri /en/index.html =410;
}
_
上記のコードは、webappフロントエンド自体から正しいURL処理を実行することを前提としていることに注意してください。特定のリソースが_/en/
_バージョンと_/fr/
_バージョン間で共有されている場合、_/
_ベース、_/en/
_または_/fr/
_指定子なし。コードの_=410
_部分は、_=404
_と同じように動作しますが、エラーがわずかに異なり、どのディレクティブがエラーの原因であるかをデバッグしやすくなっています。