2014-10-10 5 views
7

ZusammenfassungNginx: verschiedene robots.txt für alternte Domain

Ich habe einen einzelnen Web-App mit einer internen und externen Domäne zeigt sie, und ich eine robots.txt will, dass alle Zugriff auf die interne Domäne blockieren , aber erlauben Sie allen Zugriff auf die externe Domäne.

Problem Details

I einen einfachen Nginx Server Block haben, die ich auf eine Proxy-Django Anwendung verwendet (siehe unten). Wie Sie sehen können, reagiert dieser Serverblock auf jede Domäne (aufgrund des Fehlens des Parameters server_name). Ich frage mich jedoch, wie man bestimmte Domains markiert, so dass Nginx eine benutzerdefinierte robots.txt-Datei für sie bereitstellt.

Genauer gesagt sagen die Domänen example.com und www.example.com eine Standard-robots.txt-Datei aus dem Verzeichnis htdocs. (Da "root/sites/mysite/htdocs" gesetzt ist und eine robots.txt Datei sich unter /sites/mysite/htdocs/robots.txt befindet)

ABER, ich möchte auch die Domain "example.internal.com "(bezieht sich auf denselben Server wie example.com), um eine benutzerdefinierte robots.txt-Datei zu erhalten; Ich möchte eine benutzerdefinierte robots.txt erstellen, damit Google diese interne Domäne nicht indiziert.

Ich dachte über das Duplizieren des Serverblocks und das Angeben der folgenden in einem der Serverblöcke. Und dann die robots.txt-Suche in diesem Serverblock irgendwie überschreiben.

"server_name internal.example.com;" 

Aber das Duplizieren des gesamten Serverblocks nur für diesen Zweck scheint nicht sehr DRY.

Ich dachte auch darüber nach, vielleicht eine if-Anweisung zu verwenden, um zu überprüfen, ob der Host-Header die interne Domäne enthält. Und dann die benutzerdefinierte robots.txt-Datei auf diese Weise zu bedienen. Aber Nginx sagt If Is Evil.

Was ist ein guter Ansatz für die Bereitstellung einer benutzerdefinierten robots.txt-Datei für eine interne Domäne?

Vielen Dank für Ihre Hilfe.

Hier ist ein Codebeispiel des Serverblocks, den ich verwende.

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; 
    } 
} 

Antwort

14

Sie können map verwenden, um eine bedingte Variable zu definieren. Fügen Sie diese außerhalb Serverrichtlinie:

server_name internal.example.com; 

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

Jetzt können Sie in Ihrem Stamm haben zwei robots.txt-Dateien:

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

Dann kann die Variable mit try_files wie folgt verwendet werden

robots.txt 
internal-robots.txt 
+0

Vielen Dank für diesen Ansatz, Putnamhill. Das sieht genau so aus, wie ich es versuche. –

+2

Gern geschehen, Joe. Es war ein lustiges Puzzle zu lösen. –