Рейтинг:1

Использование URL-адресов со специальными символами в картах nginx

флаг in

При использовании nginx и карт можно переписать несколько URL-адресов с помощью файла карты. Проблема заключается в том, что URL-адрес содержит специальные символы. Я ломал голову, пытаясь понять это правильно, и надеюсь, что этот вопрос / решение может спасти других от седых волос.

Давайте установим сценарий.

Сервер Linux (Debian/Ubuntu) со стандартным nginx. DNS, указывающий на этот сервер, который разрешается в конфигурацию сервера. Карта, не содержащая повторяющихся записей с входящими и исходящими URL-адресами (разрешимая)

Настройка карты будет содержать следующее:

карта $host$request_uri $rewrite_uri {
    include /<путь к файлу имя файла>;
}

сам файл карты содержит по одной записи в строке, заканчивающейся точкой с запятой.

example.com/Böhme https://anotherexample.org/SomeWeirdPath/Böhme;

Конфигурация сервера для работы этого сопоставления

сервер {
    слушать 443 ssl http2;
    ssl_certificate /<абсолютный путь к файлу crt>;
    ssl_certificate_key /<абсолютный путь к файлу ключа>;
    имя_сервера пример.com;
    proxy_set_header X-Forwarded-For $remote_addr;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_dhparam <абсолютный путь к ключу Диффи-Хеллмана>;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
    server_tokens отключены;
    если ($rewrite_uri) {
            переписать ^ $rewrite_uri перенаправить;
    }
    переписать ^ <URL по умолчанию> перенаправить;
}

Я упростил конфигурацию этой конфигурации сервера, чтобы мы могли сосредоточиться на настройках карты.Конфигурация предполагает, что домен будет использовать SSL и сертификат действителен. Оператор if будет выполняться только в том случае, если $host$request_uri находится в списке с $rewrite_uri, в противном случае будет выполнена последняя перезапись.

Вопрос

Как преобразовать $request_uri, чтобы nginx правильно его понял? Файл карты содержит значение в UTF8, но кажется, что nginx хочет, чтобы URL-адрес $request_uri был закодирован и в шестнадцатеричном формате.

$request_uri как в файле карты

example.com/Böhme

$request_uri URLEncoded в соответствии с браузером

example.com/B%C3%B6hme

$request_uri, как я думаю, этого хочет nginx

example.com/B\xC3\xB6hme

Кажется, я не могу найти системный пакет с этой функцией, но я думаю, что начинаю заново изобретать велосипед.

Мне нужно:

создайте функцию, которая будет кодировать URL-адрес списка, согласно Как декодировать строку в кодировке URL в оболочке?

function urldecode() { local i="${*//+/}"; echo -e "${i//%/\x}"; }

а затем используйте дамп Octal согласно Преобразование строки в шестнадцатеричное в командной строке, поэтому сегмент карты создается в памяти с правильными значениями для если тест заявления.

Это начинает походить на ракетостроение, и я не могу поверить, что никто еще не решил эту проблему раньше, я просто не могу найти решение.

Ivan Shatsky avatar
флаг gr
Ознакомьтесь со статьей [Сопоставление символов, отличных от ASCII, в расположении NGiNX] (https://blog.rabin.io/quick-tip/matching-non-ascii-characters-in-nginx-location) и ссылками, на которые она ссылается.
флаг us
Я думаю, что вы неправильно используете термин URN здесь. Здесь следует использовать термин URI. URN — это глобально уникальный идентификатор ресурса, а компонент пути URL-адреса не является глобально уникальным.
флаг in
@TeroKilkanen точка зрения принята, тема изменена в соответствии с просьбой ... хотя все еще не могу ее решить, но я не сдаюсь. Это пока уходит на второй план...

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.