Changes between Initial Version and Version 1 of Ticket #1584


Ignore:
Timestamp:
06/28/18 15:47:46 (6 years ago)
Author:
Maxim Dounin
Comment:

Директива 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, и соответственно не пытается как-либо обрабатывать и дополнять переданную ей строку.

Legend:

Unmodified
Added
Removed
Modified
  • Ticket #1584

    • Property Status newclosed
    • Property Resolutioninvalid
  • Ticket #1584 – Description

    initial v1  
     1{{{
    12        map $uri$is_args$args $red_www_to_www {
    23                default 1;
     
    89                https://$host$red_www_to_www permanent; break; }
    910        }
     11}}}
    1012При таких настройках происходит это
    1113https://www.host.ru/test/?ewewewe > https://www.host.ru/ru/ru/arg?34344?ewewewe
     
    1517
    1618А если сделать так.
     19{{{
    1720server {
    1821        listen        80 default;
     
    2326                https://$host$red_www_to_www permanent; break; }
    2427        }
     28}}}
    2529При таких настройках происходит это
    2630https://www.host.ru/test/?ewewewe > https://www.host.ru/ru/ru/arg?34344&ewewewe