すべての仮想ホストに対してnginxでrobots.txtをグローバルに設定する方法


13

robots.txtnginx httpサーバー下のすべての仮想ホストを設定しようとしています。以下をmainに入れることで、Apacheでそれを行うことができましたhttpd.conf

<Location "/robots.txt">
    SetHandler None
</Location>
Alias /robots.txt /var/www/html/robots.txt

以下の行を(a)nginx.conf内に追加し、(b)conf.d / robots.confをインクルードして、nginxで同様のことを試みました

location ^~ /robots.txt {
        alias /var/www/html/robots.txt;
}

私は「=」を試してみて、仮想ホストの1つに置いてテストしました。何も機能していないようです。

ここで何が欠けていますか?これを達成する別の方法はありますか?


注:これをグローバル設定(つまり、includeステートメントのないすべての仮想ホストに適用される1つのファイルに設定)にする方法はありませんでした。conf.d(またはglobal.d [非標準])でrobots.confを設定し、それをすべての仮想ホスト構成に含めることができます。他のすべての回答は、同じことを行うさまざまな方法を示しています。つまり、proxy_pass、retrun {}など
anup

回答:


4

場所はhttpブロック内では使用できません。nginxにはグローバルエイリアス(つまり、すべての仮想ホストに定義できるエイリアス)はありません。フォルダーにグローバル定義を保存し、それらを含めます。

server {
  listen 80;
  root /var/www/html;
  include /etc/nginx/global.d/*.conf;
}

質問で与えられたように、私はrobots.confをconf.dフォルダに置くことによってそうしようとしました。ただし、グローバルには機能しません。
anup 2014

続きます...あなたが言ったように、Nginxにはグローバルエイリアスがありません。最終的には、解決策は仮想ホスト構成ごとに追加することでした。
anup 2014

43

nginx設定でrobots.txtファイルの内容を直接設定できます。

    location = /robots.txt { return 200 "User-agent: *\nDisallow: /\n"; }

正しいContent-Typeを追加することもできます。

    location = /robots.txt {
       add_header Content-Type text/plain;
       return 200 "User-agent: *\nDisallow: /\n";
    }

1
ただのメモ:私はlocation = /robots.txt(等号に注意)を置く必要がありましlocation ~* \.(txt|log)$た。
Beebee 2017年

これを整頓に追加するにはどうすればよいconf.d/robots.confですか?であるとして「場所」ディレクティブは、ここでは許可されていない合理的である、が、それは特定のサーバーのためではありません。これに対する@ user79644の回答はわかりません。これを各サイトに追加することは避けられませんか?
パブロA

私はこれをテストしていません。しかし、エイリアスの代わりに「リターン」が使用されていることを除いて、問題のものに似ています。私が直面した問題は、それをグローバルな設定にすることです。つまり、ウェブサイトのすべての.confでそれを繰り返すべきではありません。Apacheで動作するようにグローバルメソッドを動作させることができませんでした。たとえば、クロールしてはならない開発サーバーを考えます。
-anup

10

定義されている他のルールはありますか?おそらくcommon.confまたは別のconfファイルが含まれているため、設定が上書きされています。次のいずれかが確実に機能するはずです。

location /robots.txt { alias /home/www/html/robots.txt; }
location /robots.txt { root /home/www/html/;  }
  1. Nginxは、すべての「正規表現」ロケーションを出現順に実行します。「正規表現」の場所が成功した場合、Nginxはこの最初の一致を使用します。「regexp」の場所が成功しなかった場合、Nginxは前のステップで見つかった通常の場所を使用します。
  2. 「regexp」の場所は「prefix」の場所よりも優先されます

グローバルオプションとしては機能しません。ただし、virtualhostの構成内で機能します。最初の1つ(場所/robots.txt)と、問題の場所( '〜* /robots.txt')を使用しました。どちらも仮想ホストの構成で機能しました。'location' 'if {}'の使用は 'server'ディレクティブに該当すると思いますが、これはおそらくグローバルレベルでは機能しません。
2013年

/robots.txtエイリアスするファイルがあることを確認してください。機能するrootオプションがありませんでした。
Shadoath 2017

-1

Acmeチャレンジでも同じ問題がありましたが、同じ原則があなたのケースにも当てはまります。

この問題を解決するために行ったのは、すべてのサイトを非標準のポートに移動することです。私はを選択し8081、ポート80でリッスンする仮想サーバーを作成しました127.0.0.1:8081。これは、.well-knownを除くすべての要求をにプロキシします。これはほぼ1つのホップを含むグローバルエイリアスとして機能しますが、nginxの非同期の性質により、パフォーマンスが大幅に低下することはありません。

upstream nonacme {
  server 127.0.0.1:8081;
}

server {
  listen 80;

  access_log  /var/log/nginx/acme-access.log;
  error_log   /var/log/nginx/acme-error.log;

  location /.well-known {
    root /var/www/acme;
  }

  location / {
    proxy_set_header    Host                $http_host;
    proxy_set_header    X-Real-IP           $remote_addr;
    proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
    proxy_set_header    X-Forwarded-Proto   $scheme;
    proxy_set_header    X-Frame-Options     SAMEORIGIN;

    # WebSocket support (nginx 1.4)
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";

    proxy_pass http://nonacme;
  }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.