Nginx: перенаправление URL-адреса с целью всегда включать префикс локали

Nginx: перенаправление URL-адреса с целью всегда включать префикс локали

Я пытаюсь добиться чего-то с помощью nginx и правил перенаправления, и это кажется довольно простым делом, но я столкнулся с камнем преткновения.

Просмотрев множество вопросов и ответов, я так и не смог найти решение, которое бы мне подошло.

Я хочу добиться следующего:

Если кто-то перейдет на мой сайт по любому из следующих URL-адресов:

http://mywebsite.com
http://mywebsite.com/
http://mywebsite.com/foo

человек будет перенаправлен по адресу:

http://mywebsite.com/en/
http://mywebsite.com/en/
http://mywebsite.com/en/foo/

Вот что у меня есть в файле конфигурации nginx на данный момент в том порядке, в котором они у меня в файле:

location ^/en/(.*) {
    try_files $uri /index.php$is_args$args last;
}

location / {
    if ( $uri !~ ^/(index\.php|css|jpg|png|images|core|uploads|js|robots\.txt|favicon\.ico) ) {
        return 301 /en/$uri;
    }
}

Однако при использовании указанной выше конфигурации я сталкиваюсь с бесконечным циклом перенаправления, и URL-адрес в адресной строке выглядит следующим образом, прежде чем сервер сдастся:

http://mywebsite.com/en//en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/

Кто-нибудь может пожалуйста:

а) Объясните мне, почему моя конфигурация не дала ожидаемого эффекта, чтобы я мог это понять и не повторять те же ошибки в будущем.

б) Предложить работающее решение и, если возможно, улучшить мою конфигурацию

в) Если возможно, расскажите подробнее и объясните на примерах, как заставить nginx автоматически определять локаль, связанную с запросом, и динамически преобразовывать запрос, чтобы включить ее описанным выше способом.

Спасибо

решение1

Объясните мне, почему моя конфигурация не дала ожидаемого эффекта, чтобы я мог это понять и не повторять те же ошибки в будущем.

location ^/en/(.*)не является действительной директивой.

Вас могли спутать с location ^~ /en/(.*). Это соответствует любому запросу, начинающемуся с , /en/за которым следует что-либо.

На самом деле запрос всегда соответствует location /директиве, так что это приводит вас к бесконечному циклу.

Предложите работающее решение и, если возможно, улучшите мою конфигурацию.

Просто используйте префикс Path внутри locationдирективы:

location /en/ {
   try_files $uri $uri/ =404;
}

location / {
   return 301 /en$uri;
}

Связанный контент