5

クロスオリジンリソースシェアリングとプロトタイプで問題が発生しています。外国のリソースへの簡単なPOSTリクエストがあります。簡単なPOSTリクエストには、満たす必要のあるいくつかのルールがあります。

Content-Typeはapplication/x-www-form-urlencoded、multipart / form-data、またはtext / plainである必要があり、単純なリクエストはhttpリクエストでカスタムヘッダーを設定せず、サーバーはAccess-を設定する必要があります。 Control-Allow-Originヘッダーが正しい。

バニラJavaScriptXMLHttpRequestを使用すると、すべてが正常に機能しますが、PrototypeJSを使用すると、Prototypeがいくつかのカスタムヘッダーを設定し、それを防ぐ方法がわからないため、機能しません。

私はプロトタイプでそれを試しました:

new Ajax.Request('some.foreign-host.com/res.php', {
  method: 'post',
  postBody: 'foo=bar', 
  contentType: 'application/x-www-form-urlencoded', 
  onSuccess: function(e){
    // some custom code
  }
});

Prototypeにそのような単純なCORSリクエストを送信させる方法はありますか?


プレーンなJavaScriptXMLHttpRequestによって作成されたヘッダーのダンプがあります:

POST /bthesis/returnJSON.php HTTP/1.1    
Host: foreign-host.com                         
Connection: keep-alive                   
Referer: this-host.com
Content-Length: 9                        
Origin: this-host.com     
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Accept: */*                              
User-Agent: [...]
Accept-Encoding: gzip,deflate,sdch       
Accept-Language: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

およびプロトタイプリクエストによって作成されたヘッダー:

OPTIONS /bthesis/returnJSON.php HTTP/1.1 
Host: foreign-host.com                        
Connection: keep-alive                   
Referer: this-host.com
Access-Control-Request-Method: POST      
Origin: this-host.com      
Access-Control-Request-Headers: X-Prototype-Version, X-Requested-With, Content-type, Accept
Accept: */*                              
User-Agent: [...]
Accept-Encoding: gzip,deflate,sdch       
Accept-Language: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

プロトタイプはまったく異なるヘッダーセットを使用しています...これにより、コンソールで次のエラーが発生します。

XMLHttpRequestはforeign-host.com/bthesis/returnJSON.phpをロードできません。リクエストヘッダーフィールドX-Prototype-Versionは、Access-Control-Allow-Headersでは許可されていません。安全でないヘッダー「X-JSON」の取得を拒否しました

奇妙なことに、Webサーバーはどちらの場合も要求されたリソースを返します(Chromeの開発者コンソールの「リソース」ビューに表示されます)が、プロトタイプが何らかの形でそれにアクセスできないことを示しています

4

4 に答える 4

11

私も同じ問題を抱えています。@mplungjan共有リンクには答えが含まれています:

x-jsonを使用して、ヘッダーが安全であることをブラウザに通知するだけです。access-control-expose-headers

この行をRubyonRailsコントローラーで使用しています

  headers['Access-Control-Expose-Headers'] = 'x-json'

(これは他のプログラミング言語に翻訳するのは非常に簡単なはずです:))

このページの詳細

于 2013-02-15T11:04:35.210 に答える
1

ここでPREFLIGHTをご覧くださいhttps://developer.mozilla.org/En/HTTP_access_control

あなたの問題は、Fxがカスタムヘッダー(X -...)に反応していて、プリフライトをトリガーすることです。サーバーにOPTIONSとPOSTのすべてのアクセス制御ヘッダーを返し、カスタムヘッダーを許可する必要があります。

于 2010-10-29T13:46:16.523 に答える
1

他の SO questionで解決策を見つけました。そして、それは私にとってはうまくいきます -詳細はここにあります

要約すると、非標準ヘッダーを削除するonCreateイベントが必要です。Ajax.Request

    onCreate: function(response) { // here comes the fix
        var t = response.transport; 
        t.setRequestHeader = t.setRequestHeader.wrap(function(original, k, v) { 
            if (/^(accept|accept-language|content-language)$/i.test(k)) 
                return original(k, v); 
            if (/^content-type$/i.test(k) && 
                /^(application\/x-www-form-urlencoded|multipart\/form-data|text\/plain)(;.+)?$/i.test(v)) 
                return original(k, v); 
            return; 
        }); 
    }
于 2013-03-21T12:48:46.977 に答える
0

おそらく、Ajax Request でオリジン ヘッダーを自分で設定できます。

new Ajax.Request('some.foreign-host.com/res.php', {
    method: 'post',
    postBody: 'foo=bar',
    requestHeaders: {Origin: 'http://www.my.local-host.com'}
    contentType: 'application/x-www-form-urlencoded', 
    onSuccess: function(e){
        // some custom code
    }
});

自分で試したことはありませんが... プロトタイプ版はどうなりますか? リクエストが発行された後、何も返されないのか、それともレスポンスが破棄されているのか、それとも何ですか?

于 2010-08-05T12:26:00.000 に答える