3

我知道我应该对传递给其他任何东西的任何 url 进行编码,因为我读到了这个: 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

所以在主页中,我调用了jquery$("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 中,我已经尝试将整个东西包装在一个或两个中。即使我可以看到提交的网址最后看起来像 track=1%26time%3D5 , & 仍然会破坏它。

如果我将此或什至带有未编码 url 的“普通”版本粘贴到 yoururls 界面中,或者通过 api 将其作为粘贴到浏览器位置栏中的普通 URL 提交到 yoururls,它再次完美运行。

所以这不是你的网址有错,似乎网址编码正确,我唯一能想到的可能是 CURL?

现在,您可能会想“为什么不将 & 替换为 *,然后再将其转换回来?”。好的,所以当 url 展开时,我从

var track = $.getUrlVar('track');
var time = $.getUrlVar('time');

所以我可以丢失时间变量,然后查找 * 的位置,然后假设 * 之后的任何内容都是时间,但这有点难看,更重要的是,它并不是真正的正确的做事方式。

如果有人可以帮助我,将不胜感激。

4

2 回答 2

2

我尝试将整个 URL 包装在 php 的 URLencode 中

这确实是您必须做的(假设“URL”是指内部 URL 作为外部 URL 的一个组件传递)。每当您在 URL 组件中输入值时,都需要进行 URL 编码,无论您设置的值是否为 URL。

$myurl='http://...?...&url='.rawurlencode($theurl);

urlencode()对于这样的查询参数是可以的,但rawurlencode()对于路径部分也可以,所以除非你真的需要空格来看起来更漂亮 [ +vs %20],否则我会rawurlencode()默认使用。)

这将为您提供最终 URL,例如:

http://myshorten.example/yourls-api.php?signature=x&action=shorturl&format=simple&url=http%3A%2F%2Furltoshorten%3Ftrack%3D2%26time%3D967

您应该能够验证工作。如果没有,则 . 有问题yourls-api.php

于 2010-08-18T17:12:51.867 回答
1

我已经尝试将整个 URL 包装在 php 的 URLencode 中,我已经将 track=2&time=967 包装在 encodeURI 和 encodeURIComponent 中,我已经尝试将整个东西包装在一个或两个中。即使我可以看到提交的网址最后看起来像 track=1%26time%3D5 , & 仍然会破坏它。

也许对 HTTP 变量如何工作的解释会对您有所帮助。

如果我得到一个包含以下变量和值的页面:

var1 = Bruce Oxford
var2 = Brandy&Wine
var3 = ➋➌➔            (unicode chars)

我们对 var 名称和 var 的值进行 uri 编码,即:

var1 = Bruce+Oxford
var2 = Brandy%26Wine
var3 = %E2%9E%8B%E2%9E%8C%E2%9E%94

我们没有做的是对分隔字符进行编码,所以上面的请求数据看起来像:

?var1=Bruce+Oxford&var2=Brandy%26Wine&var3=%E2%9E%8B%E2%9E%8C%E2%9E%94

而不是:

%3Fvar1%3DBruce+Oxford%26var2%3DBrandy%26Wine%26var3%3D%E2%9E%8B%E2%9E%8C%E2%9E%94

这当然只是胡言乱语。

于 2010-08-18T17:17:31.427 回答