При использовании 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 согласно Преобразование строки в шестнадцатеричное в командной строке, поэтому сегмент карты создается в памяти с правильными значениями для если тест заявления.
Это начинает походить на ракетостроение, и я не могу поверить, что никто еще не решил эту проблему раньше, я просто не могу найти решение.