Я хотел бы обратиться к более новому ответу на основе регулярных выражений, популярность которого растет.
location ~ ^/en(/?)(.*)$ { # OOPS!
proxy_pass http://luscious/$2$is_args$args; # OOPS!
}
На первый взгляд, решение может показаться более симпатичным, но оно ошибочно по нескольким причинам.
Вышеупомянутое регулярное выражение будет соответствовать uri запроса /enjoy, перенаправляя его в /joyапстрим. Это действительно предназначено?
Запрос на /enне приведет к каким-либо перенаправлениям, непосредственно обслуживающим /от восходящего (почти как если бы запрос /en/был сделан вместо, но не совсем). Если вы используете относительные URI в своей корневой странице вверх по течению (иначе, почему бы вам не иметь /en/префикс прямо там, в восходящем URI?), Например src="style.css"(который может ссылаться на язык url("menu.png"), например), то браузер запросит как /style.cssвместо /en/style.css. (Или даже если вы везде используете абсолютные URI, что если кто-то ссылается на неясный полуобязательный ресурс относительно?) Ой, вдруг сайт может не работать, но только иногда или в крайних случаях.
Согласно моему предыдущему совету по другому вопросу, уже упомянутому в собственном ответе OP , использование регулярных выражений не дает proxy_redirectдирективе иметь значение по умолчанию default- offвместо этого ее значение уменьшается . Это означает, что если обратный поток ответит, Location: http://127.0.0.1:8080/en/dir/когда сделан запрос /en/dir, то это то, что увидит клиент, что, очевидно, не будет работать правильно. (Что было бы особенно иронично для /enзапроса, который в первую очередь побуждает использовать регулярные выражения, но эта конкретная реализация вместо этого страдает от другой проблемы, как уже упоминалось выше.) Плюс, если вы уже используетеupstreamДиректива, тогда это может стать очень уродливым, если вы просто попытаетесь использовать пользовательский, особенно если у вас может быть более одного вышестоящего сервера - как у вас есть отдельный proxy_redirectдля каждого из них? Вы также можете использовать регулярные выражения внутри proxy_redirect, возможно, даже для соответствия любому хосту, но что тогда, если вы решите дать междоменное перенаправление в будущем?
Чтобы попытаться обратиться к некоторым из указанных выше пунктов с помощью одного местоположения на основе регулярных выражений, мы могли бы сделать следующее (обратите внимание, что proxy_passнам также пришлось отбросить ссылку на сервер из upstreamдирективы на основе, чтобы сделать его proxy_redirectболее простым):
location ~ ^/en/?((?<=/).*)?$ {
location = /en { return 302 /en/; }
proxy_pass http://127.0.0.1:8080/$1$is_args$args;
proxy_redirect http://127.0.0.1:8080/ /en/;
}
Так что, если вы спросите меня, оригинальное решение с двумя соседними местоположениями верхнего уровня все равно будет лучшей идеей, чем копаться в кроличьей норе, переходя вместо этого в маршрут регулярных выражений.