Nginx 使用 Python-urllib 返回 404,但如果从浏览器访问则正常

Nginx 使用 Python-urllib 返回 404,但如果从浏览器访问则正常

我们在 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

您不能对 nginx 中的静态资源发出 POST 请求,就是这样。

但你可以通过使用error_page指示:

error_page 405 =200 $request_uri;

答案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 请求的。

相关内容