能否对包含已经被编码的url的url进行url编码?

5
我有一个网站,其中包含Facebook、Twitter和Delicious分享链接。它们包含一个URL编码的网站URL,您希望分享该网站。问题是,我想通过PHP重定向页面发送Facebook/Twitter/Delicious URL。
在已编码的URL中编码URL是否有效?会不会产生副作用?
简化我的问题:
www.website.com/redirect.php?url=" URLENCODED (http://www.facbook.com/sharer.php?t='URLENCODED(title)'&u='URLENCODED(http://www.hotel.com)')

1
要理解递归,首先必须理解递归。 - Sarah Vessels
5个回答

10

您可以使用百分号编码多次对字符串进行编码,然后通过同样的次数进行解码以获取原始值:

$str = implode(range("\x00", "\xFF"));
var_dump($str === urldecode(urldecode(urldecode(urlencode(urlencode(urlencode($str)))))));

这里的$str值被编码了三次,然后解码了三次。重复编码和解码的输出与$str的值相同。

所以试试这个:

'http://example.com/redirect.php?url='.urlencode('http://www.facbook.com/sharer.php?t='.urlencode('title').'&u='.urlencode('http://www.hotel.com'))

我知道如何做......我只是担心urlencoding一个已经进行过urlencode的url可能会导致整个url在重定向页面被解码...所以我应该假设嵌套的url编码会很好用吗? - Mark
正如@Gumbo所说:“您可以多次对URL进行编码,并在相同次数解码时获得原始值”。每次编码时,之前所有已编码的部分都会再次被编码。 - Josh
1
@Mark:所以如果你还是有疑惑,不,重定向URL不会解码整个URL,它只会删除一个“级别”的编码。换句话说,你的计划是可行的。 - Josh

3

您应该能够递归地对URL进行多次编码。如果重复编码像/这样的字符,则会得到:

0: /
1: %3F
2: %%3F
3: %%%%3F

etc.


encode('?') = %3F。并且在递归编码时,唯一被重新编码的部分是“%”,因此最终看起来更像是“%2525253F”,其中decode('%25')=%。 - Kevin Lawrence

1

添加第二层URLEncoding是可以的。URLEncoding的目的是防止服务器误解文本字符串中可能存在的特殊字符。但是,接收脚本必须预期额外的urlencode()层,并相应地采取行动。

或者,如果您知道字符串已经进行了url编码,那么您可以直接将其传递,不需要进一步的url编码。


0

或者只需对标题和URL进行urldecode,然后对整个字符串进行urlencode。


0

如前所述,您可以尽可能多地对URL进行编码,但是您应该知道,每次编码URL数据都会使其长度增加,可能增加一倍。如果太长,这将令用户感到烦恼。此外,某些浏览器可能存在URL长度限制。 另外,在服务器端,对数据进行编码和解码会产生额外的开销。 简而言之,在多次编码/解码之前,您应该确信自己真正需要它。


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