2009-10-27 183 views
37

我看到Nginx的HttpRewriteModule documentation有一個例子來重寫WWW前綴的域名到非www前綴的域名:Nginx的重寫無www前綴的域名到www前綴的域名

if ($host ~* www\.(.*)) { 
    set $host_without_www $1; 
    rewrite ^(.*)$ http://$host_without_www$1 permanent; # $1 contains '/foo', not 'www.mydomain.com/foo' 
} 

我怎樣才能做相反的事情 - 將一個非www前綴域重寫爲www前綴域?我想也許我可以做如下的事情,但Nginx不喜歡嵌套的if語句。

if ($host !~* ^www\.) {      # check if host doesn't start with www. 
    if ($host ~* ([a-z0-9]+\.[a-z0-9]+)) { # check host is of the form xxx.xxx (i.e. no subdomain) 
     set $host_with_www www.$1; 
     rewrite ^(.*)$ http://$host_with_www$1 permanent; 
    } 
} 

而且我想這對任何域名的工作,而無需顯式地告訴Nginx的重寫domain1.com - > www.domain1.com,domain2.com - > www.domain2.com等,因爲我有大量的域名需要重寫。

回答

13

嗯,我想我真的不需要外部的「if」語句,因爲我只是檢查形式爲xxx.xxx的域。以下這些對我來說很有用,雖然它不健壯。讓我知道是否有更好的解決方案。

if ($host ~* ^([a-z0-9\-]+\.(com|net|org))$) { 
     set $host_with_www www.$1; 
     rewrite ^(.*)$ http://$host_with_www$1 permanent; 
    } 

編輯:在正則表達式中添加了連字符,因爲它是主機名中的有效字符。

+0

如何使用這個沒有? – pahnin 2016-08-01 10:49:43

15
if ($host !~* ^www\.) { 
    rewrite ^(.*)$ http://www.$host$1 permanent; 
} 
+1

這對我不起作用,因爲我不想重寫像static.mydomain.com這樣的子域名。我可能應該在我的問題中說明這一點。感謝您的回答。 – saltycrane 2009-11-09 18:18:45

6
if ($host ~* ^[^.]+\.[^.]+$) { 
    rewrite ^(.*)$ http://www.$host$1 permanent; 
} 

這是唯一可能得到有效的主機名,因爲該請求將永遠不會進入你的服務器,否則,因此沒有必要建立自己的驗證邏輯。

57

As noted in the Nginx documentation, you should avoid using the if directive in Nginx where possible,因爲只要你在你的配置有if您的服務器需要評估每一個請求,以決定是否匹配if與否。

更好的解決方案是多個服務器指令。

server { 
     listen 80; 
     server_name website.com; 
     return 301 $scheme://www.website.com$request_uri; 
} 

server { 
     listen 80; 
     server_name www.website.com; 
     ... 
} 

如果你想成爲一個SSL(HTTPS)啓用網站,你有或多或少的三個不同的選項。

  1. 設置多個IP地址,每個服務器僞指令監聽自己的IP(或不同的端口,如果這是您的選擇)。這個選項需要SSL證書website.comwww.website.com,所以要麼你有一個通配符證書,一個UNI證書(多個域)或者只是兩個不同的證書。
  2. 在應用程序中進行重寫。
  3. 使用可怕的if指令。

There is also an option to use SNI, but I'm not sure this is fully supported as of now

+0

你的簡單代碼做到了。謝謝一堆! – 2013-07-22 20:35:27

+0

該解決方案還具有發送HTTP 301 Moved Permanently響應狀態碼的額外好處。這是一個高效,優雅和可讀的解決方案。謝謝! – ndmeiri 2017-11-23 03:47:36