深入理解NGINX IF語句

一、nginx if判斷無效

在使用nginx if語句時,有時候會發現if語句並沒有按照預期執行,因此,在編寫nginx規則時,請注意以下幾點,以保證if語句可以正常運行:

1、if語句只能在 server、location、if 和 limit_except 塊內使用。

2、if 後的條件必須用空格隔開。

3、if 後的條件不僅支持在 location 里設置,同時也支持在 server 塊里設置。

4、在 location 里的 if 後如需使用反向代理,就不能用 try_files 。

如下所示,是一個if語句條件判斷無效的例子:

server {
    listen 80;
    server_name example.com;
    if ($host = 'www.example.com') {
        return 301 $scheme://example.com$request_uri;
    }
    ...
}

上述代碼中,$host變量應該是通過nginx自動獲取的,而它沒有用空格隔開if語句的條件,因此if語句無效。正確的寫法應該是:

server {
    listen 80;
    server_name example.com;
    if ($host = 'www.example.com') {
        return 301 $scheme://example.com$request_uri;
    }
    ...
}

二、nginx iframe跨域

在前後端分離的項目中,為了保證安全性,通常會使用同源策略去限制頁面的操作,例如防止跨域訪問,但是有時候我們還是需要跨域訪問,這時就需要用到 iframe 了。

當 iframe 的src屬性的域名與父頁面的域名不一致時,會出現跨域問題,此時,我們就可以利用nginx來解決這個問題。下面是一個利用nginx解決iframe跨域問題的示例:

location = /cross-domain.html {
    add_header 'Access-Control-Allow-Origin' 'http://target-site.com';
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
    add_header 'Access-Control-Allow-Credentials' 'true';
    alias /path/to/cross-domain.html;
}

上述代碼中,另一個網站(target-site.com)想要在自己的網站上嵌入一個content-site.com的內容,此時需要訪問包含在 cross-domain.html 文件中的 iframe,並且這個iframe要在target-site.com網站中訪問,而訪問時需要添加 Access-Control-Allow-Headers 和 Access-Control-Allow-Origin 等頭信息,來實現某些getCredientials等操作。

三、nginx if判斷

nginx if語句不僅可以判斷變量,還可以根據自定義表達式進行判斷,下面是其語法:

if(表達式1) {...} // 表達式   可以使用正則表達式來匹配字符串
if(表達式2) {...} // 表達式2  可以使用變量名,判斷變量的值
if(表達式3) {...} // 表達式3  可以使用數字,判斷變量是否等於/小於/大於指定數字

可以用來進行 if 判斷的變量主要有:

1、$request_uri:請求uri

2、$host:請求的主機名

3、$http_x_forwarded_for:使用了proxy_pass代理後,客戶端的Ip地址會被添加到http請求頭的X-Forwarded-For字段中,使用$http_x_forwarded_for 來獲取這個字段的值。

下面是一個使用if語句進行判斷的示例:

location /path1 {
     if ( $host != 'www.example.com' ) {
         return 404;
     }
     proxy_pass http://backend2;
}

上述代碼中,只有當請求的主機名為www.example.com時,才會反向代理到http://backend2 去。

四、小結

通過以上的文章內容可以看到,nginx if語句的使用與運用有很多優點,如可以進行簡單的判斷操作,以及可以解決一些跨域問題。但需要注意if語句只能在server、location、if 和 limit_except 塊內使用,並且if語句後的條件必須要用空格隔開。

代碼示例:

server {
    listen 80;
    server_name example.com;
    if ($host = 'www.example.com') {
        return 301 $scheme://example.com$request_uri;
    }
    location = /cross-domain.html {
        add_header 'Access-Control-Allow-Origin' 'http://target-site.com';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Credentials' 'true';
        alias /path/to/cross-domain.html;
    }
    location /path1 {
         if ( $host != 'www.example.com' ) {
             return 404;
         }
         proxy_pass http://backend2;
    }
}

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/292784.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-25 18:38
下一篇 2024-12-25 18:38

相關推薦

  • Python3支持多行語句

    Python3是一種高級編程語言,開發人員可以輕鬆地使用該語言編寫簡單到複雜的代碼。其中Python3支持多行語句,方便開發人員編寫複雜的代碼,提高代碼的可讀性和可維護性。 一、使…

    編程 2025-04-29
  • Python for循環語句打印九九乘法表

    本篇文章將詳細介紹如何使用Python的for循環語句打印九九乘法表。打印九九乘法表是我們初學Python時經常練習的一項基礎操作,也是編寫Python程序的基本能力之一。 1、基…

    編程 2025-04-29
  • Python中while語句和for語句的區別

    while語句和for語句是Python中兩種常見的循環語句,它們都可以用於重複執行一段代碼。然而,它們的語法和適用場景有所不同。本文將從多個方面詳細闡述Python中while語…

    編程 2025-04-29
  • Python中自定義函數必須有return語句

    自定義函數是Python中最常見、最基本也是最重要的語句之一。在Python中,自定義函數必須有明確的返回值,即必須要有return語句。本篇文章將從以下幾個方面對此進行詳細闡述。…

    編程 2025-04-29
  • Python中升序排列的if語句

    本文將為大家介紹Python中升序排列的if語句。首先,我們來看一下如何實現。 if a > b: a, b = b, a if b > c: b, c = c, b …

    編程 2025-04-29
  • Python輸出語句用法介紹

    Python作為一種高級編程語言,為編程帶來了極大的便利和快捷。而輸出語句則是Python編程中不可缺少的一部分,它能夠讓我們看到程序運行的結果、判斷程序的正確性和優化程序等。本文…

    編程 2025-04-28
  • Python語句大全

    本文將詳細闡述Python語句大全,並給出代碼實例。 一、基本語句 Python基本語句包括賦值語句、條件語句、循環語句等,其中最基礎的是賦值語句。如下: a = 1 b = 2 …

    編程 2025-04-28
  • Python同步賦值語句的使用方法和注意事項

    Python同步賦值語句是Python中用來同時為多個變量賦值的一種方法。通過這種方式,可以很方便地同時為多個變量賦值,從而提高代碼的可讀性和編寫效率。下面從多個方面詳細介紹Pyt…

    編程 2025-04-28
  • Python導入模塊的語句

    Python是一種廣泛使用的高級編程語言,它支持面向對象的編程方法,同時還有很多功能強大的內置庫和第三方庫。為了使用這些庫,我們需要導入它們,本文將圍繞Python導入模塊的語句展…

    編程 2025-04-28
  • Python設置圖形填充顏色為綠色的語句

    圖形設計是計算機科學中一個重要的分支,而Python語言也是最受歡迎的圖形設計語言之一。Python憑藉其易用性和開源特性,贏得了很多開發者和程序員的青睞。本文將圍繞如何設置Pyt…

    編程 2025-04-27

發表回復

登錄後才能評論