изменение определенного заголовка в ответе yaws

Я хотел бы изменить значение http-header "Server:" динамически (при построении ответа) в yaws. Я попытался:-

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

он вернул два заголовка "Server: " вместо одного. Но это работало для всех других заголовков.


person user1051086    schedule 17.11.2011    source источник


Ответы (2)


Для более старых версий yaws (yaws-1.90 и ниже) приведенный ниже ответ работает


Теперь, по умолчанию, любой заголовок, указанный как [{header,"Server: MyOther Server Name"}] , yaws будет применять и помечать его имя и версию перед заголовком вашего сервера. значение, например: 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, вы видите заголовки Response, указанные следующим образом:


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

Теперь решение:

В yaws 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

Last step
Now we need to re-compile this module and replace the existing yaws.beam file in YAWS-{VSN}/ebin with the new resulting .beam file we get after compiling this new source. Then reload it in the VM. I hope you can find your way in this last step. One way of pulling this off is by changing the current working directory of your yaws running erlang shell

1> cd("PATH/TO/YAWS/src").
PATH/TO/YAWS/src
Then, execute this (still in the yaws shell) after changing the source of the yaws.erl as we have mentioned above
2> c(yaws).
{ok,yaws}

Now move the generated yaws.beam file from src to ebin. Overwrite/ replace the existing yaws.beam file in ebin with the one from src

$ mv PATH/TO/YAWS/src/yaws.beam PATH/TO/YAWS/ebin/
So, if yaws is running, reload that code by entering in its shell:

3> l(yaws).


Для более новых версий yaws (yaws-1.91 и выше)


Существует параметр, который нужно просто добавить в файл yaws.conf

server_signature = "MY SERVER SIGNATURE"

И поэтому заголовки будут с Server: MY SERVER SIGNATURE

person Muzaaya Joshua    schedule 17.11.2011
comment
спасибо, но я должен каждый раз добавлять свой собственный заголовок Server: , и я не возражаю - person user1051086; 17.11.2011
comment
О да, это стоимость этого. Но вы можете внести любые изменения в функцию в yaws.erl, чтобы всегда помещать нужный заголовок, а не комментировать весь код. На самом деле вместо того, чтобы возвращать [] из функции, пусть она возвращает ваш заголовок, чтобы вам не нужно было постоянно вставлять его в свой код - person Muzaaya Joshua; 18.11.2011

Начиная с версии 1.90 Yaws, выпущенной в мае 2011 г., вы можете установить глобальную переменную конфигурации server_signature для настройки заголовка HTTP-ответа Server. Кроме того, на момент написания этой статьи мы находились в процессе создания возможности переопределения server_signature для каждого виртуального сервера, поэтому при желании вы можете обслуживать разные заголовки Server с разных виртуальных серверов. Это изменение будет добавлено в репозиторий yaws github в начале февраля 2012 г. мы решили выпустить это.

person Steve Vinoski    schedule 02.02.2012