启用CORS以在另一个主服务器上获取内容

时间:2014-08-23 18:32:17

标签: javascript xmlhttprequest webserver

我想在我的一台家用服务器上运行一个小脚本。 我的网络服务器(192.168.1.100)服务于一个必须从另一台服务器(192.168.1.225)获取信息的网站。此服务器生成纯文本文件。 但是,由于“同源原则规则”,我网站上的脚本拒绝从任何其他网站加载信息。解决此问题的唯一方法是将两个文件放在同一台服务器上或启用CORS。前者是不可能的,所以我对后者进行了一些研究。我发现启用CORS是通过添加标题" Access-Control-Allow-Origin"来完成的,所以我这样做了,没有解决问题。

这意味着,我有以下内容:

Server A (192.168.1.225) generates and serves a plaintext file on every GET request.

Server B (192.168.1.110) serves a simple interface and displays information received by Server B trough javascript.

Server B serves the following file:

<html>
 <head>
  <meta http-equiv="Access-Control-Allow-Origin" content="*">
  <style> /*...*/ </style>
 </head>
 <body>
  <p>This is the parsed content of "some_file.cgi"</p>
  <script>
   function http_get(url) {
    var xmlHttp = new XMLHttpRequest();
    xmlHttp.open("GET", url, false);
    xmlHttp.send(null);
    return xmlHttp.responseText;
   }

   function parse_page(page) {
    // Parse some content
   }

   var page = parse_page( http_get('http://192.168.1.225/foo/bar/some_file.cgi') );
   document.write(page);
  </script>
 </body>
</html>

我如何启用CORS,为什么它不像我那样工作?

TL;DR: Client-Side javascript served by 192.168.1.100 needs to get the content of 192.168.1.225/foo/bar/some_file.cgi.

1 个答案:

答案 0 :(得分:0)

您需要输出正确的响应标头,在相当长的一段时间内没有使用CGI / Perl,但根据http://enable-cors.org/server_cgi.html它应该是这样的:

print header(
  -type => 'text/plain',
  -content_location => 'sometextfile.txt',
  -access_control_allow_origin => '*',
);

您也可以执行jsonp请求,无需进行cors设置即可执行此操作。

按照this question中的步骤操作,而不只是:

print $json_text;

DO

print 'someFunction('.$json_text.');';

在你的JS中

function someFunction(data){
    //handle the data
}

function http_get(url) {
    var script = document.createElement("script");
    script.type = "text/javascript";
    script.src = url;
    document.head.appendChild(script);
}
http_get('http://192.168.1.225/foo/bar/some_file.cgi');

就像我之前说的那样,有一段时间没有使用CGI / Perl所以你必须检查语法等。