我们的应用程序在 NGiNX 服务器上运行,并根据主机的逻辑决定数据库。
从过去的几天开始,我们的一个客户覆盖主机、用户代理和其他标头,而 NGiNX 无法获取准确的标头详细信息,导致我们的应用程序变得混乱。
GET /api/http.php” _ 200 24 “-” “-” “-” “_” “-” to: 10.0.0.48:8080: 0.014 request_time 0.153
通常我们会得到
/index.php HTTP/1.1” vtermination.com 302 5 “-” “Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36” “-” “_” “-” to: 10.0.0.27:8080: 0.004 request_time 0.347
NGiNX 是否有可能不会替换主机和用户代理等标头?
答案1
标头变量由连接到您的服务器的 HTTP 客户端设置。
nginx 不会以任何方式覆盖这些标头,因此您的应用程序必须准备好从这些标头中获取任意值。
但是,如果您只关心 HTTPHost
标头,那么您可以限制 nginx 将传递给您的应用程序的请求。
配置看起来应该是这样的:
server {
listen 443 ssl;
listen 80;
server_name example.com;
... rest of application and SSL configuration ...
}
server {
listen 443 ssl default_server;
listen 80 default_server;
... SSL configuration with self-signed keys ...
return 404;
}
第一个配置块中的 使得 nginx 在标头server_name
为 时仅向该块发送请求。您需要将您自己的域名更改为该行。Host
example.com
第二个server
块用于所有其他Host
标头值,或所有没有Host
标头的请求。在这种情况下,我们只是对每个请求响应 HTTP 状态代码 404。