在雅司中更改特定标题会做出响应

时间:2011-11-17 06:19:45

标签: erlang http-headers yaws http-response-codes

我想在yaws中动态更改http-header “Server:”值(同时构建响应)。我试过了: -

[{status, 200},
 {allheaders,
      [{header,
          ["Server: ","ASP.NET Development Server/10.0.0.0"]
      }]
 },
 {html,Body}
]

它返回两个 “Server:”标头而不是一个。但它适用于所有其他标题。

2 个答案:

答案 0 :(得分:3)

对于较旧版本的雅司病(yaws-1.90及以下),以下答案有效


现在,默认情况下,任何标头指定为[{header,"Server: MyOther Server Name"}],偏航将强制执行并在服务器标头值之前标记其名称和版本,如下所示:Server: Yaws 1.91, MyOther Server Name。当您在out/1函数中以标题值结束时,会发生这种情况,服务器如下:

out(_A)-> 
[{header,"Server: ASP.NET Server"},
{html,"<p>I love klacke and yaws ! </p>"}].

使用Firebug检查浏览器,您会看到如下指定的响应标头:


Date            Thu, 17 Nov 2011 07:59:17 GMT
Content-Length  22
Content-Type    text/html
Server          Yaws 1.91, ASP.NET Server

现在的解决方案

在雅司src中,有一个名为yaws.erl的模块。在这个模块中,检查一行:1332,你会发现这样的函数:

make_server_header() ->
    HasDav = ?sc_has_dav(get(sc)),
    ["Server: ", (get(gc))#gconf.yaws, "\r\n" |
     if HasDav == true ->
             ["DAV: 1\r\n"];
        true ->
             []
     end].

这是将yaws版本和服务器名称附加到服务器标头指定值之上的代码段。我们需要更改它并注释掉这些行,然后让它返回empty list [ ] empty string "" ,如下所示:

make_server_header() ->
    %%HasDav = ?sc_has_dav(get(sc)),
    %%["Server: ", (get(gc))#gconf.yaws, "\r\n" |
    %% if HasDav == true ->
    %%         ["DAV: 1\r\n"];
    %%    true ->
    %%         []
    %% end].
    []. %% force it to just return empty

最后一步
现在我们需要重新编译这个模块,并用编译这个新源的新生成的.beam文件替换YAWS-{VSN}/ebin中现有的yaws.beam文件。然后在VM中重新加载它。我希望你能在最后一步找到自己的方式。解决此问题的一种方法是更改​​运行erlang shell的偏航的当前工作目录

1> cd("PATH/TO/YAWS/src").
PATH/TO/YAWS/src
然后,在更改yaws.erl的源之后执行此操作(仍然在yaws shell中),如上所述
2> c(yaws).
{ok,yaws}

现在将生成的yaws.beam文件从src移动到ebin。用src

$ mv PATH/TO/YAWS/src/yaws.beam PATH/TO/YAWS/ebin/
覆盖/替换ebin中现有的yaws.beam文件 因此,如果yaws正在运行,请通过输入shell来重新加载该代码:

3> l(yaws).


对于较新版本的雅司病(yaws-1.91及以上)


您只需在yaws.conf文件中添加一个参数
server_signature = "MY SERVER SIGNATURE"

所以标题会附带Server: MY SERVER SIGNATURE < p>

答案 1 :(得分:2)

自2011年5月发布的Yaws版本1.90起,您可以设置全局配置变量server_signature以自定义Server HTTP响应标头。在撰写本文时,我们还在基于每个虚拟服务器进行server_signature覆盖的过程中,因此如果您愿意,可以从不同的虚拟服务器提供不同的Server标头。此更改将在2012年2月初添加到yaws github repo,并且每当我们决定发布时,将在Yaws 1.93中出现。