我的服务器模块(http.server.HTTPServer
)是否可以使用类似RewriteRule
的内容将所有流量重定向到单个cgi脚本?我希望能够在另一个问题上做here所显示的内容,但是对于我的python服务器。
可以使用.htaccess
之类的东西来完成,还是有其他办法?
此外,即使对于简单的localhost开发服务器,也可以这样做吗?
我正在通过例如http://localhost:8000/html/index.html为开发提供文件,我想在开发过程中隐藏URL中的/ html子文件夹。
怎么能实现呢?
答案 0 :(得分:5)
您可以使用自定义脚本初始化服务器并在其中定义路由,例如this article中建议:
Python 2:
server.py
import os import posixpath import urllib import BaseHTTPServer from SimpleHTTPServer import SimpleHTTPRequestHandler # modify this to add additional routes ROUTES = ( <- this is the "good stuff", make aliases for your paths # [url_prefix , directory_path] ['/media', '/var/www/media'], ['', '/var/www/site'] # empty string for the 'default' match ) class RequestHandler(SimpleHTTPRequestHandler): def translate_path(self, path): """translate path given routes""" # set default root to cwd root = os.getcwd() # look up routes and set root directory accordingly for pattern, rootdir in ROUTES: if path.startswith(pattern): # found match! path = path[len(pattern):] # consume path up to pattern len root = rootdir break # normalize path and prepend root directory path = path.split('?',1)[0] path = path.split('#',1)[0] path = posixpath.normpath(urllib.unquote(path)) words = path.split('/') words = filter(None, words) path = root for word in words: drive, word = os.path.splitdrive(word) head, word = os.path.split(word) if word in (os.curdir, os.pardir): continue path = os.path.join(path, word) return path if __name__ == '__main__': BaseHTTPServer.test(RequestHandler, BaseHTTPServer.HTTPServer)
然后运行你的脚本:
python server.py
Python 3:
在Python 3中,BaseHTTPServer
和SimpleHTTPServer
模块已合并到http.server
模块中。因此,您必须按如下方式修改上述脚本:
更改
import BaseHTTPServer
from SimpleHTTPServer import SimpleHTTPRequestHandler
到
import http.server
(如果您这样做,则应将调用修改为http.server.SimpleHTTPRequest
等。)
或
from http.server import BaseHTTPServer, SimpleHTTPServer, SimpleHTTPRequestHandler
(此选项调用与原始脚本保持一致)
然后运行服务器脚本:python server.py
<小时/> 在您的情况下:
您应修改ROUTES
变量以满足您的需求。
例如,您想隐藏网址中的/html
文件夹:
ROUTES = (
['', '/exact/path/to/folder/html'],
['/another_url_path', '/exact/path/to/another/folder'],
...
)
现在,如果点击:http://localhost:8000/index.html
,您将进入主页。
注意:
默认情况下,此脚本将提供在域url 中执行时所在文件夹中包含的文件(例如,我在Documents文件夹中有server.py
,然后当我运行时它,http://localhost:8000 url将服务我的Documents文件夹)。
您可以通过路由更改此行为(请参阅代码中的“默认”匹配注释)或将脚本放在项目根文件夹中并从那里开始。
答案 1 :(得分:1)
John Moutafis's answer对我入门很有帮助,但除了他对导入的评论外,还需要一些微调才能在python3上运行。
进口应该是
from http.server import HTTPServer, SimpleHTTPRequestHandler
,您还需要将urllib导入更改为:
from urllib.parse import unquote
然后主要应该是这样的:
if __name__ == '__main__':
myServer = HTTPServer(('0.0.0.0', 8000), RequestHandler)
print("Ready to begin serving files.")
try:
myServer.serve_forever()
except KeyboardInterrupt:
pass
myServer.server_close()
print("Exiting.")