Я пытаюсь добиться чего-то с помощью 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;
}