簡體   English   中英

NGINX 位置塊正則表達式和代理傳遞

[英]NGINX location block regex and proxy pass

我希望你們都好。

我是 NGINX 的初學者,我正在嘗試了解以下 NGINX 配置文件塊。 如果有人能幫助我理解這個塊,我將不勝感激。

location ~ ^/search/google(/.*)?$ {
  set $proxy_uri $1$is_args$args;
  proxy_pass http://google.com$proxy_uri;
}

從以下 SO 文章( https://stackoverflow.com/a/59846239 )中,我了解到:

  • 對於location ~ ^/search/google(/.*)?$

    • ~表示它將執行正則表達式搜索(區分大小寫)
    • ^/search/google意味着路由應該以/search/google開頭(例如http://<ip or domain>/search/google 。如果我們在末尾有尾隨/有什么區別(例如http://<ip or domain>/search/google/而不是http://<ip or domain>/search/google
    • (/.*)?$這是我有點困惑的部分
      • 為什么在這種情況下使用()組? 使用 group 的常見用例是什么?
      • 為什么使用? 在這種情況下? .*不是已經包含零個或多個字符,為什么我們還需要?
      • 我們可以簡單地刪除()? 例如/search/google/.*$以獲得與原始行為相同的行為?
  • set $proxy_uri $1$is_args$args;

    • 我知道我們正在設置一個名為proxy_uri的用戶定義proxy_uri
    • $1將被替換為什么,有時有人還包含$2等等?
    • 我認為$is_args$args意味着如果有一個查詢字符串(即http://<ip or domain>/search/google?fruit=apple$is_args$args將被替換為?fruit=apple
  • proxy_pass http://google.com$proxy_uri

    • 我認為它只是將用戶重定向到http://google.com$proxy_uri ??? 與http重定向301相同???

非常感謝您提前!

作為一個非英語母語者,我認為有人會用比我更完美的英語來回答你的問題,但由於過去五天沒有人這樣做,我會嘗試自己做。

~表示它將執行正則表達式搜索(區分大小寫)

我認為更正確的術語是“對正則表達式模式執行匹配”。

^/search/google意味着路由應該以/search/google開頭(例如http://<ip or domain>/search/google 。如果我們在末尾有尾隨/有什么區別(例如http://<ip or domain>/search/google/而不是http://<ip or domain>/search/google

下面會一一解答。

為什么在這種情況下使用()組? 使用 group 的常見用例是什么?

這是一個編號的捕獲組 與該組匹配的字符串內容稍后可以作為$1引用。 第二個編號的捕獲組,出現在正則表達式模式中,可以被引用為$2等等。 還有一個名為捕獲組存在,當你可以用它代替你自己的變量名$1$2 ,等一個良好的使用命名捕獲組在給出的例子ServerFault線程。

順便說一句,您引用的答案提到了編號的捕獲組(但不是命名的捕獲組)。

為什么使用? 在這種情況下? .*不是已經包含零個或多個字符,為什么我們還需要?

你注意到我們的捕獲組是(/.*) ,而不是(.*)嗎? 這樣它將匹配/search/google/<any suffix>但不匹配/search/google/<any suffix> /search/googles等。一個問號使這個捕獲組可選( /search/google也將匹配我們的正則表達式模式)。

我們可以簡單地刪除()? 例如/search/google/.*$以獲得與原始行為相同的行為?

不,因為我們稍后需要$1價值。 如果您正確理解了以上所有信息,您應該會看到它可以是/<any suffix>或空字符串。

$1將被替換為什么,有時有人還包含$2等等?

已經回答了。

我認為$is_args$args意味着如果有一個查詢字符串(即http://<ip or domain>/search/google?fruit=apple$is_args$args將被替換為?fruit=apple

對,就是這樣。

我認為它只是將用戶重定向到http://google.com$proxy_uri ??? 與http重定向301相同???

完全錯誤。 盡管該答案沒有提到您可以在將響應發送到客戶端之前另外修改響應(例如,使用sub_filter模塊),但此處簡要描述差異。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM