#nginx #url-rewriting
#nginx #перезапись url
Вопрос:
У меня ситуация, когда мне нужно добавить код страны ко всем запросам в nginx.
Например, если пользователь обращается http://example.com:3333/html/about , тогда я должен перенаправить (используя rewrite в nginx) на http://example.com:3333/html/about?country_code=en
У меня есть следующая перезапись, но я получаю «слишком много циклов».
rewrite ^(.*)$ http://$host:3333/$1?country_code=en last;
Как мне это исправить?
nginx.conf
server {
### USA specific config ###
if ($geoip_country_code = US) {
# do something here for USA visitors;
# root path /var/www/html/content/usa/;
rewrite ^(.*)$ http://$host:3333/$1?country_code=en last;
}
}
Ответ №1:
if ($geoip_country_code = US) {
set $test "US";
}
if ($arg_country_code != 'en') {
set $test "{$test}_R";
}
if ($test = 'US_R') {
rewrite ^(.*)$ http://$host:3333/$1?country_code=en last;
}
Комментарии:
1. @Timofey Stolbov // Извините, я забыл поставить последнюю точку в своем сообщении. На самом деле у меня есть last в моем исходном коде.
2. @Timofey Stolbov // прекрасно!!! это работает!! хм .. последний вопрос.. возможно ли скрыть ?country_code=ru для пользователей? в конечном итоге я хочу использовать чистый URL
3. @Moon Если этот сервер прослушивает порт 3333, вы можете попробовать
rewrite ^(.*) $1?country_code=en last;
Но я вижу слишком мало nginx.conf, чтобы быть уверенным.
Ответ №2:
Попробуйте это:
оригинал:
rewrite ^(.*)$ http://$host:3333/$1?country_code=en
новое:
rewrite ^(.*)(?!?country_code=[a-z][a-z])$ http://$host:3333/$1?country_code=en
Я предполагаю, что nginx поддерживает утверждения с отрицательным прогнозом, используя общий (?!...)
синтаксис. Отрицательный прогноз говорит о том, что совпадение (и перезапись) должно произойти, когда в конце URL-адреса ?country_code=nn
нет переменной. (Если она находится в середине URL-адреса, эта перезапись все равно произойдет.)
Комментарии:
1. // спасибо за ответ. Могу ли я сделать это, не проверяя, содержит ли запрос уже country или нет? если я сделаю то, что вы предложили, пользователи смогут отправлять код страны вручную, чтобы переопределить код страны.