如何让 NGINX 通过上游服务器的“服务器”标头?
就像,如果 NGINX 代理到服务器标头为“Apache2.2 (CentOS)”的 Apache 服务器,它会将其剥离并替换为“NGINX/1.0.1”。我们在 Server: 头中有我们的机器 ID,所以我们需要让 NGINX 停止覆盖它们。
我正在设计一个 JSON API,我想使用某种内容协商来对 API 进行版本控制。我目前正计划使用供应商 MIME 类型来执行此操作。
虽然我绝对可以在应用程序级别执行此操作,但我认为最好在 HTTP 服务器级别执行此操作。这可能与 Apache 或 nginx 一起使用吗?
Content-Type 看起来像:application/vnd.vendorname-v1+json
或者可能使用参数:application/vnd.vendorname+json;v=1
由于有一个针对 Apache 字节范围实现的有效漏洞(CVE-2011-3192,请参见此处),我想禁用它,直到我的发行版(Debian、Ubuntu)随附官方补丁。这些网站都是没有大量下载的“普通”网站。除了无法恢复下载之外,禁用该功能还有什么缺点吗?
PS。:我通过mod_headers使用以下行启用和取消设置范围标题来禁用该功能:
RequestHeader unset Range
Run Code Online (Sandbox Code Playgroud) 在我的 nginx.conf 中,我有:
gzip on;
gzip_static on;
gzip_buffers 16 8k;
gzip_comp_level 9;
gzip_http_version 1.0;
gzip_min_length 1000;
gzip_types text/plain text/css image/x-icon image/bmp image/png image/gif image/jpeg image/jpg application/json application/x-javascript text/javascript;
gzip_vary on;
gzip_proxied any;
Run Code Online (Sandbox Code Playgroud)
所以,如果我在我的服务器上获取图片的标题:
spiroo@glamdring:~$ curl -I http://static.mysite.com/g/pics/big_6e1855d844ebca560379139e75942f669655f.jpeg
HTTP/1.1 200 OK
Server: nginx
Date: Thu, 04 Apr 2013 13:00:20 GMT
Content-Type: image/jpeg
Content-Length: 5336
Last-Modified: Mon, 25 Mar 2013 13:28:02 GMT
Expires: Fri, 04 Apr 2014 13:00:20 GMT
Cache-Control: max-age=31536000
Pragma: public
Cache-Control: public, must-revalidate, proxy-revalidate
Accept-Ranges: bytes
Run Code Online (Sandbox Code Playgroud)
但是如果我在 nginx.conf 中关闭 …
Microsoft 在此处列出了 IIS http 状态代码,包括子状态代码。
在 404 部分有 0 到 20 之间的子状态代码,但在我的日志中,我得到 503 作为 sc-substatus
我找不到任何关于它的信息。不要将此与标准的 http 503(服务不可用)状态混淆。
IETF RFC 2616 第 4.2 节允许请求包含具有相同字段名称的多个标头,只要保留插入的时间顺序,并且它们的值可以转换为具有逗号分隔值列表的单个标头。
http://tools.ietf.org/html/rfc2616#section-4.2
当且仅当该头字段的整个字段值被定义为逗号分隔列表[即,#(values)] 时,消息中可能存在具有相同字段名的消息头字段。通过将每个后续字段值附加到第一个字段值,每个字段值用逗号分隔,必须可以将多个标题字段组合成一个“字段名称:字段值”对,而不改变消息的语义。因此,接收具有相同字段名的头字段的顺序对组合字段值的解释很重要,因此当转发消息时,代理不得更改这些字段值的顺序。F5 不会覆盖任何现有的 X-Forwarded-For。它也不会将现有的 X-Forwarded-For 连接成一个逗号分隔的值。反而,
但是,如果环境中有多个客户端、代理、CDN、流量管理器、参与操作X-Forwarded-For集合的服务器呢?
执行统一的做法似乎有好处。但最佳实践是什么?
F5 BIG-IP 默认 http 配置文件插入标头X-Forwarded-For在请求的预先存在的 XFF 标头集合的末尾累积一个附加标头,以保留顺序。
AWS ELB 鼓励将传入请求的多个X-Forwarded-For合并到一个包含以逗号分隔的 XFF IP 列表以及用户主机地址的单个标头中,以保留顺序。
其他设备可以采用其他变体。
是否存在针对异构环境的商定建议或事实上的标准?
此外,是否提供了任何时间戳数据,以允许代码X-Forwarded-For在先前对 XFF 标头的操作可疑的情况下按添加的时间顺序对标头进行明确排序。
我正在尝试通过 Nginx 反向代理设置负载均衡器。我的应用程序使用客户端证书来验证客户端。我希望我的反向代理将客户端证书转发到我的后端服务器。我已将此行添加到反向代理的配置中,以将客户端证书信息存储在自定义 HTTP 标头中:
proxy_set_header X-SSL-CERT $ssl_client_cert
Run Code Online (Sandbox Code Playgroud)
但是,$ssl_client_cert使用多行来存储证书,并且我的后端 nginx 服务器无法将其正确识别为一个 HTTP 标头。实现转发我的客户证书的最佳方法是什么?
这个问题在 2013 年在这个论坛上被问过,但到目前为止还没有真正的解决方案:https : //forum.nginx.org/read.php?2,236546,236546
谢谢!
我使用 nginx 1.10.1 与类似的配置:
server {
(...)
add_header Header1 "value";
(...)
# in this location above add_header directive works
location / {
uwsgi_pass unix:/var/run/some.sock;
(...)
}
# ..and it this one it doesn't!
location ~* (^/$|favicon.ico|robots.txt) {
return 204;
expires 24h;
add_header Cache-Control "public";
etag on;
}
}
Run Code Online (Sandbox Code Playgroud)
..所以我的问题是 Header1 是为第一个位置处理的请求设置的,但不是为第二个位置设置的。
为什么?
我已经阅读了add_header文档并知道它默认仅适用于“正”返回代码,但 204 是其中之一(我实际上已经测试过将代码更改为 200、404 并且没有帮助)。
(我也尝试添加always到我的add_header Header1 ...但这是一个相当绝望的尝试,因为它不应该有帮助 - 而它没有。)
我尝试设置 max-age 标头指令和 Content-Disposition “附件”如下:
location / {
# set up max-age header directive for certain file types for proper caching
location ~* \.(?:css|js|ico|gif|jpe?g|png|mp3|mpeg|wav|x-ms-wmv|eot|svg|ttf|woff|woff2)$ {
expires 7d;
add_header Cache-Control "public";
}
# force download for ceratain file types
location ~* \.(?:fb2|mobi|mp3)$ {
add_header Content-Disposition "attachment";
}
...
}
Run Code Online (Sandbox Code Playgroud)
问题在于 .mp3 文件与两个位置块都匹配。仅使用第一个 (max-age)。我怎样才能同时拥有 .mp3 文件 - max-age和Content-Disposition “附件”?
让我们采取以下nginx.conf与配置文件server的块example.com和subdomain.example.com:
http {
...
server {
listen [::]:80 ipv6only=off default_server;
server_name example.com;
return 301 https://example.com$request_uri;
}
server {
listen [::]:443 ipv6only=off ssl default_server;
server_name example.com;
add_header Strict-Transport-Security
"max-age=63072000; includeSubDomains; preload" always;
...
}
server {
listen [::]:80 ipv6only=off;
server_name subdomain.example.com;
return 301 https://subdomain.example.com$request_uri;
}
server {
listen [::]:443 ipv6only=off ssl;
server_name subdomain.example.com;
add_header Strict-Transport-Security
"max-age=63072000; includeSubDomains; preload" always; # <-- again ???
...
}
}
Run Code Online (Sandbox Code Playgroud)
includeSubDomains标题的部分显然告诉浏览器标题也适用于所有子域。
但是,如果该浏览器subdomain.example.com在看到 之前访问example.com …
http-headers ×10
nginx ×7
apache-2.2 ×2
http ×2
https ×2
ssl ×2
amazon-elb ×1
compression ×1
exploit ×1
f5-big-ip ×1
gzip ×1
haproxy ×1
iis-10 ×1
iis-8.5 ×1
linux ×1
regex ×1
security ×1