2010-03-02 111 views
19

我很难让AJAX请求在临时服务器上工作。它在我的开发机器上运行得很好,但是当我上传它时,所有的AJAX请求都停止工作。我发现,如果我将相关网址(例如“index.php”)更改为绝对网址(“http://example.com/index.php”),请求将再次生效,但我不明白为什么。jQuery AJAX请求中的相对与绝对网址

请求示例:

jQuery.post('index.php', {id: 1234, action: 1, step: 1}, function(data) { /* something */ }); 

这是不行的,我甚至不Firebug控制台显示出来。虽然成功处理程序被调用,但这很令人困惑。

这只是正常:

jQuery.post('http://example.com/index.php', {id: 1234, action: 1, step: 1}, function(data) { /* something */ }); 

任何人能解释为什么AJAX请求这样的行为? x_X

+0

检查本地和公共服务器上php短标签的区别,有时候这是问题。 – Sarfraz 2010-03-02 13:54:55

+1

您是否使用网址重写?在正常情况下,它应该像上面定义的那样工作。 – 2010-03-02 13:55:57

+0

是的,我正在使用URL重写。每个网址都被重写为index.php。它是一个Typo3 Realurl设置... – fresskoma 2010-03-02 14:30:02

回答

34

尝试在index.php之前在第一个示例中添加/以强制它从根目录查看。请仔细检查以确保您的目录结构是,正好index.php所在的位置相同。

+0

如果这是问题,那么我不应该得到404响应吗?在我的情况下,这个请求甚至没有出现在萤火虫中...这是奇怪的事情...我会尝试用/虽然。 – fresskoma 2010-03-02 14:31:58

+0

不知道更多关于你的项目,我不能说。 – Sampson 2010-03-02 14:44:27

3

这是一个老帖子,所以我很抱歉把它拖出来。但这显然与我的问题有关,这是Google的最高结果。

经过一些试验完全相同的问题后,我确定了答案。

无论你在哪里运行脚本,所要求的文件是相对于/

例如,在我的文件结构我有一个文件夹名为JS。在它下面是我的ajaxProcess.js文件。我试图读取的xml文件位于同一个目录中,因此遵循标准规则,它对ajax调用的url有意义,只需要url:'myfile.xml' 但是,这不起作用。

在玩了一段时间之后,我把我的xml放入/并再次运行了ajax。 Vuala!

一些更多的打过来,我发现这不要紧,你叫从所有的JS,它仍然会默认为/

最后我把我的xml文件夹中的“XML”和现在以下阿贾克斯将在任何地方工作:

$.ajax({ 
     type:'get', 
     dataType: 'xml', 
     url: 'xml/class.xml', 
     success: function(xml){ 
      $(xml).find('class').each(function(){ 
       //code here 
      }) 
     } 
    }); 
+2

它与'/'不是相对的,而是相对于浏览器地址栏中的网址。如果您的目录结构中有多个级别的HTML文件,这将成为一个重要的区别。 – Paulpro 2012-05-07 01:16:31

5

,如果你是在一个MVC框架中使用URL路由,例如,它永远是相对于页面的执行贯穿而过,这并不一定匹配URL中你的地址栏。

考虑以下文件结构:

mysite/index.php 
mysite/resources/javascript/my_javascript.js 
mysite/resources/css/my_css.css 

通常情况下,MVC框架的路线,通过一个单一的文件中的所有页面请求,如index.php文件(http://www.mysite.com/index.php)。这使得使用相对URL变得容易,因为资源和脚本将始终处于相同的相对路径。 JavaScript将永远在/ resources/javascript/ 无论浏览器地址栏中有什么内容,CSS都将始终处于/ resources/css/

。它可能是:

http://www.mysite.com/index/ 
http://www.mysite.com/kittens/ 
http://www.mysite.com/kittens/cute/ 
http://www.mysite.com/kittens/fluffy/ 
etc.. 
+0

运行在客户端上的JavaScript如何知道服务器使用的路由方法?例如,客户端应该不会意识到一切都在经历index.php。 – developerbmw 2015-03-30 06:13:46

+0

Brett,它没有。你为什么要这样做? – dalemac 2015-03-30 13:20:11

2

我认为避免这种问题的最好方法是在HTML头部设置javascripts的配置文件。您可以在页头这样的事情:

<script> 
     var url = "http:\/\/www.yourdomain.com\/application"; 
     var path = "\/path\/on\/server\/to root folder"; 
</script> 

另一种方法是将这些变量附加到window对象:

<script> 
window.myUrl = "http:\/\/www.yourdomain.com\/application"; 
... 
    </script> 

所以,以后你可以用里面的js文件中的这些变量:

jQuery.post(url+'/index.php', {id: 1234, action: 1, step: 1}, function(data) { // something }); 

头文件中的脚本可以根据您的应用程序配置自动生成,因此当部署应用程序时,url和路径变量会相应地更改。