Как отключить двойной экранирующий URL в golang?

#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