我想屏蔽版本或完全删除标题。
答案 0 :(得分:21)
要更改conf.py文件中的'Server:'http标头:
import gunicorn
gunicorn.SERVER_SOFTWARE = 'Microsoft-IIS/6.0'
并使用gunicorn -c conf.py wsgi:app
要完全删除标题,可以通过用过滤掉标题的子类替换其http响应类来修补gunicorn。这可能是无害的,但可能不推荐。将以下内容放在conf.py中:
from gunicorn.http import wsgi
class Response(wsgi.Response):
def default_headers(self, *args, **kwargs):
headers = super(Response, self).default_headers(*args, **kwargs)
return [h for h in headers if not h.startswith('Server:')]
wsgi.Response = Response
用gunicorn 18测试
答案 1 :(得分:2)
对于较新版本 (20.0.4):在您将运行 gunicorn.conf.py
命令的目录中创建一个包含以下内容的 gunicorn
文件:
import gunicorn
gunicorn.SERVER_SOFTWARE = 'My WebServer'
答案 2 :(得分:1)
您可以编辑__init__.py以将SERVER_SOFTWARE设置为您想要的任何内容。但我真的很想用标志禁用它,所以升级时我不需要重新应用补丁。
答案 3 :(得分:0)
我的免费补丁解决方案涉及包装default_headers方法:
import gunicorn.http.wsgi
from six import wraps
def wrap_default_headers(func):
@wraps(func)
def default_headers(*args, **kwargs):
return [header for header in func(*args, **kwargs) if not header.startswith('Server: ')]
return default_headers
gunicorn.http.wsgi.Response.default_headers = wrap_default_headers(gunicorn.http.wsgi.Response.default_headers)
答案 4 :(得分:0)
将其更改为唯一的内容要比删除它更好。您不想冒险,例如,蜘蛛侠认为您不合规。将其更改为您不使用的软件名称可能会导致类似的问题。使其具有唯一性将避免做出相同的假设。我推荐这样的东西:
import gunicorn
gunicorn.SERVER_SOFTWARE = 'intentionally-undisclosed-gensym384763'
答案 5 :(得分:0)
这并不能直接回答问题,但也可以解决该问题,而且无需猴子修补黑眼圈。
如果您通常在反向代理后面使用gunicorn,则可以在后端下游的响应头中设置,添加,删除或执行替换。在我们的例子中,Server
标头。
我想每个Web服务器都应该具有相同的功能。
例如,在Caddy 2(当前为beta)中,它很简单:
https://localhost {
reverse_proxy unix//tmp/foo.sock {
header_down Server intentionally-undisclosed-12345678
}
}
为了完整起见,即使在手动http-> https重定向过程中,我仍然添加一个最低限度(但可以正常工作)的Caddyfile
来处理服务器标头的修改(如果您不覆盖Caddy 2,它会自动执行),正确地找出它可能有些棘手。
http://localhost {
# Fact: the `header` directive has less priority than `redir` (which means
# it's evaluated later), so the header wouldn't be changed (and Caddy would
# shown instead of the faked value).
#
# To override the directive ordering only for this server, instead of
# change the "order" option globally, put the configuration inside a
# route directive.
# ref.
# https://caddyserver.com/docs/caddyfile/options
# https://caddyserver.com/docs/caddyfile/directives/route
# https://caddyserver.com/docs/caddyfile/directives#directive-order
route {
header Server intentionally-undisclosed-12345678
redir https://{host}{uri}
}
}
https://localhost {
reverse_proxy unix//tmp/foo.sock {
header_down Server intentionally-undisclosed-12345678
}
}
要检查其是否有效,只需将curl
用作curl --insecure -I http://localhost
和curl --insecure -I http://localhost
(这是不安全的,因为本地主机证书是作为自签名自动生成的)。
设置是如此简单,以至于您也可以考虑在开发中使用它(使用gunicorn --reload
),尤其是当它类似于您的暂存/生产环境时。
答案 6 :(得分:0)
这里没有写清楚,所以我要确认最新版本的 Gunicorn (20.1.x) 的最简单方法是在配置文件中添加以下几行:
import gunicorn
gunicorn.SERVER = 'undisclosed'