クロスオリジンリソースシェアリングとプロトタイプで問題が発生しています。外国のリソースへの簡単な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の開発者コンソールの「リソース」ビューに表示されます)が、プロトタイプが何らかの形でそれにアクセスできないことを示しています