【问题标题】:jQuery - GET News.html 404 (Not Found)jQuery - 获取 News.html 404(未找到)
【发布时间】:2013-07-15 06:58:50
【问题描述】:

由于某种原因,这不起作用:

$.ajax({
    url: "News.html",
    cache: false,
}).done(function(data) {
    $("#content").load(data);
});

它给了我:

GET http://127.0.0.1/News.html 404 (Not Found)

但无论出于何种原因,手动打开该网址(复制粘贴网址)工作就可以了。 起初我认为它与浏览器缓存有关,所以我在 ajax 函数中添加了cache: false 选项,但即便如此.. 啊..

在我的access.log 文件中显示为请求的 URL..

关于我猜的信息,我正在跑步:

  • 轻量级
  • php 通过 localhost:port 作为 fast-cgi
  • 映射的 .html => .php
  • 运行 OpenBSD 5.3

未注释(/etc/php.ini):

  • cgi.fix_pathinfo=1

还有:

# ls *.html
News.html     index.html

这是News.html 的请求标头:

Request URL:http://127.0.0.1/News.html
Request Method:GET
Status Code:404 Not Found

请求标头

Accept:*/*
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Host:127.0.0.1
Referer:http://127.0.0.1/index.php
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.71 Safari/537.36
X-Requested-With:XMLHttpRequest

响应标头

Content-type:text/html
Date:Tue, 16 Jul 2013 21:55:05 GMT
Server:lighttpd/1.4.32
Transfer-Encoding:chunked
X-Powered-By:PHP/5.3.21

检查点

到目前为止,来自 cmets 的结论是,这可能根本不是 jQuery 问题。 考虑到服务器响应所有数据(我检查了发送的原始数据)并且它包含所有内容,但响应 header 显示404

意思是,数据找到了,但标题说 404... 至少可以说很奇怪..

卷曲测试

curl 'http://127.0.0.1/News.html' -H 'Accept-Encoding: gzip,deflate,sdch' -H 'Host: 127.0.0.1' -H 'Accept-Language: en-US,en;q=0.8' -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.71 Safari/537.36' -H 'Accept: */*' -H 'Referer: http://127.0.0.1/' -H 'X-Requested-With: XMLHttpRequest' -H 'Connection: keep-alive' -H 'Cache-Control: max-age=0' --compressed
Here you'll soon find a facebook feed, among other things :)

Zerkms 测试

# echo "wham bam" > zerkms_doesnt_believe.html
# 

配置文件

错误日志和什么

卷曲测试

通过 Python 客户端手动进行 FastCGI 测试:

# python fcgi_app.py  
{'FCGI_MAX_CONNS': '1', 'FCGI_MPXS_CONNS': '0', 'FCGI_MAX_REQS': '1'}

经过一番修改,我弄清楚了 FastCGI 协议是如何工作的,并且我找到了一个符合我需求的客户端,有趣的是它与我的脚本名称相匹配,所以这是输出:

# python fcgi_app.py  
('404 Not Found', [('x-powered-by', 'PHP/5.3.21'), ('content-type', 'text/html')], '<html>\n\t<head>\n\t\t<title>test php</title>\n\t</head>\n<body>\nChecking</body>\n</html>', '')

还有Here's the source

给我的结论是这实际上是一个 PHP 问题(即使我讨厌 lighttpd 不尊重 php 应该响应的 200 个代码)。对此我很抱歉。应该继续 bash PHP,看看这是否有助于我得出结论)

临时解决方案

将以下内容放在 .php 页面的顶部将解决此问题。 请注意,这是一个干净的解决方法,它会起作用,但肯定不是长期修复。

<?php
    header("HTTP/1.0 200 Found");
?>

【问题讨论】:

  • 你确定 News.html 是用大写的 N 写的吗?
  • @Jorge 没有帮助,首先.. 运行lighttpd,其次.. 这不是 Windows。重启并不能解决当前的问题。
  • @Torxed:创建带有一些内容的zerkms_doesnt_believe.html 文件并请求它而不是News.html
  • 好吧,我没主意了 :-S 祝你好运(几天后再读)
  • 您在消除作为原因的请求、代理和传输方面做得很好。在服务器端,lighttpd 和 php 都可以将 headers 添加到将覆盖默认 headers 的响应中。你能附上你的 lighttpd 配置吗?

