0

更新および解決済み

ヒントをくれた@ChristoferEliassonに感謝します。追加:

header("access-control-allow-origin: *");

私のPHPファイルに問題を解決しました。おそらく、問題に対処するための最も美しい方法ではありませんが、これは機能します。

それを少し良く/より安全にするために:

$http_origin = $_SERVER['HTTP_ORIGIN'];

if ($http_origin == "http://domain1.com")
{  
    header('Access-Control-Allow-Origin: *');
}

これは、別のクロスドメイン関連の質問です。

domain1.comに単純なHTMLフォームがあり、ユーザーは自分の電子メールをメーリングリストに追加できます。ここでは、2番目のドメイン(domain2.com)でホストされている単純なjsonファイル「mails.json」です。

ユーザーが自分のメールを送信すると、JSスクリプトが呼び出されます。このスクリプトの目的は、メールをチェックし、フォームのデータ(ここではユーザーのメール)を、domain2.comでホストされているmails.jsonファイルにajaxGETとを介して送信することです。 JSONP。

Ajaxは、domain2.comでホストされているPHPスクリプトを呼び出します。このスクリプトは、ユーザーの電子メールを取得してmails.jsonに書き込む必要があります。さらに、ユーザーが以前に自分の電子メールを入力したことがある場合は、成功またはエラーに関するいくつかのメッセージをdomain1.comに返送する必要があります。

現在、電子メールはmails.jsonに送信および保存されていますが、PHPスクリプトで実行に関するメッセージをdomain1に送り返すことができません。アドバイスをありがとうございます。以下のコードを確認して変更してください。

domain1.comでホストされているHTMLフォーム

<div id="mail">
<form method="post" action="http://domain2.com/script.php" class="notifyme">
    <input type="email" value="" name="email" class="email" id="email" placeholder="Type your email here" required>
    <input type="submit" value="Get notified &raquo;" id="submit" name="submit">
    <div class="clear"></div>
</form>

<div class="errmail hide"><span class="uremail"></span> is not a valid email address. Try again :)</div>
<div class="error hide">Ouch :( <span class="uremail"></span> is already registered.</div>
<div class="success hide">Thank You :) <span class="uremail"></span> will be notified once we're ready.</div>

</div>

domain1.comでホストされているJavascriptファイル

//jQuery Initialization
$(function(){

// Form
$('#submit').click(function () { //onSubmit

$('.error,.errmail,.success').hide();       
    var email = $('input[name=email]').val();

    //Email validation      

    var pattern = new RegExp(/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i);

    var valid = pattern.test(email);
    if (!valid && email !== 'undefined') {  
            $('.errmail').removeClass('hide').show('fast');

            if (!email){$('.uremail').append('This');}
            else{$('.uremail').append(email);}
            return false;
   } else {

        //start Ajax
        $.ajax({

            url: "http://domain2.com/script.php?json_callback=?",
            dataType: "jsonp text",       
            //GET method is used
            type: "GET",

            //pass the data         
            data: 'email=' + email,   

            //Do not cache the page
            cache: false,

            //Cross Domain
            crossDomain: true,

            //success
            success: function (html) {    

                //if list.php returned 1/true (send mail success)
               if (html==1) {                  
                $('.success').removeClass('hide').show('fast');$('.uremail').append(email);              

                } 
                else if (html == 0){
                $('.error').removeClass('hide').show('fast');$('.uremail').append(email); 
                }

                else { alert('Sorry, unexpected error. Please try again later.');  }           
            } 


        });
        }

        //cancel the submit button default behaviours
        return false;
    }); 
});

更新しました

domain2.comでホストされているPHPの「script.php」ファイル

header('content-type: application/json; charset=utf-8');
$http_origin = $_SERVER['HTTP_ORIGIN'];

if ($http_origin == "http://domain1.com")
{  
    header('Access-Control-Allow-Origin: *');
}

$logname    = 'mails.json';
$logcontents = file_get_contents($logname);

//Retrieve form data.
$email = ($_GET['email']) ?$_GET['email'] : $_POST['email'];

//flag to indicate which method it uses. If POST set it to 1
if ($_POST) $post=1;


    if(strpos($logcontents,$email) !== false) {
    if ($_POST) {die('You are already subscribed.');}
    else{ $result = 0;echo $result; }
    } 

    else {
        $filecontents = $email.',';
        $fileopen = fopen($logname,'a+');
        $filewrite = fwrite($fileopen, json_encode($filecontents) );
        $fileclose = fclose($fileopen);
                if(!$fileopen or !$filewrite or !$fileclose) {
                    if ($_POST) {die('Error occured');}
                    else{ $result = 0;echo $result; }
                    } 
                else {
                    if ($_POST) {echo 'Your email has been added.';}
                    else{ $result = 1;echo $result; }
                    }

    }
4

2 に答える 2

1

スクリプトの先頭に適切なcontent-typeヘッダーを設定すると、通常の。を使用してデータを返すことができますecho。最初にJSONP形式に一致するようにデータを準備する必要があります。このようなもの:

<? 
    // Some data to return
    $data = array(1, 2, 3, 4, 5, 6, 7, 8, 9);
    // JSONP response
    echo $_GET['callback'] . '('.json_encode($data).')';
?>

// For this example, the response would be something like this:
// jsonp1277656587731([1,2,3,4,5,6,7,8,9])

jQueryを使用してJSONPajax-requestを実行すると、jQueryはサーバー側で使用するためのコールバックGET変数を自動的に送信します。例に見られるように。

いくつかの追加の読書: http: //www.geekality.net/2010/06/27/php-how-to-easily-provide-json-and-jsonp/

于 2012-06-27T13:41:03.830 に答える
0

私は過去に同様の問題に直面し、Webサーバー(Apache2)のクロスドメイン設定をいじくり回そうとしましたが、うまくいきませんでした。ヒットして試してみると、ajax呼び出しの「url」パラメーターからホスト名を削除しました。私はまだ完全には理解していませんでした。

次のURLパラメータをすばやく確認できますか?

 http://domain2.com/script.php?json_callback=?

ただ:

 script.php?json_callback=?.

追加のWebサーバー構成設定があるかもしれませんが、それが機能するかどうかを確認したかっただけです。

于 2012-06-27T13:55:08.293 に答える