Я хотел бы обратиться к более новому ответу на основе регулярных выражений, популярность которого растет.
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/;
}
Так что, если вы спросите меня, оригинальное решение с двумя соседними местоположениями верхнего уровня все равно будет лучшей идеей, чем копаться в кроличьей норе, переходя вместо этого в маршрут регулярных выражений.