Почему cflocation удаляет символы и не посещает URL-адрес?

У меня есть URL-адрес, который хранится как:

<cfset VisitURL = 'http://www.toysexample.com/search.aspx?searchBox=christmasgifts≠Sort=high&search=new' />

(Приведенная выше строка URL-адреса фактически исходит из поля базы данных, которое я не контролирую)

Когда я прошу cflocation перейти по указанному выше URL-адресу, вот так:

<cflocation url="#EncodeForURL(VisitURL)#" addtoken="no" />

Он посещает URL-адрес как подпапку на моем сайте. Итак, я перехожу к URL http://www.volumeoneexample.com/http:/www.toysexample.com/search.aspx?searchBox=christmasgifts≠Sort=high&search=new

Как вы можете видеть, он убрал одну из косых черт в части http://, а также добавил URL-адрес как папку на моем сайте. Я не понимаю, зачем он это делает?


person volume one    schedule 14.11.2016    source источник
comment
почему вы используете EncodeForUrl () ?. Кроме того, что со специальным символом между рождественскими подарками и сортировкой в ​​строке запроса URL .. рождественские подарки ≠ Сортировка. Можете ли вы попробовать удалить EncodeURL и этот специальный символ и повторить попытку?   -  person Sanjeev    schedule 14.11.2016
comment
@Sanjeev Этот особый персонаж ДОЛЖЕН существовать. Это не URL-адрес моего сайта, а сторонний. Без него URL-адрес недоступен. Единственный способ сохранить специальный символ в URL-адресе - это использовать EncodeForURL, иначе он будет удален.   -  person volume one    schedule 14.11.2016
comment
не кодируйте весь URL, кодируйте только param values ​​.   -  person Kevin B    schedule 14.11.2016
comment
Пожалуйста, используйте URLEncodedFormat (), чем EncodeForURL ()   -  person Sanjeev    schedule 14.11.2016
comment
@KevinB Я не могу. Весь URL-адрес хранится в поле столбца базы данных. Я не могу разделить строку URL.   -  person volume one    schedule 14.11.2016
comment
Затем закодируйте его, прежде чем он войдет. В любом случае он должен быть правильно закодирован отдельно. Вы не можете закодировать все это.   -  person Kevin B    schedule 14.11.2016
comment
Почему голос против? @KevinB Почему я не могу все кодировать? Просто интересуюсь.   -  person volume one    schedule 14.11.2016
comment
Потому что тем самым вы сделаете URL недействительным.   -  person Kevin B    schedule 14.11.2016
comment
Вы можете использовать функции списка, чтобы отделить URL-адрес от строки запроса.   -  person Dan Bracuk    schedule 14.11.2016
comment
вам нужно будет разделить каждый URL-адрес на первый ?, затем разделить оставшийся на первом = после начала или после &, а затем закодировать каждое из значений. тогда вам придется собрать все это вместе.   -  person Kevin B    schedule 14.11.2016
comment
@Sanjeev URLEncodedFormat() - это так CF 9. EncodeForURL() - это новая популярность. Действуй сейчас. HTMLEditFormat() и JSStringFormat() также устарели в пользу новых EncodeFor* функций контекстного кодирования.   -  person Adrian J. Moreno    schedule 14.11.2016
comment
@KevinB, если я просто делаю это <cflocation url="#VisitURL#" addtoken="no" />, тогда почему ColdFusion правильно посещает URL-адрес, но удаляет символ ? Почему он не может просто посетить данную ему строку?   -  person volume one    schedule 15.11.2016
comment
Что произойдет из любопытства, если вы скопируете и вставите этот URL-адрес в адресную строку браузера?   -  person Dan Bracuk    schedule 15.11.2016
comment
@volumeone, потому что строка недействительна. мы это уже прошли!   -  person Kevin B    schedule 15.11.2016
comment
@DanBracuk, он отлично работает, если я это сделаю. его просто ТОЧНАЯ такая же строка по какой-то причине лишается символов в теге cflocation. Я чувствую, что этого не должно происходить.   -  person volume one    schedule 16.11.2016
comment
@KevinB, как это может быть недействительным URL-адресом, если он работает нормально, когда я посещаю его через браузер?   -  person volume one    schedule 16.11.2016
comment
Это действительно до тех пор, пока вы не закодируете его ... Боже, похоже, я разговариваю со стеной. недопустимый - это значение параметра.   -  person Kevin B    schedule 16.11.2016
comment
@KevinB Я не кодирую! Я просто сказал, что если я сделаю это <cflocation url="#VisitURL#" addtoken="no" />, где кодирование НЕ выполняется, тег cflocation по-прежнему удаляет символ , но ту же строку URL-адреса, которая находится в #VisitURL#, можно легко посетить с помощью любого браузера.   -  person volume one    schedule 16.11.2016
comment
Верно, потому что символ ≠ нужно закодировать. Chrome исправляет это за вас.   -  person Kevin B    schedule 16.11.2016
comment
@KevinB, ладно, я этого не осознавал. попытка разбить URL-адрес и собрать его снова не сработала, но это сработало: <cflocation url="#DecodeFromURL(EncodeForURL(VisitURL))#" addtoken="no" /> на данный момент. Думаю, это не лучший / правильный способ.   -  person volume one    schedule 16.11.2016


Ответы (1)


Как упоминалось в комментариях, вы «чрезмерно кодируете». EncodeForURL () должен быть только в параметрах URL.

Поскольку вы не можете получить URL-адрес и параметры по отдельности, вы можете рассматривать их как список.

<cflocation url="#ListFirst(VisitURL,"?")#?#EncodeForURL(ListRest(VisitURL,"?"))#" />

Если что-то станет немного шатким, вам нужно будет проделать больше манипуляций, чем это.

person ale    schedule 14.11.2016
comment
если я просто сделаю это <cflocation url="#VisitURL#" addtoken="no" />, тогда почему ColdFusion посещает URL-адрес, но удаляет символ ? Почему он не может просто посетить данную ему строку? - person volume one; 15.11.2016
comment
Вероятно, потому что это недопустимый символ для URL-адреса, поэтому его необходимо закодировать. - person ale; 15.11.2016
comment
Я просто попробовал <cflocation url="#DecodeFromURL(EncodeForURL(VisitURL))#" addtoken="no" />, и, похоже, он работает нормально, но я бы предпочел не делать ничего из этого и заставлять cflocation перейти к указанной строке, а не делать свое дело и вырезать символы! - person volume one; 15.11.2016