是否可以仅在本地主机上运行 python SimpleHTTPServer?

Posted

技术标签:

【中文标题】是否可以仅在本地主机上运行 python SimpleHTTPServer?【英文标题】:Is it possible to run python SimpleHTTPServer on localhost only? 【发布时间】:2012-08-29 10:17:46 【问题描述】:

我有一个 *** 连接,当我运行 python -m SimpleHTTPServer 时,它在 0.0.0.0:8000 上提供服务,这意味着它可以通过本地主机通过我的真实 ip 访问。 我不希望机器人扫描我,并且对只能通过 localhost 访问服务器感兴趣。

有可能吗?

python -m SimpleHTTPServer 127.0.0.1:8000  # doesn't work.

也欢迎任何其他可以使用命令行立即执行的简单 http 服务器。

【问题讨论】:

您可以简单地阻止防火墙/路由器在该端口上的外部连接。 虽然对 python2 来说是一个很好的问题,但这里可能需要注意的是,在 python3 中,替换 http.server 允许立即绑定,例如 python3 -m http.server --bind 127.0.0.1 8000 就足够了 旁注SimpleHTTPServer 是单线程和阻塞的,这意味着在前一个请求结束之前您将无法执行另一个请求。它没有范围支持,例如用于从特定位置流式传输/查找媒体文件。更好的选择是twisted (pip install twisted),您可以使用twistd -n web --path / 运行它。它还可以使用twistd -n ftp -p 2121 -r / 进行匿名FTP。更多http服务器单行:gist.github.com/willurd/5720255. 【参考方案1】:

如果您阅读源代码,您会发现只有端口可以在命令行上被覆盖。如果你想改变它所服务的主机,你需要自己实现SimpleHTTPServerBaseHTTPServertest()方法。但这应该很容易。

你可以这样做,很容易:

import sys
from SimpleHTTPServer import SimpleHTTPRequestHandler
import BaseHTTPServer


def test(HandlerClass=SimpleHTTPRequestHandler,
         ServerClass=BaseHTTPServer.HTTPServer):

    protocol = "HTTP/1.0"
    host = ''
    port = 8000
    if len(sys.argv) > 1:
        arg = sys.argv[1]
        if ':' in arg:
            host, port = arg.split(':')
            port = int(port)
        else:
            try:
                port = int(sys.argv[1])
            except:
                host = sys.argv[1]

    server_address = (host, port)

    HandlerClass.protocol_version = protocol
    httpd = ServerClass(server_address, HandlerClass)

    sa = httpd.socket.getsockname()
    print "Serving HTTP on", sa[0], "port", sa[1], "..."
    httpd.serve_forever()


if __name__ == "__main__":
    test()

并使用它:

> python server.py 127.0.0.1     
Serving HTTP on 127.0.0.1 port 8000 ...

> python server.py 127.0.0.1:9000
Serving HTTP on 127.0.0.1 port 9000 ...

> python server.py 8080          
Serving HTTP on 0.0.0.0 port 8080 ...

【讨论】:

【参考方案2】:

正如 @sberry 解释的那样,简单地使用漂亮的 python -m ... 方法是不可能的,因为 IP 地址在 BaseHttpServer.test 函数的实现中是硬编码的。

在不先将代码写入文件的情况下从命令行执行此操作的方法是

python -c 'import BaseHTTPServer as bhs, SimpleHTTPServer as shs; bhs.HTTPServer(("127.0.0.1", 8888), shs.SimpleHTTPRequestHandler).serve_forever()'

如果这仍然算作一个衬里取决于您的终端宽度;-) 这当然不是很容易记住。

【讨论】:

将此添加到 .bash_profile。嗯。现在我可以输入H。谢谢! -- gist.github.com/cmawhorter/f2a09bcf63c68b0cff10 要在 Windows 10 上使用 Python 3.5.1 作为一个简单的 http 服务器,我必须将其更改如下:python -c "import http.server as hs; hs.HTTPServer(('127.0.0.1', 8888), hs.SimpleHTTPRequestHandler).serve_forever()" 请注意报价的变化以及 Base 和 Simple HTTP Server 的事实现在在 http.server 中。 +1 在使用配置文件别名时,我称我的为“servelocal”——为了让 bash 语法更快乐,有一些舞蹈改变和转义引号,但结果很好。 非常有帮助... :) 完美运行!只有一个问题 - 我怎样才能指向其他位置的路径?我想创建一个脚本来启动两台服务器...【参考方案3】:

在 Python 3.4 及更高版本中,http.server 模块接受 bind 参数。

根据to the docs:

python -m http.server 8000

默认情况下,服务器将自己绑定到所有接口。选项 -b/--bind 指定它应该绑定的特定地址。例如,以下命令使服务器绑定到 localhost 仅:

python -m http.server 8000 --bind 127.0.0.1

3.4 版中的新功能:引入了 --bind 参数。

【讨论】:

以上是关于是否可以仅在本地主机上运行 python SimpleHTTPServer?的主要内容,如果未能解决你的问题,请参考以下文章

在本地主机上使用 https 的 ngrok 返回 502

Google 富文本编辑器演示未在本地主机上运行

PHP cURL 在本地主机上工作但在服务器上不工作

本地主机上的连接被拒绝

如何访问在 AWS EC2 Ubuntu 的本地主机上运行的 Parse 服务器?

超出速率限制 - 仅在一台计算机上使用