我们在 Windows 机器上运行了一个 repo 服务器,它提供一些静态文件,这些文件应该由我们的工作节点使用 Python-urllib 来抓取。问题在于,当我们使用 Python 向我们知道存在的文件发出请求时,我们会收到 404 错误,但是,如果我直接从浏览器访问该文件,使用 Python-urllib 正在使用的相同链接,它就可以正常工作,并且文件会被下载。示例访问日志:
xxx.xxx.xxx.xxx - - [24/Jul/2013:17:15:53 -0400] "POST /x/dl/Bukkit_Beta.jar.conf HTTP/1.1" 405 172 "-" "Python-urllib/2.7"
我确实注意到 error.log 中有一些奇怪的事情:
2013/08/04 22:29:11 [error] 6456#2696: *807 CreateFile() "C:\Users\Administrator\Desktop\Nginx/html/MCProHosting/dl/405" failed (2: The system cannot find the file specified), client: 198.15.64.226, server: localhost, request: "GET /MCProHosting/dl/405 HTTP/1.1", host: "repo.mcprohosting.com"
从这些日志来看,确实生成了 405 错误,而不是 404 错误,但 Python 显示了 404 页面。请注意,这是一个全新下载 nginx如果我们转移 htdocs/html 文件夹,相同的目录结构在 Apache 下也可以工作。
Nginx 未进行任何配置更改
答案1
答案2
404 错误页面是因为 nginx 找不到 405 错误页面,正如您从 nginx 错误日志中看到的那样。因此,真正的错误是请求不正确,并且返回了 405 错误。
检查HTTP 错误代码您可以看到 405 是“方法不允许”:
10.4.6 405 Method Not Allowed
The method specified in the Request-Line is not allowed for the resource identified
by the Request-URI. The response MUST include an Allow header containing a list of
valid methods for the requested resource.
所以你可能以错误的方式使用了 Python-urllib……很可能你使用了错误的 POST 方法。你有x-www-表单-urlencoded(即:POST 数据在 URL 中)并且多部分/表单数据(即:在已上传的文件中发布数据)。
因此,请重新检查您是如何执行 POST 请求的。