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