我的第一篇文章——首先不得不说这个网站很棒——它帮助了我很多次,而我不必问任何问题。到目前为止!
我运行一个使用 PHP / MySql / JQuery 构建的 web 应用程序 - 绝对所有内容都是使用 JQuery AJAX 加载/发布的 - .load() 和 .post() 我有许多不同的客户端使用这个 webapp,所有的 sumdomains 的形式都是:client1 .example.com、client2.example.com,而 example.com 是广告页面。
当我的客户很少时,我复制了文件 - 例如,client1 的所有必要文件都在文件夹 example/client1/ 中,而 client 2 将在 example/client2/ 获得精确副本
随着我的客户数量增加,我改变了结构所以客户端共享公共文件 - 现在 AJAX 调用将从文件夹 /example/client1 转到 /example
这工作正常,因为每个客户端子域都被重定向到实际文件夹 - 例如,client1.example.com 被重定向到 example.com/client1 这种重定向是必要的,这样 AJAX 调用就不会由于浏览器的同源策略而失败。
这导致的问题是,不同客户端之间的普通用户可以通过在登录后更改其 URL(例如从 example/client1 到 example/client2)来查看来自其他系统的信息,因为 PHP 会话不是独占的 - 每个客户端都被感知因为在同一个域上 - example.com。
要解决这个问题,可以使用没有重定向的子域——因为这样 PHP 会话将是独占的。
由于同源策略,这样做会导致对父文件夹的所有 AJAX 调用失败。:(
我研究了这个跨域 AJAX 请求问题并尝试了许多不同的解决方案:
1) 使用 iFrame 进行隧道 - 父文件夹中的 AJAX 对象 - AJAX 调用成功 - 但 PHP 会话出现同样的问题 - 域被视为 example.com 而不是 client1.example.com
2)设置 document.domain=example.com 的技巧 - 似乎不起作用 - 我认为这是一个过时的解决方法
3) 设置 PHP 头文件 - header('Access-Control-Allow-Origin: '.$_SERVER['HTTP_ORIGIN']); 根本不起作用
我不想为 ajax 调用使用任何不同的库。
目前我提出了两个选择:
1)使用为每个客户端复制文件的旧方法,我宁愿不这样做,因为它浪费空间并且使更新文件变得痛苦 - 我必须替换许多文件而不仅仅是 1。
2) 在每个客户端目录中使用 PHP 基本文件,该文件将接收所有 AJAX 调用,然后包含来自父文件夹的请求文件。我已经对此进行了测试,它似乎运行良好 - 所以这是我会选择的选项,除非有人有更好的解决方案?
详细说明此选项:
假设我从子域中的页面发布:http
://client1.example.com
而不是调用 $.post'(http://example.com/file.php'); (这将失败)
我调用 $.post('http://client1.example.com/base.php',{target:'file.php'})
然后从 base.php 只需 include('../' .$_REQUEST['目标'])
我很高兴选择选项 2,但这只是让我想知道是否有更好的方法? *其他人遇到过类似的问题吗?*
干杯! Ĵ