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?


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

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

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"

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;
  }
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.