0

リモート perl サーバーにリクエストを送信しています。しかし、問題が発生しました

XMLHttpRequest cannot load http://otherdomain.com/getPub.pl?content=hello. Origin http://localhost is not allowed by Access-Control-Allow-Origin.

次のように、perl スクリプトで access_control_allow_origin を「*」にすることを既に有効にしています。

#!/usr/bin/perl

use strict;
use CGI qw(:standard);
use warnings;

my $cgi = new CGI;

print $cgi -> header(
-type => 'text/plain',
-access_control_allow_origin => '*',
  );
my $content = $cgi -> param('content');
open(CON,">content.txt") || die "can't open $!";
print CON $content;
close(CON);

およびjsリクエストは次のとおりです。

function sendData(){
    var url = "http://otherdomain.com/getPub.pl?content=hello";
    var xhr = createCORSRequest("GET", url);
    if(!xhr){
        throw new Error ('CORS not supported');
        }
    xhr.send();

}
function createCORSRequest(method, url){
     var xhr = new XMLHttpRequest();
     if("withCredentials" in xhr){
       xhr.open(method,url,true);
     }else if(typeof XDomainRequest != "undefined"){
        xhr = new XDomainRequest();
        xhr.open(method, url);
    }else{
            xhr = null;
    }
return xhr;
} 

応答ヘッダーは次のとおりです。

Allow:GET,HEAD,POST,OPTIONS,TRACE
Connection:Keep-Alive
Content-Length:0
Content-Type:text/plain; charset=UTF-8
Date:Mon, 07 Jan 2013 16:55:44 GMT
Keep-Alive:timeout=15, max=99
Server:Apache/2.2.3 (CentOS)

何か問題でもありますか?

4

2 に答える 2

3

最終的に PHP で動作するようになりましたが、まだ違いはわかりませんでした。要約:

1. perl を次のように使用する場合:

my $cgi = new CGI;
print $cgi -> header(
-type => 'text/plain',
-access_control_allow_origin => '*',
-access_control_allow_headers => 'content-type,X-Requested-With',
-access_control_allow_methods => 'GET,POST,OPTIONS',
-access_control_allow_credentials => 'true',
); 

HTTP ヘッダーは次のとおりです。

リクエストヘッダー:

Request Method:OPTIONS
Status Code:200 OK
Request Headersview source
Accept:*/*
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Access-Control-Request-Headers:origin, x-requested-with, content-type
Access-Control-Request-Method:POST
Connection:keep-alive
Host:example.org
Origin:http://localhost
Referer:http://localhost/testCORS.html
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko)         Chrome/23.0.1271.97 Safari/537.11

応答ヘッダー:

Allow:GET,HEAD,POST,OPTIONS,TRACE
Connection:Keep-Alive
Content-Length:0
Content-Type:text/plain; charset=UTF-8
Date:Tue, 08 Jan 2013 05:52:26 GMT
Keep-Alive:timeout=15, max=100
Server:Apache/2.2.3 (CentOS)

2. しかし、PHP では動作します!!!: 違いがわかりませんでした!

コード:

<?php
 header("Access-Control-Allow-Origin: *");
 header("Access-Control-Allow-Methods: GET,POST,OPTIONS");
 header("Access-Control-Allow-Headers: X-Requested-With,");
 #header("Access-Control-Allow-Credentials: true");
 ?>

応答ヘッダー:

Access-Control-Allow-Headers:X-Requested-With
Access-Control-Allow-Methods:GET,POST,OPTIONS
Access-Control-Allow-Origin:*
Connection:Keep-Alive
Content-Length:0
Content-Type:text/html; charset=UTF-8
Date:Tue, 08 Jan 2013 05:52:10 GMT
Keep-Alive:timeout=15, max=100
Server:Apache/2.2.3 (CentOS)
X-Powered-By:PHP/5.3.3
于 2013-01-08T05:57:52.507 に答える
0

サーバーが適切な Access-Control-Allow-Origin ヘッダーを使用してその URL への OPTIONS リクエストに応答していることを確認する必要があります。ブラウザは、最初に OPTIONS リクエストを作成することにより、リクエストを「プリフライト」します。それが失敗した場合、リクエストはまったく試行されません。

于 2013-01-07T15:59:05.080 に答える