这是PHP。
我做
header("Location: " . $url)
并且效果很好。但如果我这样做
header("Location: " . urlencode($url))
我被重定向到某个奇怪的地方,比如$ url / $ url,当然给了我404.
但我确实想要urlencode我的网址,因为它是由用户提供的数据组成的。我该怎么做?我可以打破它“http://”和“其余”,只有urlencode“其余的”?
在这种情况下推荐的做法是什么?
由于
答案 0 :(得分:5)
但我确实想要urlencode我的网址,因为它是由用户提供的数据
解决方案是不对完整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()的情况下工作!)可能会在您的代码中进一步提升。
答案 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']) . "¶m2=" . urlencode($qry_parsed(['param2'])
header("Location: $encurl");
exit();