Можно ли кодировать значение в заголовке (Location: value)? - PullRequest
4 голосов
/ 23 февраля 2011

Это PHP.

Я делаю

header("Location: " . $url)

и прекрасно работает. Но если я сделаю

header("Location: " . urlencode($url))

Я перенаправлен в какое-то странное место, например, $ url / $ url, что, конечно, дает мне 404.

Но я хочу урленкодировать мой URL, потому что он сделан из предоставленных пользователем данных. Как мне это сделать? Могу ли я сломать его "http://" и" остальные "и только urlencode" остальные "?

Какая практика рекомендуется в этой ситуации?

Спасибо

Ответы [ 2 ]

5 голосов
/ 23 февраля 2011

Но я хочу urlencode моего URL, потому что он сделан из предоставленных пользователем данных

Решение состоит в том, чтобы не кодировать полный URL-адрес, кодировать только те биты, которые необходимо кодировать. Простое кодирование «остального» также обязательно будет неудачным. Например, в этом примере все косые черты, ? и = должны оставаться неизменными:

http://www.example.com/rewritten directory/index.php?id=Hello World, how are you?

но вам нужно кодировать rewritten directory и Hello World, how are you? для того, чтобы все это сформировало действительный URL.

Как и в случае кодировок символов, вам нужно с самого начала убедиться, что вы знаете, как это кодируется. Решение вашей проблемы (если она вообще есть - header(), скорее всего, будет работать без urlencode () в первую очередь!), Вероятно, будет дальше в вашем коде.

2 голосов
/ 23 февраля 2011

Чтобы разбить URL на «http://"» и «остальные», как вы предлагали, см. PHP * parse_url() и parse_str() функции.

РЕДАКТИРОВАТЬ: предполагается, что вы знаете, какими будут параметры строки запроса, например, param1, param2

$url_parsed = parse_url($url);
$qry_parsed = array();
parse_str($url_parsed['query'], $qry_parsed);
$encurl = "{$url_parsed['scheme']}{$url_parsed['host']}{$url_parsed['path']}?param1=" . urlencode($qry_parsed['param1']) . "&param2=" . urlencode($qry_parsed(['param2'])

header("Location: $encurl");
exit();
...