3

私はこれを読んでいるので、他のものに渡されたURLをencodeURIする必要があることを知っています: 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 を少し実行してから、shorter が適切な短い 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%26time%3D5 のように見えることはわかりますが、& はそれを壊します。

これまたはエンコードされていない URL を含む「プレーン」バージョンを yoururls インターフェイスに貼り付けるか、API を介して通常の URL として yoururls に送信し、ブラウザーのロケーション バーに貼り付けると、再び完全に機能します。

したがって、あなたのURLに問題があるわけではありません。URLが適切にエンコードされているようです。私が考えることができる唯一のことは、おそらくCURLですか?

この時点で、「& を * に置き換えてから、もう一度変換してみませんか?」と考えているかもしれません。OK、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()このようなクエリパラメータには問題ありませんが、パス部分にも問題ありません。そのため、[ vs ]rawurlencode()を少しきれいに見せるためにスペースが本当に必要でない限り、デフォルトで使用します。)+%20rawurlencode()

これにより、次のような最終的な 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の両方でラップしました.全体を一方または両方でラップしようとしました. それでも、送信された URL が最後に 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 に答える