1 次重写或内部重定向循环,同时内部重定向至“/en/index.html”

1 次重写或内部重定向循环,同时内部重定向至“/en/index.html”

我想使用 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_filestry_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 将默认附加语言代码。deAccept-Languageen

    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/enhttp://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 错误。

相关内容