我想在我的一台家用服务器上运行一个小脚本。 我的网络服务器(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.
答案 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所以你必须检查语法等。