Назад | Перейти на главную страницу

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/

Может кто-нибудь, пожалуйста:

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

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

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

Спасибо

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

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

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

Собственно, запрос всегда соответствует location / директиву, так что вы попадете в бесконечный цикл.

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

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

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

location / {
   return 301 /en$uri;
}