Всем привет.
Заметил такую штуку, что если я передаю строку через GET:
?server=Super Server + GF -
Я в php вывожу значение $_GET['server'], и получаю:
Super Server GF -
Получается, что php сам делает urldecode(), при выводе $_GET, и как положено заменяет + на пробел.
Но вот вопрос, это настройка какая - то, или особенность php? Или это настраивается в Apache?
Просто сейчас, что бы мне передать в GET знак + - мне нужно через JS сделать:
encodeURIComponent('Super Server + GF -')// Super%20Server%20%2B%20GF%20-
И только в таком случае, php мне выведет:
Super Server + GF -
Если передать в GET:
&test=a+a
При выводе мы получим:
echo $_GET['test'];//a a
echo urldecode( $_GET['test'] );//a a
Получается, что php все-таки декодирует строку запроса...
И я вот не понимаю, это браузер декодирует строку и передает её на сервер, или сервер декодирует строку?
Сервер не кодирует GET, POST, PUT, etc... запросы, мы собираем и в ручную, а после этого браузер формирует тело запроса, автоматически добавляет нужные заголовки и посылает на сервер.
Нам нужно кодировать параметры самим.
В вашем случае когда вы отправляете не кодированную строку вида:
?server=Super Server + GF -
Браузер видит + и заменяет на пробел, так как все пробелы это +, а +-пробел или %20.
По этому если на сервере, сделать так:
urlencode($_GET['server]);
Мы получим:
Super+Server+++GF+-
А если так:
rawurlencode($_GET['server']);
Мы получим:
Super%20Server%20%20%20GF%20-
А если отправляем так:
encodeURIComponent('Super Server + GF -')
То уже нужно сделать так:
rawurldecode($_GET['server'])
Получаем:
Super Server + GF -
То, что нам было нужно, а вообще советую более детально изучить спецификацию кодирование и декодирование строк.
А так-же почитайте в чем отличие между js encodeURI и encodeURIComponent, а так-же в php urldecode и rawurldecode.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей