Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 奇数重定向位置导致urllib2出现代理错误_Python_Urllib2 - Fatal编程技术网

Python 奇数重定向位置导致urllib2出现代理错误

Python 奇数重定向位置导致urllib2出现代理错误,python,urllib2,Python,Urllib2,我正在使用urllib2使用Python 2.7.3执行http post请求。我的请求返回HTTPError异常(HTTP错误502:代理错误) 查看Charles的信息流量,我看到以下情况: 我使用urllib2发送HTTP请求(POST/index.asp?action=login HTTP/1.1) 远程服务器回复状态为303,位置头为../index.asp?action=news urllib2重试发送get请求:(get/。/index.asp?action=news HTTP/1

我正在使用urllib2使用Python 2.7.3执行http post请求。我的请求返回HTTPError异常(HTTP错误502:代理错误)

查看Charles的信息流量,我看到以下情况:

  • 我使用urllib2发送HTTP请求(POST/index.asp?action=login HTTP/1.1)
  • 远程服务器回复状态为303,位置头为../index.asp?action=news
  • urllib2重试发送get请求:(get/。/index.asp?action=news HTTP/1.1)
  • 远程服务器回复状态为502(代理错误)
  • 502回复在响应正文中包含以下内容:“10.0.0.30:80index.asp的DNS查找失败”(注意格式错误的URL)

    因此,我认为这意味着远程服务器网络上的代理服务器在请求中看到“/../index.asp”URL,并对其进行错误解释,以错误的URL发送我的请求

    当我使用浏览器(Chrome)发出相同的请求时,会将重试发送到GET/index.asp?action=news。因此,Chrome从URL中去掉了前导“/…”,远程服务器用有效的响应进行响应

    这是urllib2错误吗?我可以做些什么来让重试忽略URL中的“/…”吗?还是有其他方法来解决这个问题?我认为这可能是一个urllib2错误,于是用请求替换了urllib2,但请求产生了相同的结果。当然,这可能是因为请求是基于urllib2构建的


    感谢您的帮助。

    随302一起发送的位置在多个方面都是错误的

    首先,如果读取(HTTP/1.1头字段定义)14.30位置,则该位置必须是绝对URI,而不是相对URI。第10.3.3节明确了这是相关定义

    第二,即使允许使用相对URI,也可以使用相对统一的资源定位器4。解析相对URL,步骤6,仅指定模式
    /../
    中的
    .
    的特殊处理。这意味着相对URL不应该以
    开头。
    。因此,即使基本URL是
    http://example.com/foo/bar/
    和相对URL是
    。/baz/
    ,解析的URL不是
    http://example.com/foo/baz/
    ,但
    http://example.com/foo/bar/../baz
    。(当然,大多数服务器都会以相同的方式处理这些问题,但这取决于每台服务器。)

    最后,即使在解析
    之前组合了相对URL和基本URL,路径以
    开头的绝对URI也是无效的

    因此,错误在服务器的配置中

    现在,很多用户代理都会解决这个bug。特别是,他们将
    /../foo
    转化为
    /foo
    ,以阻止用户(或在不知情的情况下代表他们运行的任意JS)尝试进行“逃离webroot”攻击

    但这并不意味着
    urllib2
    应该这样做,也不意味着不这样做是错误的。当然,
    urllib2
    应该更早地检测到错误,这样它就可以告诉您“无效路径”之类的信息,而不是同时运行一个非法的绝对URI,这会使服务器混淆,从而向您发回无意义的错误。但失败是正确的

    说服务器配置是错误的是好的,但除非你是服务器的负责人,否则你可能会面临一场艰苦的战斗,试图说服他们他们的网站已经损坏,当它与他们关心的每个web浏览器一起工作时,需要对其进行修复。这意味着您可能需要编写自己的变通方法来处理他们的站点


    使用
    urllib2
    实现这一点的方法是为您自己提供一个
    redirect\u request
    方法的实现,该方法可以识别这种情况,并返回与默认代码不同的
    request
    (尤其是,
    http://example.com/index.asp?action=news
    而不是
    http://example.com/../index.asp?action=news
    ).

    当您尝试使用Chrome时,位置头是否也会出现
    。/index.asp?action=news
    ?我认为这是一个无效的位置,在这种情况下,它确实是服务器配置中的一个错误。如果是这样,Chrome和许多其他浏览器都能解决这个错误,但这并不意味着
    urllib2
    是一个错误。哇,太棒了解释–彻底而清晰。我将研究HTTPRedirectHandler.abamert,谢谢你的帮助。我实现了一个HTTPRedirectHandler,它给了我所需要的一切。@david193:很高兴提供帮助。同时,向运行远程服务器的人提交一个bug,因为你不应该一开始就处理这个问题…