如何在 Nginx 中使用 HTTP 标头来提供不同的内容?

如何在 Nginx 中使用 HTTP 标头来提供不同的内容?

我注意到 Deno 提供服务htmljavascript依赖于 HTTPaccept标头。

例如,如果你只是在浏览器中打开此包,你将获得 HTML 返回(因为accept标头设置为accept: text/html

https://deno.land/[电子邮件保护]/http/server.ts

但是如果您使用 javascript 来导入它或者甚至使用 curl 那么您将得到一个javascript/typescript文件。

import { serve } from "https://deno.land/[email protected]/http/server.ts";

或者curl https://deno.land/[email protected]/http/server.ts

这真的很酷,但我想知道如何使用 Nginx 来实现这一点?无需使用 Node.js 或 PHP。我知道我可以指定 server_name 和 location,但 headers 呢?

例如,如果 HTTP 标头是,accept: text/html则代理到服务器 1,否则代理传递到不同的服务器。

我正在寻找这样的东西

server {
    listen 80;
    server_name www.test.io;

    location / {
        IF HTTP HEADER accept == "text/html" {
            proxy_pass http://your_server_ip:443;
        } else {
            proxy_pass http://your_server_ip:8080;
        }
    }
}

答案1

这种映射是通过 nginxmap指令完成的。

将以下地图添加到您的http关卡:

map $http_accept $upstream {
    default 192.168.100.1:8000;
    text/html 192.168.100.1:443;
}

然后,在您的server块中使用:

location / {
    proxy_pass http://$upstream;
}

然而,Accept头部往往包含不止一种MIME类型,因此其中的匹配部分实际上map需要更加复杂。

例如,可能需要检查标题中是否包含text/html以下内容:

map $http_accept $upstream {
    ~.*text/html.* 192.168.100.1:443;
}

相关内容