在PHP中将复杂的URL作为参数传递

11

我试图将复杂的URL作为URL参数传递,但如果URL中包含&,则会出现问题,例如我想将以下链接作为参数传递

http://www.google.ps/search?hl=en&client=firefox-a&hs=42F&rls=org.mozilla%3Aen-US%3Aofficial&q=The+type+%27Microsoft.Practices.ObjectBuilder.Locator%27+is+defined+in+an+assembly+that+is+not+referenced.+You+must+add+a+reference+to+assembly+&aq=f&aqi=&aql=&oq=

我正在尝试从用户获取URL作为参数,并将用户重定向到这个URL。

我应该如何在PHP中处理此问题?


整个故事:

我正在尝试对Flash文件进行一些广告分析,因此用户提交Flash广告到一个包含所需网页链接的网站上。

现在,我的客户需要知道单击此Flash文件的次数。为解决这个问题,我将要求每个提交Flash的用户编写一个链接到我的客户网页,并将所需的URL作为参数传递,如下所示:

http://myclientwebpage.com/disp.php?link=www.google.com&id=16

通过这种方式,我可以更新我的数据库并获得该链接被点击的次数计数。


你能进一步解释一下你想用它做什么吗? - Andre Backlund
如果我理解正确,你的例子中的“www.google.com&id=16”是需要编码的链接。 所以,不要写成 echo "href='http://myclientwebpage.com/disp.php?link=" . $link . "'", 而应该写成 echo "href='http://myclientwebpage.com/disp.php?link=" . rawurlencode($link) . "'"。然后,在disp.php代码中,你会得到$_GET['link'],它将包含"www.google.com&id=16"(而不仅仅是"www.google.com")。 - binaryLV
我认为唯一的问题应该是和号&,在原始URI中应该写成%26。所有其他字符都可以按原样引入。 - Brethlosze
在URL中转义“&” - Brethlosze
2个回答

16

使用 urlencode()rawurlencode()


你写道:

我正在尝试从用户那里获取一个URL作为参数,并将用户重定向到这个URL。

但是你没有回答问题——你如何获得这个URL?用户如何提供给您?它是在 <input type='text'/> 中书写的吗?还是用户点击某个包含URL作为其中一个参数的链接?还是通过存储在数据库中的某个URL的ID传递的?

我能想到的一种情况是,在纯文本中替换URL并在打开真正的页面之前向用户发送到某个“重定向页面”,因此最终页面不会看到可能包含某些安全数据(例如,会话ID)的HTTP referrer。 在这种情况下,您应该编写

<a href='redirect.php?link=<?php echo rawurlencode($url); ?>'>
    <?php echo htmlspecialchars($url); ?>
</a>

代替

<a href='redirect.php?link=<?php echo $url; ?>'>
    <?php echo htmlspecialchars($url); ?>
</a>

1
问题在于我从 $_GET 中获取了这个 URL。 - Feras Odeh
1
那么问题出在哪里呢?如果你从 $_GET['url'] 获取到这个URL,并想把它放到 a 标签的 href 属性中,那么它将会像是 <a href='?link=<?php echo rawurlencode($_GET['url']); ?>'>next link</a> 一样,然后在“下一页”中你可以通过 $_GET['link'] 获取到它。 - binaryLV
数组 'link' => string 'www.google.ps/search?hl=en' (长度=26) 'id' => string '13' (长度=2) - Feras Odeh
@Feras Odeh,您对那个URL具体在做什么?请逐步说明。您如何获取它以及需要执行哪些操作? - binaryLV
@Feras Odeh,我已经编辑了我的帖子,包括一个示例,但我不确定它是否有帮助,因为您仍然没有回答,您如何获取该URL。 “用户参数”是不够的,因为用户可能以许多方式提供该参数... - binaryLV
显示剩余2条评论

0
据我所知,您需要将&替换为&amp;
$url = str_replace('&', '&amp;', $url);

&是保留字符,用于分隔GET参数,&amp;用于在URL中写入字面上的“&”符号。


1
我建议使用rawurlencode()urlencode()(而不是替换单个字符),因为URL可能包含不仅是'&',还有其他特殊字符(例如,'#'是我首先想到的)。 - binaryLV
我认为唯一的问题应该是和号&,在原始URI中应该写成%26。所有其他字符都可以按原样引入。 - Brethlosze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接