【问题标题】:How do I redirect a request to a different url in python如何在python中将请求重定向到不同的url
【发布时间】:2011-01-31 04:56:01
【问题描述】:

我一直在寻找将特殊 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()

【问题讨论】:

    标签: python url redirect simplehttpserver


    【解决方案1】:

    对于重定向,您必须返回代码 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()
    

    【讨论】:

      【解决方案2】:

      Python 3

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

      这是一个脚本,除了侦听作为参数 1 传递的端口并将 302(“找到”又名临时)重定向到作为 参数 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/
      

      该示例应该足以让您编写所需的任何类型的函数。

      【讨论】:

      • 用Python3回答问题,为你点赞,先生。
      【解决方案3】:

      这是用于重定向、保存此文件并将其作为 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()
      

      【讨论】:

        【解决方案4】:

        如果您尝试重定向其他类型的请求(例如 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):
                self.send_response(307)
                self.send_header('Location','http://www.example.com')
                self.end_headers()
        

        注意:使用状态码307potentially unsafe,因此不建议对所有传入请求使用此状态码。理想情况下,您希望仅将其用于您知道是安全的请求。

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-04-01
            • 1970-01-01
            • 1970-01-01
            • 2012-06-19
            • 1970-01-01
            相关资源
            最近更新 更多