6

有没有办法让 Python SimpleHTTPServer 支持 mod_rewrite?

我正在尝试使用 Ember.js 并利用 History API 作为位置 API,为了使其工作,我必须:

1) add some vhosts config in WAMP (not simple), or
2) run python -m simpleHTTPServer (very simple)

因此,当我在浏览器中打开它localhost:3000并单击导航(例如关于和用户)时,它运行良好。这些 URL 由 Ember.js 分别更改为localhost:3000/aboutlocalhost:3000/users

但是当我尝试localhost:3000/about直接在新选项卡中打开时,python web 服务器只是返回 404。

我让我的 .htaccess 将所有内容重定向到 index.html,但我怀疑 python 简单 Web 服务器并没有真正读取 htaccess 文件(我是对的吗?)

我尝试下载 PHP 5.4.12 并运行内置的 Web 服务器,url 和 htaccess mod_rewrite 运行良好。但是我仍然不愿意从稳定的 5.3 升级到(可能仍然不够不稳定)5.4.12,所以如果有办法在 python 简单的 Web 服务器中支持 mod_rewrite,那将是可取的。

感谢你的回答。

4

4 回答 4

9

通过修改 pd40 的答案,我想出了这个不会重定向的方法,它会执行您传统的“发送 index.html 而不是 404”。根本没有优化,但它适用于我所需要的测试和开发。

import SimpleHTTPServer, SocketServer
import urlparse, os

PORT = 3456

class MyHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
   def do_GET(self):

       # Parse query data to find out what was requested
       parsedParams = urlparse.urlparse(self.path)

       # See if the file requested exists
       if os.access('.' + os.sep + parsedParams.path, os.R_OK):
          # File exists, serve it up
          SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self);
       else:
          # send index.hmtl
          self.send_response(200)
          self.send_header('Content-Type', 'text/html')
          self.end_headers()
          with open('index.html', 'r') as fin:
            self.copyfile(fin, self.wfile)

Handler = MyHandler

httpd = SocketServer.TCPServer(("", PORT), Handler)

print "serving at port", PORT
httpd.serve_forever()
于 2014-06-20T03:01:56.350 回答
7

SimpleHTTPServer不支持 apache 模块并且不尊重 .htaccess,因为它不是 apache。它也不适用于php。

于 2013-03-14T05:33:08.063 回答
7

如果您知道需要重定向的情况,您可以继承 SimpleHTTPRequestHandler并进行重定向。这会将任何丢失的文件请求重定向到/index.html

import SimpleHTTPServer, SocketServer
import urlparse, os

PORT = 3000

class MyHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
   def do_GET(self):

       # Parse query data to find out what was requested
       parsedParams = urlparse.urlparse(self.path)

       # See if the file requested exists
       if os.access('.' + os.sep + parsedParams.path, os.R_OK):
          # File exists, serve it up
          SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self);
       else:
          # redirect to index.html
          self.send_response(302)
          self.send_header('Content-Type', 'text/html')  
          self.send_header('location', '/index.html')  
          self.end_headers()

Handler = MyHandler

httpd = SocketServer.TCPServer(("", PORT), Handler)

print "serving at port", PORT
httpd.serve_forever()
于 2013-03-15T01:25:04.510 回答
2

恐怕 Python 服务器中没有 mod_rewrite,除非你在 Apache 服务器后面运行 python 脚本,这是一个资源昂贵的解决方案。

试试 Cherrypy ( http://www.cherrypy.org/ ),它允许您管理页面处理程序,并且非常简单地生成干净的 URL。

于 2013-04-03T02:26:47.830 回答