Nginx

如何在 Nginx 中使用 HTTP 標頭來提供不同的內容?

  • December 20, 2020

我注意到 Deno 服務htmljavascript依賴於 HTTPaccept標頭。

例如,如果您只是在瀏覽器中打開這個包,您將返回 HTML(因為accept標頭設置為accept: text/html

https://deno.land/std@0.81.0/http/server.ts

但是,如果您使用 javascript 導入它甚至 curl,那麼您將取回一個javascript/typescript文件。

import { serve } from "https://deno.land/std@0.81.0/http/server.ts";

或者curl https://deno.land/std@0.81.0/http/server.ts

這真的很酷,但我想知道如何使用 Nginx 做到這一點?不使用 Node.js 或 PHP。我知道我可以指定 server_name 和 location 但是標題呢?

例如,如果 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;
       }
   }
}

這種映射是使用 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;
}

引用自:https://serverfault.com/questions/1046929