我想使用 Nginx 代理托管 Angular i18n 网站。
按照官方的 Nginx 配置建议https://angular.io/guide/i18n-common-deploy#nginx-example,我的目录app.conf
中的文件/etc/nginx/site-available
就像
map $http_accept_language $accept_language {
~*^de de;
~*^fr fr;
~*^en en;
}
server {
listen 80;
server_name i18n.example.io;
root /var/www/html/app/dist/app;
# Fallback to default language if no preference defined by browser
if ($accept_language ~ "^$") {
set $accept_language "en";
}
# Redirect "/" to Angular application in the preferred language of the browser
rewrite ^/$ /$accept_language permanent;
# Everything under the Angular application is always redirected to Angular in the
# correct language
location ~ ^/(fr|de|en) {
try_files $uri /$1/index.html?$args;
}
}
但是当我尝试访问我的网站时,文件http://i18n.example.com
中出现以下错误error.log
2022/07/15 20:19:15 [error] 16886#16886: *1 rewrite or internal redirection cycle while internally redirecting to "/en/index.html", client: xx.xxx.235.xx, server: i18n.example.io, request: "GET /en HTTP/1.1", host: "i18n.example.io"
答案1
您可以修改
try_files
为try_files $uri /$1/index.html?$args =404;
,重新启动 nginx,然后重试吗?
不,它给了
404 Not Found
。
map $http_accept_language $accept_language { ~*^de de; ~*^fr fr; ~*^en en; } server { ... root /var/www/html/app/dist/app; ... if ($accept_language ~ "^$") { set $accept_language "en"; }
根据您的配置,当您使用 URL 向 nginx 发送请求时http://i18n.example.com
,nginx 将尝试根据您的用户代理发送的 HTTP 标头附加语言代码( en
/ fr
/ ) 。当不存在这样的标头时,nginx 将默认附加语言代码。de
Accept-Language
en
rewrite ^/$ /$accept_language permanent; location ~ ^/(fr|de|en) { try_files $uri /$1/index.html?$args; }
然后 nginx 执行内部重定向http://i18n.example.com/<language code>
并评估location ~ ^/(fr|de|en)
成功。
例如,让我们使用en
语言代码,那么内部重定向指向http://i18n.example.com/en
。
使用此 URI 和您的try_files $uri /$1/index.html?$args
配置,nginx 将尝试访问http://i18n.example.com/en
和http://i18n.example.com/en/index.html?<argument>
;分别转换为/var/www/html/app/dist/app/en
和/var/www/html/app/dist/app/en/index.html
。
如果不存在这样的文件(这在您当前情况下发生),您location ~ ^/(fr|de|en)
将再次被重新触发,因为有两个请求/en
。这将在 nginx 内部创建重定向循环,并且它将通过发送错误来摆脱循环。
要解决这个问题,请检查是否有/var/www/html/app/dist/app/en/index.html
可用且可由 nginx 读取的文件,或者将其添加=404
到您的try_files
配置中以使其正常失败为 404 错误。