我正在尝试使用python http.client访问我当地的TWiki安装。出于某种原因,我总是以403 Forbidden结束。我可以访问我服务器中的其他子文件夹,但不能访问twiki。我可以通过curl访问这个TWiki页面。使用python http.client访问/ bin /或/ cgi-bin /文件夹时是否需要做一些特殊的事情?
以下是twiki.org页面的示例,因为我的localhost无法在外部访问:
>>> import httplib
>>> conn = httplib.HTTPConnection("twiki.org")
>>> conn.request("GET", "/cgi-bin/view/")
>>> r1 = conn.getresponse()
>>> print r1.status, r1.reason
403 Forbidden
>>> data1 = r1.read()
>>> data1
'<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">\n<html><head>\n<title>403 Forbidden</title>\n</head><body>\n<h1>Forbidden</h1>\n<p>You don\'t have permission to access /cgi-bin/view/\non this server.</p>\n<hr>\n<address>Apache/2.2.3 (CentOS) Server at twiki.org Port 80</address>\n</body></html>\n'
>>>
答案 0 :(得分:1)
我自己尝试了这个,我发现设置一个User-Agent
标题似乎解决了这个问题。标题是什么似乎并不重要,只是它被设置:
>>> import httplib
>>> conn = httplib.HTTPConnection("twiki.org")
>>> conn.request("GET", "/cgi-bin/view/", headers={"User-Agent": "foo"})
>>> r1 = conn.getresponse()
>>> print r1.status, r1.reason
200 OK
不幸的是,我无法阐明为什么Twiki返回没有User-Agent
标题的403的原因 - 我只是尝试了它,因为它是客户端之间可能存在的差异之一。我认为这是因为它试图决定是否返回该网站的移动版本,但是如果不优雅地处理没有标题的情况,那真的很差。
希望至少为你提供一种解决方法。
修改强>
显然,这是他们default Apache config使用BrowserMatchNoCase
指令设置环境变量blockAccess
的一部分,该变量可能会在以后被提取以返回观察到的403 Forbidden
响应。< / p>
他们似乎认为这会以某种方式阻止DoS攻击,尽管我真的不相信任何可以通过简单地设置随机User-Agent
字符串来解决的问题。从配置中可以看出,他们还有一个他们试图阻止的“已知坏”用户代理列表。您可以通过尝试使用其中一个从命令行获取来观察此情况:
$ GET -Ssed -H "User-Agent: some-random-name" http://twiki.org/cgi-bin/view/
GET http://twiki.org/cgi-bin/view/
200 OK
[...]
$ GET -Ssed -H "User-Agent: FAST" http://twiki.org/cgi-bin/view/
GET http://twiki.org/cgi-bin/view/
403 Forbidden
[...]
我确信他们有理由这样做,但我必须说我没有留下深刻的印象。