Python SimpleHTTP-сервер

Есть ли способ заставить 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 и нажал на навигацию (например, о пользователях), все заработало хорошо. Ember.js изменяет URL-адреса на localhost:3000/about и localhost:3000/users соответственно.

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

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

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

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


person Henson    schedule 14.03.2013    source источник


Ответы (4)


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

person thkang    schedule 14.03.2013
comment
Фактически, SimpleHTTPServer не делает ничего большего, чем обслуживает статические файлы и html. - person mvanveen; 14.03.2013
comment
да, я тоже так думаю. Так или иначе, или любой рекомендуемый простой веб-сервер, который прост в использовании и, по крайней мере, поддерживает mod_rewrite? - person Henson; 14.03.2013
comment
Это не был бы простой веб-сервер, если бы он поддерживал все это. - person LtWorf; 14.03.2013
comment
Однако его можно свободно расширить. Вы можете заставить его поддерживать почти что угодно. - person XTL; 17.12.2014
comment
Я смог заставить SimpleHTTPServer обслуживать html-файл со связанной библиотекой JavaScript только тогда, когда этот файл библиотеки и html-файл хранились в одном каталоге. - person noobninja; 02.04.2016

Изменив ответ 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()
person Brigand    schedule 20.06.2014

Если вы знаете случаи, в которых вам нужно перенаправить, вы можете создать подкласс 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()
person pd40    schedule 15.03.2013

Боюсь, на серверах Python нет mod_rewrite, если только вы не запускаете скрипты Python за сервером Apache, что является ресурсоемким решением.

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

person Benoit    schedule 03.04.2013