如何将请求转发到python中的其他URL

时间:2010-03-24 10:40:02

标签: python url redirect simplehttpserver

我一直在寻找将特殊网址重定向到远程服务器进行XSS测试的语法。有什么想法吗?

import SimpleHTTPServer
import SocketServer

class myHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
    def do_GET(self):
        print self.path 
        if self.path == '/analog':
-------------------->return "http://12b.dk/analog"???
        return SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self)

theport = 1234
Handler = myHandler
pywebserver = SocketServer.TCPServer(("", theport), Handler)

print "Python based web server. Serving at port", theport
pywebserver.serve_forever()

5 个答案:

答案 0 :(得分:20)

对于重定向,您必须返回代码301和Location标头。也许你可以尝试类似的东西:

class myHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
   def do_GET(self):
       self.send_response(301)
       self.send_header('Location','http://www.example.com')
       self.end_headers()

答案 1 :(得分:8)

这是一个完整的代码重定向,保存此文件并将其作为python程序运行。终止,ctrl + c。

import SimpleHTTPServer
import SocketServer
class myHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
   def do_GET(self):
       print self.path
       self.send_response(301)
       new_path = '%s%s'%('http://newserver.com', self.path)
       self.send_header('Location', new_path)
       self.end_headers()

PORT = 8000
handler = SocketServer.TCPServer(("", PORT), myHandler)
print "serving at port 8000"
handler.serve_forever()

答案 2 :(得分:4)

Python 3

python3中,它与其他答案非常相似,但又足以证明演示的合理性。

这是一个脚本,除了侦听作为参数1 传递的端口,并发送302(“Found”又名Temporary)重定向到作为参数2传递的URL 。 (它有一个用法信息。)

#!/usr/bin/env python3

import sys
from http.server import HTTPServer, BaseHTTPRequestHandler

if len(sys.argv)-1 != 2:
    print("""
Usage: {} <port_number> <url>
    """.format(sys.argv[0]))
    sys.exit()

class Redirect(BaseHTTPRequestHandler):
   def do_GET(self):
       self.send_response(302)
       self.send_header('Location', sys.argv[2])
       self.end_headers()

HTTPServer(("", int(sys.argv[1])), Redirect).serve_forever()

你称之为:

sudo ./redirect.py 80 http://jenkins.example.com:8080/

这个例子应该足以让你写出你需要的功能。

答案 3 :(得分:1)

HTTP状态代码301具有永久移动请求的含义,应该重定向到建议的URI,该URI设置为响应头字段,位置。但是,重定向的发生取决于浏览器的实现。

返回303告诉浏览器,可以在其他URI下找到对请求的响应,并有效地管理浏览器以将GET请求重定向到另一个URI,而不是301。 Hense,303是一个更好的选择。

答案 4 :(得分:1)

如果您尝试重定向其他类型的请求(例如POST),则可能需要使用状态代码307而不是301

    即使您发送了POST请求,
  • 301也会使用GET请求重定向
  • 307将使用您用于初始请求的相同方法

重定向GET和POST请求的示例代码:

class myHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
    def do_GET(self):
        self.redirect()
    def do_POST(self):
        self.redirect()
    def redirect():
        self.send_response(307)
        self.send_header('Location','http://www.example.com')
        self.end_headers()

注意:使用状态代码307potentially unsafe,因此建议不要对所有传入请求使用此状态代码。理想情况下,您只想将其使用限制在您知道安全的请求中。