Sikap kami: kami adalah Geonode dan kami menjual layanan proxy kepada para pengumpul data, sehingga robots.txt berada tepat di tengah-tengah proses kerja pelanggan kami. Faktanya, mematuhi aturan ini menguntungkan Anda, bukan hanya situs tersebut. Crawler yang menghormati file tersebut, mengidentifikasi dirinya, dan mengatur kecepatannya adalah crawler yang dapat diizinkan oleh operator situs. Crawler yang mengabaikannya adalah gangguan yang harus diblokir, dan pemblokiran itu murah bagi mereka tetapi mahal bagi Anda. Kami juga ingin menjelaskan dengan jelas apa yang dinyatakan standar itu sendiri mengenai hal ini: RFC secara tegas menyatakan bahwa aturan-aturan ini “bukanlah bentuk otorisasi akses” — sehingga mematuhi robots.txt memang diperlukan namun tidak cukup, dan ketentuan layanan merupakan masalah terpisah.
Apa Itu robots.txt dan Apa yang Bukan
Penjelasan dalam RFC sendiri adalah yang paling jelas:
Mungkin akan merepotkan bagi pemilik layanan jika crawler mengunjungi seluruh ruang URI mereka. Dokumen ini menetapkan aturan yang awalnya didefinisikan oleh "Robots Exclusion Protocol" yang harus dipatuhi oleh crawler saat mengakses URI.
Aturan-aturan ini bukanlah bentuk otorisasi akses.
Kalimat terakhir tersebut memiliki dua makna. Artinya, jalur yang dilarang tidak dilindungi — tidak ada yang menegakkan aturan tersebut — dan artinya jalur yang diizinkan tidak otomatis diotorisasi, karena izin berasal dari ketentuan dan hukum, bukan dari berkas teks.
Bagian keamanan menjelaskan bagian pertama secara eksplisit dan layak dikutip karena banyak orang yang salah paham:
Protokol Pengecualian Robot bukanlah pengganti dari langkah-langkah keamanan konten yang sah. Mencantumkan jalur dalam berkas robots.txt membuatnya terpapar secara publik dan karenanya membuat jalur tersebut dapat ditemukan.
Jadi, Disallow: /admin/secret-reports/ memberitahu dunia bahwa jalur tersebut ada. Jika Anda sedang menyusun berkas robots.txt, hal ini menjadi alasan untuk tidak mencantumkan jalur sensitif sama sekali di dalamnya — gunakan otentikasi, yang secara eksplisit direkomendasikan oleh RFC.
Format
Sebuah berkas terdiri dari urutan kelompok. Setiap kelompok diawali dengan satu atau lebih baris user-agent dan diikuti oleh aturan-aturan.
User-agent: *
Disallow: /admin/
Disallow: /search?
Allow: /search/help
User-agent: BadBot
Disallow: /
Sitemap: https://example.com/sitemap.xml
Tiga karakter khusus yang HARUS didukung oleh crawler:
| Karakter | Arti | Contoh |
|---|---|---|
# | Komentar baris | allow: / # comment in line |
$ | Akhir pola pencocokan | allow: /this/path/exactly$ |
* | Nol atau lebih karakter apa pun | allow: /this/*/exactly |
Grup kosong di akhir memiliki arti: RFC menyebutkan bahwa "grup terakhir mungkin tidak memiliki aturan, yang berarti secara implisit mengizinkan segalanya". Jadi, User-agent: quxbot di bagian akhir tanpa apa pun di bawahnya memberikan akses tanpa batasan kepada crawler tersebut.
Disallow: kosong tanpa jalur juga berarti semuanya diizinkan — ini adalah cara konvensional untuk menyatakan "tanpa batasan".
Sitemap: bukan bagian dari tata bahasa inti. ABNF dalam RFC menyertakan catatan bagi pengembang untuk “mendefinisikan baris tambahan yang Anda butuhkan (misalnya, Sitemaps)”, sehingga ini merupakan ekstensi yang didukung secara luas, bukan fitur yang diwajibkan. Crawl-delay termasuk dalam kategori yang sama: umum, diakui oleh banyak crawler, dan tidak tercantum dalam standar.
Cara Kerja Pencocokan User-Agent
Lebih spesifik daripada yang dibayangkan kebanyakan orang, dan penting untuk dipahami dengan benar.
Token tersebut merupakan substring dari header User-Agent Anda. Contoh dari RFC: header Mozilla/5.0 (compatible; ExampleBot/0.1; https://www.example.com/bot.html) sesuai dengan baris robots.txt dari user-agent: ExampleBot, dan disebutkan bahwa "token produk (ExampleBot) merupakan substring dari header HTTP User-Agent."
Pencocokan tidak membedakan huruf besar-kecil. "Crawler WAJIB menggunakan pencocokan yang tidak membedakan huruf besar-kecil untuk menemukan grup yang cocok dengan token produk, lalu mematuhi aturan grup tersebut."
Beberapa grup yang cocok akan digabungkan. "Jika terdapat lebih dari satu grup yang cocok dengan user-agent, aturan dari grup-grup yang cocok tersebut WAJIB digabungkan menjadi satu grup." Jadi, dua blok User-agent: ExampleBot terpisah dalam berkas yang sama akan menghasilkan satu kumpulan aturan gabungan, bukan blok kedua yang menggantikan yang pertama.
Anda mendapatkan satu grup, bukan beberapa. Jika ada grup yang menyebutkan token Anda, gunakan grup tersebut dan abaikan sepenuhnya grup * — karakter wildcard berfungsi sebagai cadangan, bukan sebagai dasar yang ditambahkan oleh aturan-aturan spesifik. Hal ini mengejutkan banyak orang: crawler yang memiliki grup sendiri tidak tunduk pada aturan umum.
Dan jika tidak ada yang cocok sama sekali: "Jika tidak ada grup yang cocok dengan token produk dan tidak ada grup dengan baris user-agent yang memiliki nilai *, atau tidak ada grup sama sekali, maka tidak ada aturan yang berlaku."
Pencocokan Dilakukan Berdasarkan Spesifisitas, Bukan Urutan
Aturan yang paling sering disalahartikan dalam seluruh bidang ini.
Untuk mengevaluasi apakah akses ke suatu URI diizinkan, sebuah crawler HARUS mencocokkan jalur-jalur dalam aturan "allow" dan "disallow" dengan URI tersebut. Pencocokan SEBAIKNYA membedakan huruf besar-kecil. Pencocokan HARUS dimulai dari oktet pertama jalur tersebut. Pencocokan yang paling spesifik yang ditemukan HARUS digunakan. Pencocokan yang paling spesifik adalah pencocokan yang memiliki oktet terbanyak.
Bukan "pencocokan pertama yang menang". Bukan "pencocokan terakhir yang menang". Pencocokan terpanjang yang menang.
Contoh dari RFC itu sendiri:
User-Agent: foobot
Allow: /example/page/
Disallow: /example/page/disallowed.gif
Untuk example.com/example/page/disallowed.gif, baris Disallow lebih panjang, sehingga berlaku — meskipun muncul kedua dan meskipun ada Allow yang mencakup jalur induknya.
Balikkan urutan dalam berkas dan tidak ada yang berubah. Urutan tidak relevan.
Dua aturan tambahan melengkapi gambaran ini. Jika terjadi kesamaan, maka Allow yang berlaku: "Jika aturan 'allow' dan aturan 'disallow' setara, maka aturan 'allow' SEBAIKNYA digunakan." Dan tidak ada kecocokan berarti diizinkan: "Jika tidak ditemukan kecocokan di antara aturan dalam suatu grup untuk user-agent yang sesuai atau tidak ada aturan dalam grup tersebut, maka URI tersebut diizinkan."
Satu detail lagi yang perlu diketahui: "URI /robots.txt secara implisit diizinkan", sehingga berkas yang melarang segalanya tidak melarang dirinya sendiri.
Pencocokan jalur juga melibatkan normalisasi dengan pengkodean persen. Oktet di luar ASCII dan yang berada dalam rentang yang dicadangkan "HARUS dikodekan dengan persen" sebelum perbandingan, dan oktet ASCII yang dikodekan dengan persen dalam URI "HARUS dikodekan kembali sebelum perbandingan" kecuali jika oktet tersebut dicadangkan. Dalam praktiknya: gunakan pustaka yang terkelola daripada menulisnya sendiri.
Kode Status Mengubah Segalanya
Aturan-aturan di sini sangat tepat, sering diabaikan, dan perbedaan antara dua di antaranya sangat besar.
Keberhasilan. "Jika crawler berhasil mengunduh berkas robots.txt, crawler WAJIB mengikuti aturan yang dapat diparsing."
Pengalihan. "Crawler SEBAIKNYA mengikuti setidaknya lima pengalihan berturut-turut, bahkan melintasi otoritas." Sebuah berkas yang dapat dijangkau dalam lima pengalihan "HARUS diambil, diparsing, dan aturannya diikuti dalam konteks otoritas awal". Jika melebihi lima, crawler "DAPAT menganggap bahwa berkas robots.txt tidak tersedia."
Tidak Tersedia — 4xx. "Jika kode status server menunjukkan bahwa berkas robots.txt tidak tersedia bagi crawler, maka crawler BOLEH mengakses sumber daya apa pun di server tersebut." Kode 404 berarti tidak ada pembatasan.
Tidak Dapat Dijangkau — 5xx. Inilah yang sering disalahpahami orang: "Jika berkas robots.txt tidak dapat dijangkau karena kesalahan server atau jaringan, ini berarti berkas robots.txt tidak terdefinisi dan crawler HARUS menganggap adanya larangan penuh."
Kode 5xx berarti berhenti sepenuhnya. Bukan "lanjutkan seperti sebelumnya", bukan "gunakan salinan cache tanpa batas waktu" — larangan total. RFC memang mengizinkan pengecualian jangka panjang: jika berkas tersebut tidak terdefinisi "selama periode waktu yang wajar (misalnya, 30 hari), crawler BOLEH mengasumsikan bahwa berkas robots.txt tidak tersedia... atau terus menggunakan salinan yang disimpan dalam cache."
Kesalahan penguraian. "Crawler HARUS mencoba mengurai setiap baris berkas robots.txt. Crawler HARUS menggunakan aturan yang dapat diurai." Baris yang tidak valid tidak membuat berkas tersebut tidak sah; gunakan apa yang dapat Anda baca.
Implikasi praktis bagi siapa pun yang menulis crawler: gangguan sementara di situs target seharusnya menghentikan sementara proses crawling Anda, bukan mempercepatnya. Jika hal ini dibalik, berarti Anda akan membebani situs yang sudah mengalami kesulitan.
Penyimpanan dalam Cache dan Batasan
Dua persyaratan operasional yang sering menjadi kendala bagi implementasi buatan sendiri.
Perbarui setidaknya setiap hari. "Crawler BOLEH menyimpan dalam cache isi berkas robots.txt yang diambil... Crawler TIDAK SEHARUSNYA menggunakan versi yang disimpan dalam cache selama lebih dari 24 jam, kecuali jika berkas robots.txt tidak dapat diakses."
Mengambil berkas sekali saat crawler Anda dimulai dan menjalankannya selama seminggu tidak sesuai ketentuan. Situs mengubah aturannya, dan tugas yang berjalan lama perlu mendeteksinya.
Parsing setidaknya 500 KiB. "Batas penguraian HARUS setidaknya 500 kibibyte." Situs besar memiliki berkas yang besar, dan pengurai yang memotong pada ukuran yang lebih kecil secara sewenang-wenang akan secara diam-diam melewatkan aturan — yang merupakan mode kegagalan terburuk di sini, karena hal itu menghasilkan crawler yang mengira dirinya patuh padahal sebenarnya tidak.
Membaca Berkas Nyata
Mempelajari contoh yang realistis.
User-agent: *
Disallow: /search
Allow: /search/about
Disallow: /*?sessionid=
Disallow: /*.pdf$
Crawl-delay: 2
User-agent: GPTBot
Disallow: /
User-agent: PartnerBot
Disallow:
Sitemap: https://example.com/sitemap_index.xml
Baris demi baris:
**Disallow: /search
** memblokir /search
, /search/
, /search/results
— apa pun yang dimulai dengan string tersebut, karena pencocokan dimulai dari oktet pertama dan tidak ada $
.
**Allow: /search/about
** lebih panjang, sehingga menang untuk jalur spesifik tersebut. Yang terpenting adalah kecocokan terpanjang, bukan urutannya.
**Disallow: /*?sessionid=
** menggunakan karakter pengganti untuk memblokir jalur apa pun yang mengandung parameter sesi, terlepas dari apa yang mendahuluinya.
**Disallow: /*.pdf$
** memblokir URL yang berakhir dengan .pdf
. Tanpa $
, URL ini juga akan memblokir /report.pdf.html
.
**Crawl-delay: 2
** merupakan ekstensi, bukan standar, dan mematuhinya merupakan praktik yang baik.
**User-agent: GPTBot
dengan Disallow: /
** mengecualikan crawler tersebut sepenuhnya. Perhatikan bahwa GPTBot hanya mendapatkan aturan ini — crawler ini tidak termasuk dalam grup *
, sehingga aturan Crawl-delay
di atas tidak berlaku untuknya.
**User-agent: PartnerBot
dengan Disallow:
yang kosong** memberikan akses tanpa batasan.
**Sitemap:
** mengarah ke inventaris URL, yang merupakan baris paling berguna secara langsung di sebagian besar berkas. Kami telah membahas cara menggunakannya dalam cara menemukan semua halaman di sebuah situs web.
Menerapkannya dalam Kode
Gunakan parser yang terus diperbarui. Aturan pencocokan spesifisitas saja sudah sering menjadi sumber bug, dan normalisasi dengan pengkodean persentase bahkan lebih rumit.
Python: urllib.robotparser tersedia di pustaka standar dan memadai untuk kasus-kasus sederhana; parser sumber terbuka Google robotstxt beserta pengikat Python-nya mengimplementasikan RFC 9309 secara tepat. Scrapy memiliki RobotsTxtMiddleware yang terintegrasi dan diaktifkan secara default pada proyek baru — pastikan tidak ada yang menonaktifkannya.
Node: terdapat beberapa paket yang terawat yang mengimplementasikan standar tersebut.
Go: tersedia pustaka yang mengikuti aturan pencocokan RFC.
Apa pun yang Anda gunakan, pastikan empat hal berikut ini dilakukan dengan benar:
Segarkan setiap 24 jam, bukan hanya sekali saat startup. Anggap kode status 5xx sebagai larangan total, dan 404 sebagai tidak ada batasan. Lakukan pencocokan berdasarkan token produk Anda yang sebenarnya, dan pastikan header User-Agent Anda memuatnya. Ikuti hingga lima pengalihan, dengan menerapkan aturan dalam konteks host asli.
Dan yang kelima, yang tidak tercantum dalam RFC namun sama pentingnya: catat apa yang Anda lewati. Crawler yang secara diam-diam mengesampingkan setengah situs karena aturan yang tidak Anda duga adalah crawler di mana data yang hilang baru terungkap berminggu-minggu kemudian oleh seseorang yang bertanya mengapa laporan terlihat salah.
Hal-hal yang Tidak Tercakup dalam robots.txt
Perlu dijelaskan secara eksplisit, karena orang-orang sering menafsirkannya secara berlebihan baik secara positif maupun negatif.
Dokumen ini sama sekali tidak menyebutkan apa yang boleh Anda lakukan terhadap data yang Anda ambil. Hak cipta, hak atas basis data, dan ketentuan layanan berlaku secara terpisah.
Ini bukan izin. RFC secara tegas menyatakan hal tersebut. Jalur yang diizinkan adalah jalur yang tidak diminta oleh situs untuk dihindari oleh crawler, yang tidak sama dengan persetujuan untuk pengumpulan data secara massal.
Tidak ada batasan laju (rate limit) dalam standar. Crawl-delay adalah ekstensi. Bersikap sopan adalah tanggung jawab Anda.
Standar ini tidak membedakan tujuan. Sebuah berkas tidak dapat menyatakan "pengindeksan diperbolehkan, pelatihan AI tidak" dalam sintaks standar, meskipun banyak situs kini mendekati hal ini dengan menamai token crawler AI tertentu. Kerangka kerja penambangan teks dan data Uni Eropa mempertimbangkan pembatasan hak yang dapat dibaca mesin, dan mekanisme untuk mengungkapkannya masih dalam tahap penyempurnaan.
Standar ini tidak dapat menghentikan siapa pun. Ini hanyalah sebuah permintaan. Penegakannya dilakukan melalui pembatasan laju, pemblokiran, dan proses hukum — yang merupakan alasan praktis mengapa operator memilih untuk mengizinkan crawler tertentu daripada harus menghentikannya.
Pertanyaan Lainnya
Apakah robots.txt mengikat secara hukum?
Tidak secara langsung. RFC 9309 menyatakan bahwa aturannya "bukanlah bentuk otorisasi akses" — melainkan permintaan yang diharapkan dipatuhi oleh crawler. Kewajiban hukum berasal dari ketentuan layanan, hak cipta, hak atas basis data, dan undang-undang khusus yurisdiksi, yang semuanya berlaku terlepas dari apa yang tertulis dalam berkas tersebut.
Apakah aturan robots.txt dicocokkan berdasarkan urutan?
Tidak, dan ini adalah kesalahan yang paling sering terjadi terkait hal ini. Spesifikasi mensyaratkan bahwa "kecocokan paling spesifik yang ditemukan HARUS digunakan", di mana "paling spesifik" berarti memiliki jumlah oktet terbanyak. Kecocokan terpanjang yang menang, urutan tidak relevan, dan jika terjadi seri, maka mengikuti aturan "Allow".
Apa yang terjadi jika robots.txt mengembalikan kode status 404?
Berkas tersebut "tidak tersedia", dan RFC menyatakan bahwa crawler "DAPAT mengakses sumber daya apa pun di server". Tidak adanya berkas berarti tidak ada pembatasan. Hal ini berbeda dengan kesalahan server.
Bagaimana jika robots.txt mengembalikan kode status 500?
Berkas tersebut "tidak dapat dijangkau" dan tidak terdefinisi, dan crawler "HARUS menganggapnya sebagai larangan penuh". Kesalahan server berarti harus berhenti sepenuhnya, bukan melanjutkan. Setelah periode yang lama — RFC menyarankan 30 hari — crawler dapat menganggapnya sebagai tidak tersedia atau terus menggunakan salinan yang disimpan dalam cache.
Seberapa sering saya harus mengambil file robots.txt?
Setidaknya setiap 24 jam. RFC menyatakan bahwa crawler “SEBAIKNYA TIDAK menggunakan versi yang disimpan dalam cache selama lebih dari 24 jam, kecuali jika file robots.txt tidak dapat diakses”. Mengambil file sekali saat startup dan membiarkannya berlaku selama seminggu tidak sesuai dengan ketentuan.
Apakah grup user-agent tertentu menggantikan grup wildcard?
Grup tersebut menggantikannya. Jika suatu grup menyebutkan token produk Anda, Anda mengikuti grup tersebut dan mengabaikan grup "*" sepenuhnya — aturan khusus tidak ditambahkan ke aturan umum. Dua grup yang menyebutkan token yang sama akan digabungkan menjadi satu.
Apa arti * dan $ dalam robots.txt?
* cocok dengan nol atau lebih karakter apa pun, dan $ menandai akhir pola pencocokan. Keduanya adalah karakter yang HARUS didukung oleh crawler. Disallow: /*.pdf$ memblokir URL yang berakhir dengan .pdf; tanpa $, hal ini juga akan memblokir /file.pdf.html.
Bisakah saya menggunakan robots.txt untuk menyembunyikan halaman sensitif?
Tidak, dan melakukannya justru memperburuk keadaan. Bagian keamanan dalam RFC menyebutkan bahwa "mencantumkan jalur dalam berkas robots.txt membuatnya terpapar secara publik dan karenanya jalur tersebut dapat ditemukan". Siapa pun dapat membaca berkas tersebut. Gunakan otentikasi, yang secara eksplisit direkomendasikan oleh spesifikasi sebagai gantinya.
Kesimpulan: Aturan "
robots.txt" bersifat singkat, terstandarisasi, dan sering diterapkan secara keliru. Tiga aturan berikut menjadi penyebab sebagian besar kesalahan tersebut.
Kecocokan terpanjanglah yang menang, bukan yang pertama atau terakhir. Sebuah "Disallow" yang terletak lebih jauh di bawah berkas dapat menggantikan "Allow" yang berada di atasnya, dan sebaliknya, semata-mata berdasarkan panjangnya. Kode 5xx berarti penolakan total, yang bertentangan dengan implementasi intuitif — situs yang bermasalah seharusnya menerima lebih sedikit lalu lintas dari Anda, bukan jumlah yang sama. Dan berkas tersebut harus diperbarui setidaknya setiap hari, karena situs-situs dapat mengubah kebijakannya dan salinan cache yang berusia seminggu tidak memenuhi persyaratan kepatuhan.
Gunakan parser yang terawat daripada menulis sendiri, pastikan header User-Agent Anda benar-benar berisi token yang Anda harapkan untuk dicocokkan, dan catat apa yang Anda lewati sehingga data yang terlewat merupakan keputusan, bukan kejutan.
Dan perhatikan peringatan dalam standar itu sendiri. Aturan-aturan ini “bukanlah bentuk otorisasi akses” — mematuhinya menjadikan Anda sebagai crawler yang dapat diterima oleh operator, dan hal ini tidak menyelesaikan pertanyaan terpisah mengenai apa yang diizinkan oleh ketentuan tersebut dan apa yang boleh Anda lakukan dengan data yang Anda kumpulkan.
