#go
#Вперед
Вопрос:
Похоже, что golang reverseproxy дважды экранирует URL при выполнении HTTP-запроса,
сервер получает:
/id/EbnfwIoiiXbtr6Ec44sfedeEsjrf0RcXkJneYukTXa%252BIFVla4ZdfRiMzfh%252FEGs7f
ожидаемый:
/id/EbnfwIoiiXbtr6Ec44sfedeEsjrf0RcXkJneYukTXa%2BIFVla4ZdfRiMzfh%2FEGs7f
Есть ли способ избежать двойного экранирования?
Комментарии:
1. Я выполняю прокси-передачу и хочу передать путь URL как есть.
/id/EbnfwIoiiXbtr6Ec44sfedeEsjrf0RcXkJneYukTXa+IFVla4ZdfRiMzfh/EGs7f
является допустимым URL, не уверен, почему он дважды экранируется? Если я декодирую URL, это становится неправильным URL, не так ли?/id/EbnfwIoiiXbtr6Ec44sfedeEsjrf0RcXkJneYukTXa IFVla4ZdfRiMzfh/EGs7f
2. Хорошо, я использую echo framework ( github.com/labstack/echo ), и я в основном хочу добавить токен OAuth иметь динамическое отображение маршрутизации в моем оркестраторе с использованием прокси с перезаписью ( echo.labstack.com/middleware/rewrite ). Однако у меня есть некоторые URL-адреса, подобные упомянутым выше, и они дважды экранируются go http при выполнении обратного прокси-вызова.
3. @MuffinTop — Да, цель состоит в том, чтобы выполнить вызов с помощью URI
/id/EbnfwIoiiXbtr6Ec44sfedeEsjrf0RcXkJneYukTXa+IFVla4ZdfRiMzfh/EGs7f
4. Для всех, у кого была аналогичная проблема с двойным экранированием в обратном прокси, эта проблема была исправлена в go 1.1.5. Более подробная информация здесь github.com/golang/go/issues/41082#issuecomment-682283012
Ответ №1:
Go — это не двойное экранирование URL. Он создает URL-адрес с учетом значений, которые вы ему дали (что означает экранирование пути). Вы уже экранировали путь. Не делайте этого. Если вы хотите отправить
, то используйте
. Go правильно экранирует его.
Если по какой-либо причине у вас уже есть экранированный путь, отмените его с помощью url.PathUnescape()
перед созданием URL.
Комментарии:
1. Что, если путь имеет косую черту
/
?2. @ArunGopalpuri Я не понимаю вопроса. Косая черта — это обычный символ для пути.
3. Все, что я пытаюсь сделать, это создать прокси и передать путь как есть на другой сервер. Итак, скажем, я хочу передать
/foo/bar
как путь, но сервер на другом конце получает/foo%2fbar
4. Это очень необычно.
/foo/bar
должно интерпретироваться идентично/foo/bar
в соответствии с большинством спецификаций. Ваша система не интерпретирует / стандартным способом? Почему первый/
отправляется в необработанном виде, а второй кодируется в процентах?5. Это был просто пример. В моем случае это системный идентификатор в качестве параметра пути (к сожалению, он небезопасен для URL, т. Е. Состоит из косых черт и хэша), поэтому я передаю его в кодировке URL как
/id/EbnfwIoiiXbtr6Ec44sfedeEsjrf0RcXkJneYukTXa+IFVla4ZdfRiMzfh/EGs7f
, но сервер, получающий его на другом конце, получает его как/id/EbnfwIoiiXbtr6Ec44sfedeEsjrf0RcXkJneYukTXa%2BIFVla4ZdfRiMzfh%2FEGs7f