我正在创建一个分析项目。我的目标是为x-domain的所有者提供来自我网站的少量javascript。这让我有能力跟踪他们的鼠标移动。我得到了跟踪,我需要做的就是将数据发送回我的服务器,以便将其存储在我的数据库中。我的问题是数据太大,无法通过getJSON发送。
记住.. 我不能使用$ .Post或任何类型的XMLhttp请求,因为我的域和x域是REMOTE。浏览器不允许这样做..我只能使用getJSON。
由于这不起作用,我被告知设置代理。从我所学到的,代理仅适用于具有代理设置的服务器。不适用于尝试向我发送数据的服务器
我知道这是可能的,因为我见过它。有人有主意吗 ?? iframes对我想做的事情有好处吗?有没有人有资源分享?
非常感谢
答案 0 :(得分:0)
您是否考虑使用JSONP之类的内容?
答案 1 :(得分:0)
将数据拆分为块,以便getJSON可以正常工作。您可以实现数据排队,以便生产者继续使用数据填充队列,并且域上的使用者使用getJSON将其获取为较小的块。这不是实时的,但你可以尝试一下,看看你是否对表现感到满意。
答案 2 :(得分:0)
您可以使用javascript与Flash对话并让flash执行跨域部分,请参阅http://www.xml.com/pub/a/2006/06/28/flashxmlhttprequest-proxy-to-the-rescue.html
我不清楚为什么你不能使用代理。浏览器中的javascript会发布到在x-domain上运行的脚本,然后该脚本会使用curl或类似内容将完全相同的信息发布到您的域中。
答案 3 :(得分:0)
您可以让JavaScript创建iframe和表单,然后将表单发布到iframe中。您可以将其放在屏幕上以使其隐藏。例如:
function post_my_data(json){
var f = document.createElement('form');
f.action = 'http://www.my-domain.com/receive.php';
f.method = 'post';
f.target = 'posttarget';
var i = document.createElement('input');
i.type = 'hidden';
i.name = 'json';
i.value = json;
f.appendChild(i);
var ifr = document.createElement('iframe');
ifr.name = 'posttarget';
ifr.style.display = 'absolute';
ifr.style.left = '-1000px';
document.body.appendChild(ifr);
document.body.appendChild(f);
f.submit();
}
答案 4 :(得分:0)
也许你可以更好地理解它然后我可以。我很擅长使用php,但发送不同的标题和内容并不是很好。工作原理是将ajax帖子发布到代理文件中。代理文件位于外部服务器上
$.ajax({
type: "POST",
url: "http://mywebsite.com/ajax-proxy.php",
data: 'csurl=www.google.com',
error: function(e) {console.log(e);},
success: function(msg){console.log(msg)}
});
您还必须传递csurl,这是代理转发给您的网址。在这个例子中,我使用谷歌。但我正常使用的是csurl是我将存储ajax数据的目录
在代理文件中,有一个
$valid_requests = array()
在该数组中,您说明了您希望代理批准的所有网址。在这个例子中你放了www.google.com(注意:必须与csurl参数完全相同,否则它不会起作用)
以下是代理文件
<?php
/**
* AJAX Cross Domain (PHP) Proxy 0.6
* by Iacovos Constantinou (http://www.iacons.net)
*
* Released under CC-GNU GPL
*/
/**
* Enables or disables filtering for cross domain requests.
* Recommended value: true, for security reasons
*/
define('CSAJAX_FILTERS', true);
/**
* A set of valid cross domain requests
*/
$valid_requests = array(
'www.google.com'
);
/*** STOP EDITING HERE UNLESS YOU KNOW WHAT YOU ARE DOING ***/
// identify request headers
$request_headers = array();
foreach ( $_SERVER as $key=>$value ) {
if( substr($key, 0, 5) == 'HTTP_' ) {
$headername = str_replace('_', ' ', substr($key, 5));
$headername = str_replace(' ', '-', ucwords(strtolower($headername)));
$request_headers[$headername] = $value;
}
}
// identify request method, url and params
$request_method = $_SERVER['REQUEST_METHOD'];
$request_params = ( $request_method == 'GET' ) ? $_GET : $_POST;
$request_url = urldecode($request_params['csurl']);
$p_request_url = parse_url($request_url);
unset($request_params['csurl']);
// ignore requests for proxy :)
if ( preg_match('!'. $_SERVER['SCRIPT_NAME'] .'!', $request_url) || empty($request_url) ) {
exit;
}
// check against valid requests
if ( CSAJAX_FILTERS ) {
$parsed = $p_request_url;
$check_url = isset($parsed['scheme']) ? $parsed['scheme'] .'://' : '';
$check_url .= isset($parsed['user']) ? $parsed['user'] . ($parsed['pass'] ? ':'. $parsed['pass']:'') .'@' : '';
$check_url .= isset($parsed['host']) ? $parsed['host'] : '';
$check_url .= isset($parsed['port']) ? ':'.$parsed['port'] : '';
$check_url .= isset($parsed['path']) ? $parsed['path'] : '';
if ( !in_array($check_url, $valid_requests) ) {
exit;
}
}
// append query string for GET requests
if ( $request_method == 'GET' && count($request_params) > 0 && ( !array_key_exists('query', $p_request_url) || empty($p_request_url['query']) ) ) {
$request_url .= '?'. http_build_query($request_params);
}
// let the request begin
$ch = curl_init($request_url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $request_headers); // (re-)send headers
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // return response
curl_setopt($ch, CURLOPT_HEADER, true); // enabled response headers
// add post data for POST requests
if ( $request_method == 'POST' ) {
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($request_params));
}
// retrieve response (headers and content)
$response = curl_exec($ch);
curl_close($ch);
// split response to header and content
list($response_headers, $response_content) = preg_split('/(\r\n){2}/', $response, 2);
// (re-)send the headers
$response_headers = preg_split('/(\r\n){1}/', $response_headers);
foreach ( $response_headers as $key => $response_header )
if ( !preg_match('/^(Transfer-Encoding):/', $response_header) )
header($response_header);
// finally, output the content
print($response_content);
?>
再次,如果我将http://mywebsite.com/ajax-proxy.php?csurl=www.google.com放在我的网站中。它工作正常。甚至把它放在网址中。工作良好。但如果你使用ajax帖子从外部服务器调用它。不起作用。