5

ここにはかなりのジレンマがあり、コミュニティからの提案をお願いします。これが私の問題です:

動的なコンテンツがたくさんあるWebサイトを作成しました。すべてのコンテンツは、AJAXを介して取得され、JSを介して表示されます。現在、コンテンツへの直接リンクを許可している方法は、JSを使用してフラグメント識別子をその場で変更することです。例を次に示します。

http://www.mysite.com/home#/123

ここで、123はコンテンツのIDです。コンテンツが閉じられると、フラグメント識別子が再び削除されます。

これは素晴らしく機能し、人々がページをロードすると、私のAJAXリクエストは「123」の記事を正常にリクエストしています。しかし、私はすべての記事にFacebookのようなボタンを実装したばかりで、今はレンガの壁にぶつかっています。

基本的に、Facebookが「いいね」コンテンツに関連付けるサムネイルとタイトルおよびURLを見つける方法は、iframeのようにfbに渡されたURLのメタタグをチェックすることです。これを行うには、URLでGETリクエストを実行し、メタタグのコンテンツを確認してから、それらをFacebookに表示します。

問題は、フラグメント識別子がサーバーに渡されないことです。そのため、PHP(私が知っている)では、特に要求された記事のコンテンツを使用してこれらのメタタグを動的に生成する方法がありません。

たとえば、私は次のようなことができるようにしたかったのです。

$id_vals = get_id_values($hash_fragment);
echo '<meta property="og:title" content="'.$id_vals['title'].'" />';

あなたの最初の考えはおそらく:GETリクエストまたはクエリ文字列を使用しないのはなぜですか?すなわち:

http://www.mysite.com/home?id=123

ただし、このアプローチの問題は、JavascriptがURLのこの部分を動的に変更できず、フラグメント識別子のみを変更できることです。これは、記事へのすべての直接リンクでページの更新が必要になることを意味します。これは、私たちが行っている「動的」アプローチ全体に反します-私が追加するかもしれませんが、これは本当に素晴らしいです:)

だから私は今ちょっと困惑しています。私が考えることができる唯一の半解決策は、両方のアプローチを使用することです。

fbのようなリクエストではgetパラメータを使用し、直接リンクの場合はフラグメント識別子を使用します。

しかし、これには次の問題があります。

  • ユーザーから直接リンクがFacebookに貼り付けられた場合、フラグメントIDが含まれ、正しいメタデータがFacebookに表示されません。
  • URLの形式を修正してIDを削除するために、奇妙なリダイレクトの魔法を実行する必要があります(つまり、GETパラメーターが渡されたかどうかを検出し、同等のフラグメント識別子にリダイレクトします)。しかし、FBがリダイレクトに従い、最初のページではなくリダイレ​​クトされたページからメタタグをフェッチするかどうかはわかりません。これにより、このソリューションは効果的に役に立たなくなります。

テキストの壁でごめんなさい!あなたが提供できるどんな入力にも感謝します。

編集:私は両方の組み合わせを含む提案されたソリューションをテストしましたが、Facebookがリダイレクトに従うことを確認できるため、このソリューションはまったく機能しません。これは気のめいるようです!

編集編集:私の「ミックス」のアイデアを実装する1つの可能な方法は、PHPのheader()呼び出しリダイレクトの代わりにwindow.locationリダイレクトを使用することです。これにより、Facebookは、同様の問題を抱えている人のために、元のページからメタタグをフェッチします。 。

ありがとう。

4

3 に答える 3

3

ハッシュバング URL を使用するようにサイトを再調整できる場合、Facebook はGoogle の AJAX クロール仕様#!をやや静かにサポートします。

を含む URL に遭遇する#!と、それとそれに続くテキストを GET に適したクエリ文字列に自動的に変換します?_escaped_fragment_=。サーバー側のコードは、存在する場合、その GET パラメータをキーオフできます。

于 2012-06-09T05:09:40.817 に答える
2

index.php は単純に session['refer'] をエコーし​​、Navigasyon.js id によってリフレッシュされると、入力したフラグメントの最後に /kill を追加して、リフレッシュ プロセスのループを停止します!

<?php session_start(); ?>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Boom - test</title>
        <script type="text/javascript" src="js/jquery.js"></script>
        <script type="text/javascript" src="js/Navigasyon.js"></script>
    </head>
    <body onLoad="if (location.href.indexOf('/kill')==-1) location.replace(location.href+'/kill')">
        <?php
//echo $_GET['url'];
//echo parse_url();
//echo $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"].$_SERVER['PHP_SELF'];;
        if (isset($_SESSION['refer']))
            echo $_SESSION['refer'];
        ?>
    </body>
</html>

Navigasyon.php すべての魔法がここで起こります! ajax経由でフラグメントをnavg.phpに送信し、それをセッションに登録し、更新ループインデックスを確実に強制終了するようになったときにサーバーから同じフラグメントに応答しますphpは/ killフラグを追加して停止します

var whereAmI = window.location.hash;
var prsdUrl = window.location.hash.split("/");
var a = 0; //#!
var b = 1; //Sayfa dil
var c = 2; //Sayfa id

if(prsdUrl[a] == "#!")
{
    $.post("navg.php", {
        refer: whereAmI
    },
    function(data) {
        //if(data='ref') document.location.reload();
        if(data==whereAmI) {
            if(prsdUrl[c] != 'kill') {
                document.location.reload();
            }
        } 
    });
}

navg.php この部分で何が起こっているかを教えてください!

<?php
session_start();
$_SESSION['refer'] = $_POST['refer']; ?>
<?php echo $_SESSION['refer'];
?>
于 2012-08-05T00:52:08.370 に答える
0

PHP のparse_url関数は、ハッシュ フラグメントを含むすべてを返すため、返された配列のキーを使用parse_urlしてアクセスすることができますfragment

$url = 'http://www.mysite.com/home#/123';
$parts = parse_url($url);
$fragment = $parts['fragment']; // => '/123'

または、代わりにcomponentフラグを渡しPHP_URL_FRAGMENT、フラグメント自体を取得するだけです

$fragment = parse_url($url, PHP_URL_FRAGMENT); // => '/123'
于 2012-06-09T04:52:15.540 に答える