如何在Python中将请求重定向到不同的URL

27 投票
5 回答
68487 浏览
提问于 2025-04-15 20:47

我一直在寻找一种语法,用来把一个特定的URL重定向到一个远程服务器,以便进行一些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 个回答

9

这是一个完整的代码,用来实现重定向功能。你只需要把这个文件保存下来,然后作为一个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 " + str(PORT) )
handler.serve_forever()
26

Python 3

python3 中,做法和其他答案很相似,但还是有些不同,所以值得演示一下。

这个脚本的功能很简单,就是监听作为 参数 1 传入的端口,并向作为 参数 2 传入的 URL 发送一个 302(“找到”也就是临时重定向)响应。(它还包含一个使用说明。)

#!/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/

这个例子应该能给你足够的信息,让你写出任何你需要的功能。

29

要进行重定向,你需要返回一个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()

撰写回答