Apacheでできているリバースプロキシをlighttpdに移行する設定を書いていて困った。
Apacheと同じように設定してみると、書き換え後のURLでバックエンドにリクエストしていないように見える。
調べてみると、lighttpdのmod_rewriteは$HTTP[“url”]の内側では無効になるということらしい。
http://trac.lighttpd.net/trac/wiki/Docs%3AModRewrite
NOTE: url rewriting does not work within a $HTTP[“url”] conditional. http://forum.lighttpd.net/topic/1092#3028
でもURLでしか区別のつかないリクエストをどうしてもバックエンドで受けたい。いまさらユーザに見えるURLを変えることができないし。
バックエンド側ではPythonのSimpleXMLRPCServerで作ったもの。ソースを見てもどこにもURLをいじるところはない。そういえば、URLは意識したこと無いなあ。
で、探して探して見つけた。
[ python-Bugs-1473048 ] SimpleXMLRPCServer responds to any path
SimpleXMLRPCRequestHandlerのソースを見ると、
class SimpleXMLRPCRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): """Simple XML-RPC request handler class. Handles all HTTP POST requests and attempts to decode them as XML-RPC requests. """ # Class attribute listing the accessible path components; # paths not on this list will result in a 404 error. rpc_paths = ('/', '/RPC2') def is_rpc_path_valid(self): if self.rpc_paths: return self.path in self.rpc_paths else: # If .rpc_paths is empty, just assume all paths are legal return True def do_POST(self): """Handles the HTTP POST request. Attempts to interpret all HTTP POST requests as XML-RPC calls, which are forwarded to the server's _dispatch method for handling. """ # Check that the path is legal if not self.is_rpc_path_valid(): self.report_404() return
なるほど。最初からソース見ればよかった。
SimpleXMLRPCRequestHandlerを継承したクラスで、is_rpc_path_validを継承して解決。
なんだか、達成感。