как добавлять переменную к каждому запросу в nginx?

#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 или нет? если я сделаю то, что вы предложили, пользователи смогут отправлять код страны вручную, чтобы переопределить код страны.