2014-10-10 55 views
7

摘要Nginx的:不同的robots.txt的alternte域

我有它的內部和外部域指向一個單一的Web應用程序,我想一個robots.txt來阻止所有訪問內部域,但允許所有訪問外部域。

問題詳細

我有用於代理Django應用程序的簡單的Nginx服務器塊(見下文)。如您所見,此服務器塊響應任何域(由於缺少server_name參數)。不過,我想知道如何標記特定的域名,例如Nginx會爲他們提供一個自定義的robots.txt文件。

更具體地說,域example.com和www.example.com將從htdocs目錄提供默認的robots.txt文件。 (由於「root/sites/mysite/htdocs」已設置,robots.txt文件位於/sites/mysite/htdocs/robots.txt)

但是,我也希望域「example.internal.com 「(指與example.com相同的服務器)提供自定義robots.txt文件;我想創建一個自定義的robots.txt,所以谷歌不索引該內部域。

我想過複製服務器塊並在其中一個服務器塊中指定以下內容。然後以某種方式覆蓋該服務器塊中的robots.txt查找。

"server_name internal.example.com;" 

但是爲了這個目的複製整個服務器塊看起來不太乾燥。

我也想過使用if語句來檢查主機頭是否包含內部域。然後以這種方式提供自定義robots.txt文件。但Nginx說If Is Evil

什麼是爲內部域提供自定義robots.txt文件的好方法?

謝謝你的幫助。

這是我正在使用的服務器塊的代碼示例。

upstream app_server { 
    server unix:/sites/mysite/var/run/wsgi.socket fail_timeout=0; 
} 

server { 
    listen 80; 

    root /sites/mysite/htdocs;  

    location/{ 
     try_files $uri @proxy_to_app; 
    } 

    location @proxy_to_app { 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header X-Forwarded-Protocol $scheme; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Scheme $scheme; 
    proxy_set_header Host $http_host; 
    proxy_redirect off; 
    proxy_pass http://app_server; 
    } 
} 

回答

14

您可以使用map定義條件變量。收藏此服務器指令:

map $host $robots_file { 
    default robots.txt; 
    internal.example.com internal-robots.txt; 
} 

然後變量可以用try_files像這樣使用:

server_name internal.example.com; 

location = /robots.txt { 
    try_files /$robots_file =404; 
} 

現在你可以在你的根2個的robots.txt文件:

robots.txt 
internal-robots.txt 
+0

非常感謝您採用這種方法,putnamhill。這看起來正是我想要做的。喬,你不客氣, – 2014-10-13 15:04:31

+2

不客氣。這是一個有趣的難題要解決。 – 2014-10-13 15:06:51