【问题标题】:How to make very simple http proxy using werkzeug or other python requests framework?如何使用 werkzeug 或其他 python 请求框架制作非常简单的 http 代理?
【发布时间】:2012-06-15 03:42:07
【问题描述】:

是否可以在端口 9090 上设置一个侦听器并添加一个标头,例如 Host: test.host 到每个在 9090 上传入的请求并将其发送到 8080?

谢谢

编辑:我现在使用反向代理,将主机名:端口应用于传入的任何请求。

【问题讨论】:

  • 是什么阻止您使用现有的代理,例如 Apache 的 mod_proxy?您的网络服务器中是否有您需要实施的功能不可用?
  • @jd 如何让 mod_proxy 监听各种端口,而不仅仅是默认的 apache 端口?我读过 apache 反正也不喜欢听很多。

标签: python http proxy flask werkzeug


【解决方案1】:

Twisted 有一个反向代理的实现,您可以修改它以满足您的需要。您可以查看示例here。如果你查看twisted.web.proxy 的源代码,你可以看到'Host:' 标头设置在ReverseProxyRequest.process 中,因此您可以对其进行子类化并设置自己的标头。

【讨论】:

    【解决方案2】:

    除非您需要根据只有您的 Web 应用程序知道的参数来定制代理请求(例如,您需要使用您的 Web 应用程序的自定义身份验证系统对代理请求进行身份验证),否则您应该使用您的 Web 服务器的代理功能。

    Apache 示例:

    Listen 0.0.0.0:9090
    ProxyRequests off
    <VirtualHost myhost:9090>
        ProxyPass / http://localhost:8080/
        ProxyPassReverse / http://localhost:8080/
        ProxyPassReverseCookieDomain localhost myhost
    </VirtualHost>
    

    如果您必须在 Flask 或 Werkzeug 应用程序中代理事物,您可以使用 httplib,根据传入的请求数据创建请求并返回原始或修改的响应(例如,用于链接重写)。这是可行的,我有一个这样的代理正在使用,没有好的选择。如果你这样做,我建议不要使用正则表达式来重写 HTML 链接。我改用 PyQuery,它更容易正确处理。

    【讨论】:

    • 我需要为主机名周围有一堆业务逻辑的非常糟糕的遗留应用程序添加或设置标题主机为特定值。但是,为了检查应用程序在移动设备上的外观,并使开发/测试更容易(在不同的端口 fe 上运行多个实例),我想在它之前设置这个 proxy-and-add-header。
    • 现在我有一个虚拟主机设置,然后我需要使用 /etc/hosts,它只是丑陋。制作一个我可以告诉的小python脚本,嘿听9090添加host:header blah到任何请求并将它们转发到localhost:7777会很好,然后我可以从电话转到privateIp:9090,应用程序仍然认为它由 blah 提供服务。
    • 我明白了。那么小型网络应用程序可能是要走的路。我猜@mensi 的答案是最好的,但你更喜欢 Werkzeug 而不是 Twisted,这应该不是很难。
    猜你喜欢
    • 2011-05-23
    • 1970-01-01
    • 2021-10-27
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-24
    相关资源
    最近更新 更多