能否仅在本地主机上运行python SimpleHTTPServer?

110
我有一个VPN连接,当我运行python -m SimpleHTTPServer时,它会在0.0.0.0:8000上提供服务,这意味着它可以通过本地主机和我的真实IP访问。 我不想被机器人扫描,并且希望服务器只能通过本地主机访问。 这可行吗?
python -m SimpleHTTPServer 127.0.0.1:8000  # doesn't work.

欢迎使用其他可以通过命令行立即执行的简单的HTTP服务器。


4
你可以在防火墙/路由器上简单地阻止来自该端口的外部连接。 - Burhan Khalid
11
尽管这是一个适用于Python2的好问题,但需要注意的是,在Python3中,替代方法http.server允许立即绑定端口,例如python3 -m http.server --bind 127.0.0.1 8000就足够了。 - humanityANDpeace
1
附注:SimpleHTTPServer 是单线程和阻塞的,这意味着在上一个请求结束之前,您将无法进行另一个请求。而且它没有范围支持,例如从特定位置流式传输/寻找媒体文件。更好的选择是 twistedpip install twisted),您可以使用 twistd -n web --path / 运行它。它还可以使用 twistd -n ftp -p 2121 -r / 进行匿名 FTP。更多 http 服务器一行代码:https://gist.github.com/willurd/5720255。 - ccpizza
3个回答

142

在Python的3.4版本及以上,http.server模块接受一个bind(绑定)参数。

根据文档所述:

python -m http.server 8000

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

python -m http.server 8000 --bind 127.0.0.1

从3.4版开始:引入了--bind参数。


78

正如@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()'

如果这仍然被视为一行代码,这取决于您的终端宽度;-) 这肯定不容易记住。


4
将此添加到.bash_profile。Yum。现在我只需键入H即可。谢谢!-- https://gist.github.com/cmawhorter/f2a09bcf63c68b0cff10 - Cory Mawhorter
4
为了在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中。 - Alexander Varwijk
在使用配置文件别名时加上 +1,我把我的称为“servelocal”——需要进行一些更改和转义引号的操作,以使 bash 语法正常,但结果很好。 - sdupton
非常有帮助... :) - user3145373 ツ
完美运行!只有一个问题 - 我如何指定路径到其他位置?我想创建一个脚本,可以启动两个服务器... - s-kaczmarek

58

如果你查看源代码,你会发现只有端口可以在命令行上被覆盖。如果你想改变服务的主机,你需要自己实现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 ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接