nginx的location與proxy_pass指令超詳細講解及其有無斜槓( / )結尾的區別

2023-03-23 06:03:16

本文所使用的環境資訊如下:

  • windows11 (主機系統)
  • virtual-box-7.0環境下的ubuntu-18.04
  • nginx-1.22.1 (linux)

斜槓結尾之爭

實踐中,nginx裡最常用的指令就是locationproxy_pass了。前者用於為不同請求uri指定不同nginx設定,後者用於匹配的location進行轉發(通常是動態內容)。關於二者的設定,有一個老生常談的話題,那便是:設定的值是否有斜槓結尾,對檔案路徑查詢(或請求轉發)行為有哪些影響?相關文章也非常多,且多數粗看一眼,照其行事,也能立即解決問題。鄙人私以為其中部分文章的說法是不嚴謹的,故特撰此文,以備己查。

結論

不再廢話,直接上結論(如果對location和proxy_pass的功能和基本設定還不熟悉,建議先看後面的章節):

  • location
    一般情況下,location指令不會對是否有斜槓結尾這個場景做特殊處理,除非滿足以下條件:

    滿足以上條件後,也只會對一個特定的uri做特殊處理,這個uri除了沒有尾部的斜槓外,正好與location定義的字首一模一樣。對這個特殊的uri的處理方式為:返回一個301重定向,重定向的地址為:原始請求uri + /,也就是說,重定向的地址與Location字首內容完全相同

    範例設定如下:

    location /films/nature/ { 
        proxy_pass http://film-server;
    }
    

    假定請求的url為http://localhost/films/nature,則location的處理方式為:返回一個301重定向,重定向的地址為http://localhost/films/naure/。與原始請求的唯一差別就是,新的uri地址比原來的uri地址尾部多了一個斜槓 /