2013-03-14 3 views
5

Есть ли способ сделать Python SimpleHTTPServer поддержкой mod_rewrite?Python SimpleHTTPServer

Я пытаюсь вещи 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/about и localhost:3000/users соответственно.

Но когда я попытался открыть localhost:3000/about непосредственно в новой вкладке, веб-сервер питона просто возвращает 404.

Я имел мой .htaccess все переадресовывает index.html, но я подозреваю, что питон простой веб-сервер не действительно читаю файл htaccess (я прав?)

Я пробовал загрузить PHP 5.4.12 и запустить встроенный веб-сервер, хорошо работает mod_rewrite url и htaccess. Но я по-прежнему неохотно обновляюсь от стабильного 5.3 до (возможно, еще нестабильного) 5.4.12, поэтому, если есть способ поддерживать mod_rewrite в простом веб-сервере python, это было бы предпочтительным.

Спасибо за ответ.

ответ

8

SimpleHTTPServer не поддерживает модули apache и не уважает .htaccess, потому что это не apache. он также не будет работать с php.

+1

Фактически, 'SimpleHTTPServer' не делает больше, чем служит статическим файлам и html. – mvanveen

+0

да, я тоже так думаю. Так или иначе, или любой рекомендованный простой веб-сервер, который прост в использовании и по крайней мере поддерживает mod_rewrite? – Henson

+1

Это не был бы «простой» веб-сервер, если бы он поддерживал все это. – LtWorf

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() 
2

Нет mod_rewrite в серверах Python Я боюсь, если не запускать питона сценариев за сервером Apache, ресурсо-дорогостоящим решением.

Попробуйте Cherrypy (http://www.cherrypy.org/), который позволяет управлять обработчиками страниц и очень просто делает чистые URL-адреса.

7

Изменяя ответ pd40, я придумал это, которое не перенаправляет, это ваш традиционный «send 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() 
Смежные вопросы