【发布时间】:2011-03-15 02:44:23
【问题描述】:
我在一个网站上工作,拥有 3 个不同的分支机构。典型的 dev->stage->production 情况。
所有 3 个都在 3 个不同的 url 上运行:
所以我试图让通用代码在所有 3 个上运行而不对文件路径进行任何修改。
为了实现这一点,我只设置了base_path var 设置为为此特定分支配置的任何 CodeIgniter 安装。
var base_url = "<?=base_url();?>"; // This sets base_url accordingly.
$.post(base_url + 'login/ajaxLogin', { // See note below
login_email: $('#login_email').val(),
login_pass: $('#login_pass').val(),
},
function(data) {
if(data == 'true') {
window.location.href = base_url;
} else {
$('h2').replaceWith('<h2 style="color:#b81900;">Login Failed</h2>');
return false;
}
});
以上代码在 Chrome 中运行良好。但它在 Safari 和 Firefox 中不起作用。
在 Firefox 中它静默失败,在 Safari 中我得到 "Unable to load resource: cancelled"
注意:如果我删除 base_url 并将脚本路径设置为 /login/ajaxLogin、/dev/login/ajaxLogin 或 /stage/login/ajaxLogin 一切正常。
我似乎遇到了跨域脚本限制,但我不知道为什么?
是的,我熟悉Same Origin Policy,是的,我在 jQuery 的网站上看到过这个:
由于浏览器的安全限制,大多数“Ajax”请求都是同源的 政策;请求无法从不同域、子域、 或协议。
如果带有
jQuery.post()的请求返回错误代码,它将静默失败,除非 脚本还调用了全局.ajaxError()方法。
以上都不适用于我的情况,因为我在自己的域中,所以我不完全确定发生了什么,但我真的很想找到解决这个问题的方法。
【问题讨论】:
-
我要问第一个愚蠢的问题,但是 base_path 函数是否在所有实例中都返回相同的路径?
-
首先,查找这个 PHP 实际生成的 Javascript 是值得的,其次,使用 Chrome 开发者工具或 Firebug 来查找失败请求的 URL。
-
base_url()会在 url 中添加一个斜杠,因此您可能会得到类似http://url.com//stage/login/ajaxLogin这样的东西,这可能会让事情变得很糟糕。正如@Matchu 所说,检查正在生成的 URL。 -
@jerebear:是的,我相信确实如此。我登录到控制台,它看起来不错。 @Matchu:是的,我使用了开发工具和萤火虫。还查看了服务器日志。一切看起来都一样,除了 Firefox 执行
OPTIONS请求而不是POST@stormdrain:是的。我知道,这就是为什么我有base_url + 'login/ajaxLogin'来补偿斜杠 -
看起来您正在设置一个名为“base_path”的变量,然后使用“base_url”?
标签: php firefox jquery safari google-chrome