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

use*_*086 5 erlang yaws http-response-codes http-headers

我想在yaws中动态地(在构建响应时)更改http-header "Server:"值.我试过了:-

[{status, 200},
 {allheaders,
      [{header,
          ["Server: ","ASP.NET Development Server/10.0.0.0"]
      }]
 },
 {html,Body}
]
Run Code Online (Sandbox Code Playgroud)

它返回了两个 "Server:"标题而不是一个.但它适用于所有其他标题.

Muz*_*hua 3

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


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

out(_A)-> 
[{header,"服务器:ASP.NET 服务器"},
{html,"<p>我喜欢克拉克和雅司病!</p>"}]。

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

日期 2011 年 11 月 17 日,星期四 07:59:17 GMT
内容长度22
内容类型 text/html
服务器雅司 1.91,ASP.NET 服务器

现在解决方案

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

make_server_header()->
    HasDav = ?sc_has_dav(get(sc)),
    [“服务器:”,(get(gc))#gconf.yaws,“\r\n”|
     如果 HasDav == true ->
             [“DAV:1\r\n”];
        正确->
             []
     结尾]。

这段代码将雅司病版本和服务器名称附加到服务器标头指定值的顶部。我们需要更改它并注释掉这些行,并让它返回一个empty list [ ] or empty string "" ,如下所示:

make_server_header()->
    %%HasDav = ?sc_has_dav(get(sc)),
    %%["服务器:", (get(gc))#gconf.yaws, "\r\n" |
    %% 如果 HasDav == true ->
    %% ["DAV: 1\r\n"];
    %% 正确 ->
    %% []
    %% 结尾]。
    []。%% 强制它返回空

最后一步
现在我们需要重新编译这个模块,并用YAWS-{VSN}/ebin编译这个新源后得到的新的 .beam 文件替换现有的 yaws.beam 文件。然后将其重新加载到虚拟机中。我希望你能在最后一步找到自己的方法。实现此目的的一种方法是更改​​运行 erlang shell 的 yaws 的当前工作目录

1> cd("路径/TO/YAWS/src").
路径/TO/YAWS/src
然后,在更改 yaws.erl 的源之后执行此操作(仍在 yaws shell 中),如上所述
2> c(雅司病)。
{好吧,雅司病}

现在将生成的 yaws.beam 文件从 src 移动到 ebin。用 src 中的文件覆盖/替换 ebin 中现有的 yaws.beam 文件

$ mv PATH/TO/YAWS/src/yaws.beam PATH/TO/YAWS/ebin/
因此,如果雅司病正在运行,请通过在 shell 中输入以下内容来重新加载该代码:

3> l(雅司病)。


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


您只需将一个参数添加到yaws.conf文件中

server_signature = "MY SERVER SIGNATURE"

,因此标头将随之而来Server: MY SERVER SIGNATURE