我知道应该将传递给其他任何URL的任何URL编码为URI,因为我读到以下内容:
http://www.digitalbart.com/jquery-and-urlencode/
我想分享我正在听的当前曲目的当前时间.
因此,我安装了出色的yoururls缩短器.
我有一些代码将所有内容放在一起,并进行以下操作:
track = 2& time = 967
因为我不希望每个人都看到我的私钥,所以我有一个小的php文件来接收输入,并附加以下内容,因此它看起来像这样:
http://myshorten.example/yourls-api.php?signature=x&action=shorturl&format=simple&url=http://urltoshorten?track=2&time=967
因此,在主页中,我调用了$(“ div.shorturl”).load(loadall);
然后,它执行一点CURL,然后缩短器返回一个不错的短URL.
像这样:
$myurl='http://myshorten.example/yourls-api.php?signature=x&action=shorturl&format=simple&url=' . $theurl;
$ch = curl_init($myurl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
curl_close($ch);
if ($data === false) {
echo 'cURL failed';
exit;
}
echo $data;
一切都完美.
除了…缩短的URL始终采用http://urltoshorten?track=2的形式-缩短&符后的所有内容.
我已经尝试将整个URL包装在php的URLencode中,我已经将track = 2& time = 967包装在encodeURI和encodeURIComponent中,我已经尝试将整个东西包装在一个或两个中.
而且,&破坏了它,即使我可以看到提交的URL最终看起来像track = 1&time = 5.
如果我将此版本甚至带有未编码url的“普通”版本粘贴到yoururls界面中,或通过api作为普通URL粘贴到浏览器的位置栏中,通过api提交到yoururls,则它仍然可以正常工作.
所以这不是yoururls的错,似乎url编码正确,我唯一想到的可能是CURL吗?
现在,您可能会在思考“为什么不将&替换为*,然后再次将其转换回去?”.
好的,所以当扩展网址时,我从
var track = $.getUrlVar('track');
var time = $.getUrlVar('time');
因此我可能会丢失时间var,然后对*的轨迹进行一些查找,然后假设*之后的所有时间都是时间,但这有点丑陋,更重要的是,这并不是真的正确的做事方式.
如果有人可以帮助我,将不胜感激.
解决方法:
I have tried wrapping the whole URL in php’s URLencode
这确实是您必须要做的(假设使用“ URL”,您是指将内部URL作为外部URL的组成部分进行传递).每当您在URL组件中输入值时,无论您设置的值是否为URL,都需要进行URL编码.
$myurl='http://...?...&url='.rawurlencode($theurl);
(对于这样的查询参数,urlencode()可以,但是对于路径部分,rawurlencode()也是可以的,因此,除非您真的需要空格看起来稍微漂亮一些[vs],否则默认情况下我会选择rawurlencode().)
这将为您提供最终网址,例如:
http://myshorten.example/yourls-api.php?signature=x&action=shorturl&format=simple&url=http%3A%2F%2Furltoshorten%3Ftrack%3D2%26time%3D967
您应该能够验证的作品.如果不是,则yourls-api.php出问题了.