从cgi.FieldStorage中检索完整的URL

时间:2015-01-06 12:58:40

标签: python cgi

我正在使用cgi.FieldStorage()将URL传递给python脚本:

http://localhost/cgi-bin/test.py?file=http://localhost/test.xml

test.py只包含

#!/usr/bin/env python

import cgi
print "Access-Control-Allow-Origin: *"
print "Content-Type: text/plain; charset=x-user-defined"
print "Accept-Ranges: bytes"
print
print cgi.FieldStorage()

,结果是

FieldStorage(None, None, [MiniFieldStorage('file', 'http:/localhost/test.xml')])

请注意,该URL仅包含http:/localhost - 如何传递完整编码的URI,以便该文件是整个URI?我已经尝试编码文件参数(http%3A%2F%2Flocalhost%2ftext.xml),但这也不起作用

屏幕截图显示网页的输出不是预期的,但编码的网址是正确的

enter image description here

2 个答案:

答案 0 :(得分:1)

使用Apache 2.4.10和Firefox(curl),你的CGI脚本也适用于我。您使用的是哪种Web服务器和浏览器?

我的猜测是你正在使用Python CGIHTTPServer,或基于它的东西。这表明您确定的问题。 CGIHTTPServer假定它正在提供CGI脚本的路径,因此它会折叠路径,而不考虑可能存在的任何查询字符串。折叠路径会删除重复的正斜杠以及相对路径元素,例如..

如果您使用的是此网络服务器,我不会通过更改网址看到任何明显的方法。你不会在生产中使用它,所以也许看看另一个web服务器,如Apache,nginx,lighttpd等。

答案 1 :(得分:-1)

问题在于您的查询参数,您应该对它们进行编码:

>>> from urllib import urlencode
>>> urlencode({'file': 'http://localhost/test.xml', 'other': 'this/has/forward/slashes'})
'other=this%2Fhas%2Fforward%2Fslashes&file=http%3A%2F%2Flocalhost%2Ftest.xml'