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 для автоматического определения локали, связанной с запросом, и динамического преобразования запроса, чтобы включить его способом, описанным выше.
Спасибо
1 ответ
Объясните мне, почему моя конфигурация не дала ожидаемого эффекта, чтобы я мог понять это и не повторять те же ошибки в будущем
location ^/en/(.*)
не является действительной директивой.
Вы могли быть смущены с location ^~ /en/(.*)
, Это соответствует любому запросу, начинающемуся с /en/
с чем угодно
На самом деле, запрос всегда соответствует location /
директива, так что он вводит вас в бесконечный цикл.
Предложите решение, которое работает и, если возможно, улучшит мою конфигурацию.
Просто используйте префикс Path внутри location
директива:
location /en/ {
try_files $uri $uri/ =404;
}
location / {
return 301 /en$uri;
}