CouchDB httpd_全局_处理程序,用于在根目录下托管静态文件

CouchDB httpd_全局_处理程序,用于在根目录下托管静态文件,couchdb,Couchdb,前几天,我试图用CouchDB v1.5做一些棘手的事情,结果我弄坏了一些东西: 我修改了根URL的httpd_global_handlers部分,该部分来自股票值: [httpd_global_handlers] / = {couch_httpd_misc_handlers, handle_welcome_req, <<"Welcome">>} 但当我转到根URL时,我收到以下错误消息: {"error":"unknown_error","reason":"funct

前几天,我试图用CouchDB v1.5做一些棘手的事情,结果我弄坏了一些东西:

我修改了根URL的httpd_global_handlers部分,该部分来自股票值:

[httpd_global_handlers]
/ = {couch_httpd_misc_handlers, handle_welcome_req, <<"Welcome">>}
但当我转到根URL时,我收到以下错误消息:

{"error":"unknown_error","reason":"function_clause"}

无法在根目录下托管静态文件吗?

答案在于源代码。那么,让我们开始吧 (如果你不熟悉erlang,这将有点难以理解,但我会尽力解释)

这里的相关代码是这一部分

    case couch_httpd:partition(UrlPath) of
{_ActionKey, "/", RelativePath} ->
    % GET /_utils/path or GET /_utils/
    CachingHeaders =
            [{"Cache-Control", "private, must-revalidate"}],
    couch_httpd:serve_file(Req, RelativePath, DocumentRoot, CachingHeaders);
{_ActionKey, "", _RelativePath} ->
    % GET /_utils
    RedirectPath = couch_httpd:path(Req) ++ "/",
    couch_httpd:send_redirect(Req, RedirectPath)
end;
这里所说的是,如果url中有“/”,请执行

coach\u httpd:serve\u文件(请求、相对路径、文档根、cachingheader)
行动

否则,只需将“/”附加到提供的文件并重定向它。现在,您对配置项所做的操作看起来 无害的。但是这个谜题还有一个关键的部分仍然没有找到<代码>coach\u httpd:partition(UrlPath)
。 它只是一个包装器,mochiweb是couchdb使用的http服务器。下面是代码的注释

%% @spec partition(String, Sep) -> {String, [], []} | {Prefix, Sep, Postfix}
%% @doc Inspired by Python 2.5's str.partition:
%% partition("foo/bar", "/") = {"foo", "/", "bar"},
%%  partition("foo", "/") = {"foo", "", ""}.
因此,调用
partition(“,”/”
返回{“,”}(您可以自己编译mochiweb_util.erl并使用mochiweb_util:partition(“/”,“/”)等进行测试)

现在回到handle\u utils\u dir\u req。在case语句之后,它接收一个不带“/”的空字符串。子句“{u ActionKey,”,_RelativePath}”和 它将“/”追加到路径并重定向到localhost:5984/。您可以在浏览器或curl中对此进行测试

旋度-v

在DNS缓存中找不到主机名

正在尝试127.0.0.1

已连接到127.0.0.1。(127.0.0.1)端口5984(0)

GET/HTTP/1.1

用户代理:curl/7.35.0

主持人:127.0.0.1.:5984

接受:/

HTTP/1.1 301永久移动

服务器CouchDB/1.5.0(Erlang OTP/R16B03)未被列入黑名单

服务器:CouchDB/1.5.0(Erlang OTP/R16B03)

位置:

日期:2014年6月10日星期二04:27:57 GMT

内容长度:0

连接#0到主机127.0.0.1。完好无损

长话短说,从couchdb以根目录形式提供静态html文件并不容易


handle_utils_dir_req在任何方面都过于有限,因为它只接受get和head请求。希望我的回答对你有用。

谢谢,这是非常有用和详细的。仅供参考,我已经求助于使用vhost和重写在root托管静态文件。这是我能用一个纯沙发服务器做的:很好:)还有一个让我有点沮丧的时刻,因为我忘记了vhost!我假设您正在使用vps作为couchdb主机,或者您的网站正在与iris Coach等共享couchdb主机一起工作?又漂亮的狗:)谢谢!它托管在EC2微服务器上。我在Iris沙发上遇到了性能问题,否则这也是一个不错的选择。另外,Iris Coach不允许我使用handle_utils_dir_req托管静态文件,因为我没有访问文件系统的权限。
    case couch_httpd:partition(UrlPath) of
{_ActionKey, "/", RelativePath} ->
    % GET /_utils/path or GET /_utils/
    CachingHeaders =
            [{"Cache-Control", "private, must-revalidate"}],
    couch_httpd:serve_file(Req, RelativePath, DocumentRoot, CachingHeaders);
{_ActionKey, "", _RelativePath} ->
    % GET /_utils
    RedirectPath = couch_httpd:path(Req) ++ "/",
    couch_httpd:send_redirect(Req, RedirectPath)
end;
%% @spec partition(String, Sep) -> {String, [], []} | {Prefix, Sep, Postfix}
%% @doc Inspired by Python 2.5's str.partition:
%% partition("foo/bar", "/") = {"foo", "/", "bar"},
%%  partition("foo", "/") = {"foo", "", ""}.