将 Nginx 根目录重定向到子目录而不导致重定向循环

将 Nginx 根目录重定向到子目录而不导致重定向循环

我正在尝试设置我的 nginx 服务器来执行以下操作:

  1. 将 www 重定向到非 www

  2. 当浏览器地址栏显示时,从 en 文件夹提供 foo.htm 文件https://domain.com/en/foo对于以下所有 URL:

    • http://domain.com/en/foo
    • https://domain.com/en/foo
    • http://domain.com/en/foo/
    • https://domain.com/en/foo/
    • http://domain.com/en/foo.htm
    • https://domain.com/en/foo.htm
    • http://domain.com/en/foo.html
    • https://domain.com/en/foo.html
    • http://domain.com/en/foo.[any extension]
    • https://domain.com/en/foo.[any extension]
  3. 将根域重定向到子文件夹:https://domain.com/->https://domain.com/de

到目前为止,我设法完成了 1. 和 2 的某些部分。每当我尝试设置 3. 时,我都会得到一个重定向循环

我的配置文件如下所示:

http {

    server {
        listen 80;
        server_name www.domain.com;
        return 301 $scheme://domain.com$request_uri;
    }

    server {
        listen       80;
        server_name  domain.com;

        location / {
            root /srv/www/domain.com/;
            index  index.html index.htm;
            try_files $uri.htm $uri/ =404;
            # the following line causes redirect loop:
            rewrite ^ example.com/de permanent;
        }

        # redirect server error pages to the static page /50x.html
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

我究竟做错了什么?

答案1

这会导致重定向循环,因为即使 URL 是http://example.com/de

rewrite ^ example.com/de permanent;

如果你只是想重定向http://example.com到子文件夹,您可以按照@sendmoreinfo 方式:

创建一个单独的位置 = / 并在那里执行(3)。

如果你想将所有内容重定向到/de:

if ($request_uri !~ /de/) {
    rewrite ^ http://example.com/de permanent;
}

希望这有帮助。

相关内容