Директива rewrite работает с URI запроса без аргументов, аргументы - по умолчанию сохраняются от исходного запроса. Цитата из документации:
Если в строке замены указаны новые аргументы запроса, то предыдущие аргументы запроса добавляются после них. Если такое поведение нежелательно, можно отказаться от этого добавления, указав в конце строки замены знак вопроса, например:
rewrite ^/users/(.*)$ /show?user=$1? last;
Что касается ...?34344?ewewewe
в одном случае, и ...?34344&ewewewe
в другом, то в обоих приведённых случаях результат будет ...?34344?ewewewe
. Результат ...?34344&ewewewe
можно получить, если символ ?
будет непосредственно в строке замены (во втором агрументе rewrite):
set $red_www_to_www "/ru/ru/arg";
rewrite ^ https://$host$red_www_to_www?34344 permanent;
Это связано с тем, что nginx не пытается искать символ '?' внутри подставляемых переменных, а рассматривает их как часть соответствующей части URL. Если же символ '?' используется явно в строке замены, то nginx знает, что в строке замены есть аргументы, и добавляет к ним исходные аргументы запроса через символ '&'.
Вообще в рассматриваемом случае - проще и правильнее всего вместо rewrite
использовать директиву return
:
return 301 https://$host$red_www_to_www;
Директива return
предназначена для возврата клиенту ровно того, что просили вернуть, а не для замены частей URI, и соответственно не пытается как-либо обрабатывать и дополнять переданную ей строку.