これはPOSTのときはstdinからos.environ['CONTENT_LENGTH']の長さだけ拾ったものをクエリストリングとして認識するからなんですが、
#cgi.pyのこの部分 if headers is None: headers = {} if method == 'POST': # Set default content-type for POST to what's traditional headers['content-type'] = "application/x-www-form-urlencoded" if 'CONTENT_TYPE' in environ: headers['content-type'] = environ['CONTENT_TYPE'] if 'CONTENT_LENGTH' in environ: headers['content-length'] = environ['CONTENT_LENGTH'] ... if 'content-length' in self.headers: try: clen = int(self.headers['content-length']) except ValueError: pass if maxlen and clen > maxlen: raise ValueError, 'Maximum content length exceeded' self.length = clen self.list = self.file = None self.done = 0 if ctype == 'application/x-www-form-urlencoded': self.read_urlencoded() elif ctype[:10] == 'multipart/': self.read_multi(environ, keep_blank_values, strict_parsing) else: self.read_single()
しかしmod_rewriteが付加したクエリはos.environ['QUERY_STRING']に入っているので、
#hoge.py?foo=foovalue&bar=barvalue に書き換えた q = cgi.parse_qs(os.environ['QUERY_STRING']) print q >> { 'foo': ['foovalue'], 'bar': ['barvalue'] }
とすればこれを取得できます。
もちろんcgi.FieldStorage()に影響はないのでPOSTしたデータはそちらから取得可能。