标签: php ajax jquery


【解决方案1】:

这听起来有点像同源政策问题。 您指定的路径可能会导致问题。 试试

$.ajax({
    url: "/News.html",
    cache: false,
}).done(function(data) {
    $("#content").load(data);
});

如果有帮助,请告诉我(我们)。

【讨论】:

  • 很抱歉,正如问题中冗长的对话所述,这本身不是“加载内容”问题,而是服务器将恶意标头发送到完美内容。指定/News.html时的响应一样,“加载资源失败:服务器响应状态为404(未找到)”
【解决方案2】:

这个让我有点受阻。感觉到一些强迫性的冲动,我在一个新的 Ubuntu 12.10 VM 上安装了 lighttpd 和 php5(手边没有 BSD)。我不得不从kqueue 修改为poll,但除此之外,我使用了你的 lighttpd.conf。一切正常。

然后我安装了您的 php.ini 文件和 BAM http 状态 404,同时返回正确的内容。因此,它缩小到 php-cgi。

原来当服务启动时,它会记录

PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/lib/php-5.3/modules/pdo.so' - /usr/local/lib/php-5.3/modules/pdo.so: cannot open shared object file: No such file or directory in Unknown on line 0

于是 id 进行了快速搜索,并将 php.ini 中的一行从

extension_dir = "/usr/local/lib/php-5.3/modules"

extension_dir = "/usr/lib/php5/20100525"

重新启动 php-cgi,然后查看状态 200 以显示内容。

【讨论】:

  • 这根本没有帮助,很抱歉。我的系统上没有这样的错误消息,因为我正在运行 OpenBSD /user/local/lib/php-5.3/modules 实际上确实存在。 pdo.so 不是我系统上的模块,所以我不明白为什么它甚至会为我加载?
  • 我的意思是,当 php-cgi 出现问题时,如您所描述的那样出现错误,这表明问题出在哪里。你有 php-cgi 记录到 syslog,如果你没有得到任何条目,你可以使用 tcpdump -s 1500 -w ~/file.cap -Xi lo0 port 9123 捕获进程间流量,然后请求页面并检查捕获以确定问题是否在来自 php- 的回复中cgi 或 lighttpd 对它的解释。
  • 明白了,考虑到你的帖子描述了“调试”步骤,我很困惑,这些步骤基本上只是告诉我检查我的日志,我有这些日志,但它们是空的(出于多种原因)并且考虑到 php 没有除了 lighttpd 没有记录任何东西,我认为这是一个 lighttpd 问题,后来证明不是。但我相信你的建议对我以外的任何人都是可行的和有帮助的,所以我会给你一个点,但不幸的是它没有帮助。然而,我的 PHP 配置有问题,我需要纠正一下,所以你是对的..
【解决方案3】:

设置新的 OpenBSD 5.3 服务器并使用您的配置文件进行安装后,我能够缩小根本原因。

在 lighttpd.conf 中你有 server.chroot = "/var/www/" 所以它的所有路径名都排除了前面的 /var/www。 php-fastcgi 进程没有 chroot,所以它对文件系统的看法略有不同。

解决方案 #1: 不要 chroot lighttpd 并将 server.document-rootaccesslog.filenameserver.errorlog 更改为绝对路径。

解决方案 #2: 使用 php-fpm 或类似的东西来使 PHP chroot 感知/能力

【讨论】:

  • 这听起来很符合我的问题解决方案,不知道为什么我自己没有想到。我明天去试试!
【解决方案4】:

使用简单的 jQuery .load() 方法:

$(document).ready(function () {
    $("#content").load('News.html');
});

【讨论】:

  • 同样的问题,load() 函数最终建立在一个简单的 AJAX 请求之上,问题不是“获取数据”方法,而是来自服务器的返回码。服务器发送正确的 data 但不正确的 headers 这使 jQuery 感到困惑..
猜你喜欢
  • 1970-01-01
  • 2022-11-02
  • 2016-09-13
  • 2020-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-07
  • 2021-03-31
相关资源
最近更新 更多