2013-12-09 143 views
0

我想爲給定的URL提供2個不同版本的文件,具體取決於站點子域。Nginx重寫規則取決於子域

這裏就是我現在想:

location /robots.txt { 
if ($http_host ~* [www|fr|es|uk|de]\.example\.com) { 
     rewrite ^/robots.txt$ /robots_index_all.txt break; 
    } 
    rewrite ^/robots.txt$ /robots_dont_index_anything.txt break; 
} 

所以,我想要的行爲是服務於robots_index_all.txt文件時,機器人的請求下,子域名WWW的/robots.txt,法國,西班牙,英國和德

這時如果/robots.txt的請求在任何其他子域做我想報效/robots_dont_index_anything.txt

我一直在嘗試這種重寫,但它不工作的始終,我意味着一些子域名的工作,對於其他一些子域名,以及那裏除了這個在服務器上沒有太多的其他配置

有什麼我在這裏做錯了嗎?

謝謝!

回答

2

我討厭給「你拿着它錯」式的答案,但在這裏,你去...首先,don't use "if"除非你是真的真的不得不這樣做。其次,不要使用變量,它們是埃維爾太:)

不管怎麼說,在這種情況下,工作對我來說,當我有一個包羅萬象的虛擬主機是一個包羅萬象的改寫,與此類似:

rewrite ^/robots.txt$ /robots/$http_host.txt last;

,甚至嘗試一些更冒險:

location = /robots.txt { 
     try_files /robots/$http_host.txt /robots/robots.txt; 
} 

所以你實際上將每個子域管理的文件。

而作爲OP說他有900多個域是實際的服務器,我會做的是建立一個901'st域只做出迴應機器人,並把兩個機器人文件存在。然後,只需代理從原來的「域」的要求:

location = /robots.txt { 
     proxy_pass http://my-robots-server-ip/robots/$http_host.txt 
} 

和代理應該有這樣的事情(當然,有限制):

location /robots/(.*)\.(.*)\.(.*)\.txt { 
     try_files /robots/$1.txt /robots/$1.$2.txt /robots/$1.$2.$3.txt /robots/default.txt; 
} 

希望它能幫助!

+0

感謝您的回答,但我們實際上有900多個子域,並以這種方式這樣做將是龐大的,我也有包羅萬象的,但不是所有的領域都在那裏,所以我正在做的方式是有一個包括普通。 cfg在所有的服務器塊,這就是我想要一個單一的規則檢查子域的原因,如果可能是邪惡的,但你說是不可用? – jmserra

+0

@jmserra好吧,無論如何都必須有一個模式,你不打算在900+重寫中管理它,對嗎?給我一個模式,我正則表達式的解決方案:) –

+0

@jmserra,對不起,錯誤dyour編輯。如果做奇怪的事情,我會看到不止一次。也許它現在是固定的,不能說,我儘量不使用它。 –