可以在urlen中对urlencode(位置:值)中的值进行编码吗?

时间:2011-02-23 00:54:50

标签: php header urlencode

这是PHP。

我做

header("Location: " . $url)

并且效果很好。但如果我这样做

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

我被重定向到某个奇怪的地方,比如$ url / $ url,当然给了我404.

但我确实想要urlencode我的网址,因为它是由用户提供的数据组成的。我该怎么做?我可以打破它“http://”和“其余”,只有urlencode“其余的”?

在这种情况下推荐的做法是什么?

由于

2 个答案:

答案 0 :(得分:5)

  

但我确实想要urlencode我的网址,因为它是由用户提供的数据

解决方案是不对完整URL进行编码,仅编码需要编码的位。只编码“其余”也必然会失败。例如,在此示例中,所有斜杠,?=必须保持不变:

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

但您需要对rewritten directoryHello World, how are you?进行编码 为了使整个事物形成有效的URL。

与字符编码一样,您需要确保从一开始就知道编码的方式。问题的解决方案(如果有一个 - header()可能在没有urlencode()的情况下工作!)可能会在您的代码中进一步提升。

答案 1 :(得分:2)

要按照您的建议将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();