關於nginx中proxy_set_header的設置


 

版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/felix_yujing/article/details/51682655

昨天一個開發找我幫忙配置一個nginx的轉發,本來很容易的配置,但是坑了我好久才解決。。。需求大致是:

nginx上配有aaa.example.com的虛擬主機,現在需要將訪問http://aaa.example.com/api/x.x/client/的請求轉到http://bbb.example.com/api/x.x/client/,bbb.example.com的虛擬主機在另外一台nginx上,其中x.x表示位數不定的版本號,如:1.0或1.20.345都可能。請求轉過去要求url保持不變

用rewrite轉發的話,url會發生變化的,那就用proxy_pass吧,於是添加了如下的配置:

  1.  
    location ~ ^ /api/([0-9]+)(\.[0-9]+)*/client/ {
  2.  
    proxy_pass http: //bbb.example.com;
  3.  
    }
  • 1
  • 2
  • 3

在現有環境的nginx里添加這段配置之后,訪問卻始終轉不過去,查看nginx日志也只能看到是404信息,並沒有更多定位問題的信息。檢查了許久也沒找到原因,於是重新裝了一台新nginx,里面只加上面這段配置,結果nginx是能夠轉發成功的,這說明單獨來看這條location的配置是沒有問題的,很有可能是現有環境nginx里的某些配置影響到了這個轉發。 
為了定位問題原因,我將aaa.example.com虛擬主機下的其他配置注意注釋掉來調試,最后發現當注釋掉proxy_set_header Host $http_host ;這條配置之后,就能成功轉發了。這才注意到是反向代理配置的問題。現有環境中原有的配置也不能隨便刪掉,上網查了下原因,找到下面這種解決方案:

  1.  
    location ~ ^/api/([0-9]+)(\.[0-9]+)*/client/ {
  2.  
    proxy_pass http://bbb.example.com;
  3.  
    proxy_set_header Host $proxy_host;
  4.  
    }
  • 1
  • 2
  • 3
  • 4

即,在location里面添加一條proxy_set_header Host $proxy_host;配置。當Host設置為$http_host時,則不改變請求頭的值,所以當要轉發到bbb.example.com的時候,請求頭還是aaa.example.com的Host信息,就會有問題;當Host設置為$proxy_host時,則會重新設置請求頭為bbb.example.com的Host信息。

另外,關於proxy_pass轉發url的參數,可以通過在location中用rewrite來做,所以完善后的配置如下:

  1.  
    location ~ ^/api/([0-9]+)(\.[0-9]+)*/client/ {
  2.  
    rewrite /(.*)$ /$1 break;
  3.  
    proxy_pass http://bbb.example.com;
  4.  
    proxy_set_header Host $proxy_host;
  5.  
    }
  • 1
  • 2
  • 3
  • 4
  • 5

在location用rewrite改變了URI之后,proxy_pass將使用改變后的URI。上面例子(.*)是將所有參數傳給$1,轉發時/$1會拼接在http://bbb.example.com后面。

補習

自己之前並沒有太留意nginx中proxy_set_header的設置,借這次遇到的問題,補習下功課。

proxy_set_header用來重定義發往后端服務器的請求頭。

語法格式: 
proxy_set_header Field Value;

Value值可以是包含文本、變量或者它們的組合。常見的設置如: 
proxy_set_header Host $proxy_host; 
proxy_set_header X-Real-IP $remote_addr; 
proxy_set_header X-Forwarded-For $remote_addr;

注意:在nginx的配置文件中,如果當前模塊中沒有proxy_set_header的設置,則會從上級別繼承配置。繼承順序為:http, server, location。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM