2012-03-13 39 views
2

我已經看到了一堆有語法像這樣ngnix重寫:Nginx的重寫語法

server { 
    server_name www.example.com; 
    rewrite ^(.*) http://example.com$1 permanent; 
} 

我不明白^(.*)部分。 ^是否在uri的頂級域名(TLD)之後?

回答

3

^確實匹配的字符串的開頭。在nginx的rewrite指令的情況下,這意味着實際URI的路徑組件的開始。不幸的是,nginx的文檔有點不正確。從http://www.nginx.org/en/docs/http/ngx_http_rewrite_module.html#rewrite引用:

如果指定的正則表達式與URI匹配,則URI會根據替換字符串中的指定進行更改。

但是,這在技術上是錯誤的。 rewrite與整個URI/URL不匹配,但僅與其路徑組件(即使用戶僅輸入例如http://www.example.com而不是http://www.example.com/)始終以/開頭。因此rewrite ^(.*) http://example.com$1 permanent;不會變成http://example.comwww.example.com

+1

否.URI和URL都是指整個事物(schema:// host/path ...)。見http://en.wikipedia.org/wiki/Url。 nginx匹配的既不是URL也不是URI,而只是URI/URL的路徑組件。在我的例子中,URI/URL以「/」開頭,路徑組件是「/」。 – 2013-04-24 14:13:51

+0

即使你的意思是說URL中的路徑組件不同於URI中的路徑組件(這可能會也可能不是這樣):從nginx的角度來看,它始終以「 /」。 – 2013-04-24 14:15:54

+0

@Mortiz Bunkus - 撤回,似乎我很迷惑的URI與它在我以前使用的軟件框架(顯然是不正確的)中使用,由於某種原因,它使用它作爲路徑 – 2013-04-26 19:02:28

1

如果我記得正確,^只是設置正則表達式規則以匹配字符串的開頭。 圓括號用於提取帶有$ 1-9變量的零件。

Nginx wiki的另一個解決方案。 Link

server { 
    server_name www.example.com; 
    rewrite^http://example.com$request_uri? permanent; 
} 
+0

'^'是什麼令我困惑。我同意你的意見,通常這意味着「開始行」,但如果是這種情況,那麼^(。*)應該抓取整個網址,因此'http:// example.com $ 1'應該是類似於http://example.comwww.example.com,對吧?如果它抓住了整個網址? – 2012-03-14 16:48:10

+0

'$ request_uri'後的'?'的用途是什麼,這是否意味着整個事情是可選的?這不是默認行爲嗎?因爲我看到很多沒有問號的地方。 – Zuko 2017-08-03 17:46:14