将JS或iframe像分析和statcounter提供给其他网页以远程运行我的PHP + JS脚本

时间:2014-08-03 15:10:24

标签: javascript php jquery mysql

如何不将我的源代码复制到其他服务器并为他们提供JS或iframe,就像分析和统计提供者一样?

我用JS编写了一个PHP脚本,其基本描述如下: 当有人访问我的网站时,获取一个具有唯一标识值的cookie,同时使用AJAX我做了一些检查,并相应地将相同的值保存到mysql。在此之后,如果他再次访问我的网站(在大多数情况下),则不会再次创建cookie。

深度:

使用JS创建cookie值,我希望将其保留在未来的增强中。

我的代码(index.phpadd-to-mysql.php)包含JS和PHP。

我想在我的其他域中使用此脚本,其中一些脚本位于不同的服务器中。 我不想将所有源文件都放到帐户中。

我的理想选择是为他们提供JS代码,例如google analytics或statcounter给我们(或其他类似方式),iframe ......这样的解决方案。

当访问者进入他们的页面时,我的远程服务器(我的服务器)中的mySQL将被更新,并且将在他们的网站上创建一个cookie。从中传输数据。

这有可能成就吗?如果是的话,我该如何开始为此学习?你能给我一些指导吗?

谢谢。

这是一段代码,ajax函数将随机数发布到add-to-mysql.php文件中,我做了一些操作

$.ajax({
    type: 'POST',
    url: 'add-to-mysql.php',
    data: { one: hash }, //an antikatastiso to hash me to a ke kano to md5 meso php sto ajax vgenei to idio
    success: function(data) {       
        alert("success! X: " + data);
    }
});

3 个答案:

答案 0 :(得分:9)

在我看来,你有三种选择。

<强> 1。使用JSONP

JSONP允许您进行跨域ajax调用,以便您可以从其他域调用您的家庭服务器而不会受到阻碍。 这可能是我思考的最简单的路线。

请参阅此处,快速了解JSONP的工作原理:
https://stackoverflow.com/a/2067584/867294

jQuery支持jsonp,因此开始时并不困难:
http://learn.jquery.com/ajax/working-with-jsonp/

JSONP通过动态地向文档添加脚本然后调用回调来工作。 javascript文件的内容需要由服务器生成,你的PHP文件add-to-mysql.php将不得不回应如下:

<?= htmlspecialchars($_GET["callback"]) =>('someData you want to return');

您也可以通过one:数组访问从jQuery传入的$_GET参数,因为这只是GET请求。

从客户端,您可以像这样调用此路由: 请注意,这将始终是GET请求,所有参数都将通过URL。 &#39;回调&#39;参数是这里的连接因素,它确保PHP方知道要生成什么JavaScript函数。

$.ajax({
    jsonp: 'callback',
    dataType: "jsonp",
    url: 'http://my-server.com/add-to-mysql.php',
    data: { one: hash }, //an antikatastiso to hash me to a ke kano to md5 meso php sto ajax vgenei to idio
    success: function(data) {       
        alert("success! X: " + data);
    }
});

<强> 2。使用CORS

CORS将允许您对运行JS的其他域进行ajax调用。但是,这需要您从服务html页面发送特殊的http标头,因此这需要您修改服务器。

请参阅此处获取有关CORS的qucik简介:

http://www.html5rocks.com/en/tutorials/cors/

简而言之,您需要从服务html页面设置的标题是:

Access-Control-Allow-Origin: http://domain.com
Access-Control-Expose-Headers: list,of,headers

第3。发布到iFrame

通过隐藏的iFrame发布也是一种选择。 为此,您需要将target的{​​{1}}设置为form的{​​{1}},这里的优点是您也可以使用name。您也可以通过jQuery提交和填充表单。

iframe

如果您不想在页面上显示,则可以将所有内容放入隐藏的div中:

POST

如果您不需要任何反馈,也可以使用参数设置iframe的网址。

$('#one_input').val('someHash');
$('#myForm').submit();

<强>附加

您也可以将iframe与Window.postMessage一起使用 以前一个例子为基础:

<div style='display:none;'>
    <form id="myForm" action="http://my-server.com/add-to-mysql.php" method="post" target="my_iframe">
       <input type="input" id="one_input" value="" />
    </form>
    <iframe name="my_iframe" ></iframe>
</div>

但是这需要您已经在iframe中加载了一个页面,然后通过JavaScript接收该消息,因此我不认为这是您正在寻找的内容。

答案 1 :(得分:1)

Google Analytics提供了一个不会发布数据的脚本,它会异步加载脚本(这对于避免弄乱原始网站的加载时间非常重要),然后它会发送所有要求提供的信息。 gif图像。您的代码应该以.gif结尾的URL发出请求,其中包含GET格式的所有数据。做你的魔法并返回一个大小为1px * 1px并且没有内容的gif。

只需要这样的东西

yourdomain.com/a.gif?cookie=1234aqfajsdlq....&uid=qekjlajdfa

将所有数据放入其中 我建议稍微混淆一下,但这应该可以帮助你避免使用cors,iframes或jsop

修改

<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', 'id', 'domain');
  ga('send', 'pageview');
</script>

这是从GA获得的。看到它创建了一个标记,使用async属性来避免加载时间问题(记住同步脚本会停止页面呈现)。然后它创建并在数组中推送元组中所需的所有信息。它将窗口中的ga定义为将其所有参数推送到q的函数。 您可以创建一个脚本,使用js,cookie,域等获取所需的所有数据并发送到服务器。 例如,您需要用户正在访问的域:

//You won't have jquery, but you get the idea
//Create a tag
var i = $('<img>').prop('src', 'yourdomain.com/a.gif?domain' + window.location.origin).css('display', 'none');
$('body').append(i);

在某些时候你必须设置一个cookie。我的东西饼干不能跨域,所以你应该在你的请求中设置它们而不是js。 在服务器端,您检查cookie,如果没有,则创建,并且您可以在那里跟踪许多内容。

之后,您的脚本可以检查cors支持,并在没有这个的情况下使用ajax。我不推荐JSONP,非常容易出错,而且实际上是一种黑客攻击

答案 2 :(得分:0)

为了避免跨网域问题,您可以在其他网站上添加iframe,从您的网站加载。它创建了自己的范围(域),您可以从内部与您的站点进行通信时自由使用ajax。 但是,如果您在那里设置了Cookie,则会将其与iframes源域(您的域)相关联。这可能是也可能不是问题。请注意,这可用于识别所有其他域中的用户,包括此相同的iframe(来自您的域)。