Cara mengatur robots.txt secara global di nginx untuk semua host virtual

13

Saya mencoba untuk mengatur robots.txtsemua host virtual di bawah server nginx http. Saya bisa melakukannya di Apache dengan meletakkan yang berikut ini di utama httpd.conf:

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

Saya mencoba melakukan sesuatu yang mirip dengan nginx dengan menambahkan baris yang diberikan di bawah ini (a) di dalam nginx.conf dan (b) dengan menyertakan conf.d / robots.conf

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

Saya telah mencoba dengan '=' dan bahkan memasukkannya ke dalam salah satu virtual host untuk mengujinya. Tampaknya tidak ada yang berhasil.

Apa yang kulewatkan di sini? Apakah ada cara lain untuk mencapai ini?

anup
sumber
Catatan: Tidak ada cara untuk meletakkannya sebagai pengaturan Global (mis. Diatur dalam satu file yang berlaku untuk semua host virtual tanpa pernyataan sertakan). Seseorang dapat mengatur robots.conf di conf.d (atau global.d [non-standard]) dan memasukkannya ke dalam setiap konfigurasi host virtual. Semua jawaban lain menunjuk ke berbagai cara untuk melakukan hal yang sama yaitu: proxy_pass, retrun {} dll.
anup

Jawaban:

4

lokasi tidak dapat digunakan di dalam httpblok. nginx tidak memiliki alias global (yaitu alias yang dapat didefinisikan untuk semua vhosts). Simpan definisi global Anda dalam folder dan sertakan itu.

server {
  listen 80;
  root /var/www/html;
  include /etc/nginx/global.d/*.conf;
}
pengguna79644
sumber
Seperti yang diberikan dalam pertanyaan saya telah mencoba melakukannya dengan meletakkan robots.conf di folder conf.d. Tetapi itu tidak bekerja secara global.
anup
lanjutan ... Seperti yang Anda katakan, Nginx tidak memiliki alias global. Akhirnya resolusinya adalah menambahkannya per konfigurasi host virtual.
anup
43

Anda dapat mengatur konten file robots.txt secara langsung di konfigurasi nginx:

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

Dimungkinkan juga untuk menambahkan Tipe-Konten yang benar:

    location = /robots.txt {
       add_header Content-Type text/plain;
       return 200 "User-agent: *\nDisallow: /\n";
    }
Konstantin V Bekreyev
sumber
1
Hanya sebuah catatan: Saya harus meletakkan location = /robots.txt(Perhatikan tanda sama dengan) jika tidak location ~* \.(txt|log)$pertandingan lain di bawahnya menimpanya.
Beebee
Bagaimana ini bisa ditambahkan ke rapi conf.d/robots.conf? Seperti "arahan" lokasi tidak diizinkan di sini , yang masuk akal, tetapi tidak untuk server tertentu. Saya tidak yakin tentang jawaban @ user79644 untuk ini. Apakah tak terhindarkan untuk menambahkan ini ke setiap situs?
Pablo A
Saya belum menguji ini. Tapi, terlihat mirip dengan yang dimaksud, kecuali bahwa 'kembali' digunakan sebagai pengganti alias. Masalah yang saya hadapi adalah menjadikannya pengaturan global. Yang berarti saya tidak boleh mengulanginya di setiap .conf situs web. Saya tidak bisa mendapatkan metode global untuk bekerja seperti cara kerjanya dengan Apache. Katakan misalnya server Pengembangan yang tidak boleh dirayapi.
anup
10

Apakah ada aturan lain yang didefinisikan? Mungkin common.conf atau file conf lain di dalamnya termasuk over-riding konfigurasi Anda. Salah satu dari berikut ini pasti akan berhasil.

location /robots.txt { alias /home/www/html/robots.txt; }
location /robots.txt { root /home/www/html/;  }
  1. Nginx menjalankan semua lokasi "regexp" sesuai dengan penampilannya. Jika ada lokasi "regexp" berhasil, Nginx akan menggunakan pertandingan pertama ini. Jika tidak ada lokasi "regexp" berhasil, Nginx menggunakan lokasi biasa yang ditemukan pada langkah sebelumnya.
  2. Lokasi "regexp" lebih diutamakan daripada lokasi "awalan"
pengguna79644
sumber
Ini tidak berfungsi sebagai opsi global. Tapi, berfungsi dalam konfigurasi virtualhost. Saya menggunakan yang pertama (location /robots.txt) dan bahkan yang saya sebutkan dalam pertanyaan ('~ * /robots.txt'). Keduanya bekerja dari konfigurasi Virtual Host. Saya pikir penggunaan 'lokasi' 'jika {}' termasuk dalam direktif 'server' dan ini, mungkin tidak berfungsi di tingkat global.
anup
Pastikan Anda memiliki /robots.txtfile ke alias. Saya tidak mendapatkan rootopsi untuk bekerja.
Shadoath
-1

Saya memiliki masalah yang sama dengan tantangan acme, tetapi prinsip yang sama berlaku untuk kasus Anda juga.

Apa yang saya lakukan untuk mengatasi masalah ini adalah memindahkan semua situs saya ke port non-standar, saya memilih 8081, dan membuat server virtual mendengarkan pada port 80. Ini mem-proksi semua permintaan 127.0.0.1:8081, kecuali yang ke .kenal. Ini bertindak hampir sebagai alias global, dengan satu lompatan ekstra, tetapi itu seharusnya tidak menyebabkan penurunan kinerja yang signifikan karena sifat async dari 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;
  }
}
Ákos Vandra
sumber