如何不将我的源代码复制到其他服务器并为他们提供JS或iframe,就像分析和统计提供者一样?
我用JS编写了一个PHP脚本,其基本描述如下: 当有人访问我的网站时,获取一个具有唯一标识值的cookie,同时使用AJAX我做了一些检查,并相应地将相同的值保存到mysql。在此之后,如果他再次访问我的网站(在大多数情况下),则不会再次创建cookie。
深度:
使用JS创建cookie值,我希望将其保留在未来的增强中。
我的代码(index.php
,add-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);
}
});
答案 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(来自您的域)。