Как переслать запрос на другой URL в Python - PullRequest
18 голосов
/ 24 марта 2010

Я искал синтаксис для перенаправления специального 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 ]

20 голосов
/ 24 марта 2010

Для перенаправления необходимо вернуть код 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()
8 голосов
/ 05 марта 2014

Это полный фрагмент кода для перенаправления, сохранения этого файла и запуска его как программы на языке 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 голосов
/ 02 ноября 2017

Python 3

В python3 это сделано очень похоже на другие ответы, но достаточно отличается, чтобы оправдать демонстрацию.

Это скрипт, который ничего не делает, кроме прослушивания порта, переданного как аргумент 1 и отправки 302 («Найдено» или временный) перенаправления на URL, переданный как аргумент 2, (И у него есть сообщение об использовании.)

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

Этот пример должен дать вам достаточно, чтобы написать, какая функция вам нужна.

1 голос
/ 30 мая 2018

Если вы пытаетесь перенаправить другие типы запросов (например, POST), вам может потребоваться использовать код состояния 307 вместо 301.

  • 301 будет перенаправлять с GET-запросом, даже если вы отправили POST-запрос
  • 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()

Примечание : использование кода состояния 307 является потенциально небезопасным , поэтому использование этого кода состояния для всех входящих запросов не рекомендуется. В идеале вы хотели бы ограничить его использование только для запросов, которые, как вы знаете, безопасны .

1 голос
/ 07 ноября 2014

HTTP-код состояния 301 имеет значение запроса, перемещенного навсегда, и должен быть перенаправлен на предложенный URI, для которого установлено поле заголовка ответа, местоположение. Однако перенаправление происходит в зависимости от реализации браузеров.

Вместо 301 возврат 303 сообщает браузеру, что ответ на запрос можно найти под другим URI, и эффективно управляет браузером, чтобы перенаправить запрос GET на другой URI. Hense, 303 - лучший вариант.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...