Seperti dari apa yang saya pahami DNS menghubungkan nama domain dengan alamat IP dari server situs web disimpan, apakah itu berarti setiap server hanya dapat menyimpan satu situs web? Jika tidak, bagaimana cara memanggil alamat IP server mengetahui situs web yang saya inginkan jika ada banyak di server yang sama?
80
Host:
header. Dalam hal hosting bersama, server web dapat dikonfigurasikan oleh penyedia untuk menangani ini dengan cara yang berbeda (misalnya memiliki default, mengarahkan ulang ke penyedia, dll.).Jawaban:
Pada dasarnya: browser menyertakan nama domain dalam permintaan HTTP, sehingga server web tahu domain mana yang diminta dan dapat meresponsnya.
Permintaan HTTP
Begini cara permintaan HTTP tipikal Anda terjadi:
Pengguna menyediakan URL, dalam formulir
http://host:port/path
.Browser mengekstrak bagian host (domain) dari URL dan menerjemahkannya ke alamat IP jika perlu, dalam proses yang dikenal sebagai resolusi nama . Terjemahan ini dapat terjadi melalui DNS, tetapi tidak harus (misalnya,
hosts
file lokal pada OS umum melewati DNS).Browser membuka koneksi TCP ke port yang ditentukan, atau default ke port 80, pada alamat IP itu.
Browser mengirim permintaan HTTP. Untuk HTTP / 1.1, tampilannya seperti ini:
(
Host
Header adalah standar dan diperlukan dalam HTTP / 1.1. Itu tidak ditentukan dalam spesifikasi HTTP / 1.0, tetapi beberapa server tetap mendukungnya.)Dari sini, server web memiliki beberapa informasi yang dapat digunakan untuk memutuskan apa yang seharusnya menjadi respons. Perhatikan bahwa dimungkinkan untuk satu server web terikat ke beberapa alamat IP.
Host
header oleh browser dalam permintaan HTTP.Seperti yang Anda perhatikan, pengaturan hosting bersama yang paling umum akhir-akhir ini menempatkan banyak situs web pada satu alamat IP: kombinasi port, hanya menyisakan
Host
perbedaan antara situs web.Ini dikenal sebagai Host Virtual Berbasis-Nama di Apache-land, sementara Nginx menyebut mereka Nama Server di Blok Server dan IIS lebih suka Server Virtual .
Bagaimana dengan HTTPS?
HTTPS sedikit berbeda. Semuanya identik dengan pembentukan koneksi TCP, tetapi setelah itu terowongan TLS terenkripsi harus dibuat. Tujuannya adalah untuk tidak membocorkan informasi tentang permintaan tersebut.
Untuk memverifikasi bahwa server benar-benar memiliki domain ini, server harus mengirim sertifikat yang ditandatangani oleh pihak ketiga yang tepercaya. Browser kemudian akan membandingkan sertifikat ini dengan domain yang diminta.
Ini menimbulkan masalah. Bagaimana server mengetahui sertifikat host (situs web) mana yang akan dikirim, jika perlu melakukan ini sebelum permintaan HTTP diterima?
Secara tradisional, ini diselesaikan dengan memiliki alamat IP khusus (atau port) untuk setiap situs web yang membutuhkan HTTPS. Jelas, ini menjadi bermasalah ketika kita mulai kehabisan alamat IPv4.
Masukkan SNI (Indikasi Nama Server). Browser sekarang melewati nama host selama negosiasi TLS, sehingga server memiliki info ini cukup awal untuk mengirim sertifikat yang benar. Di sisi server, konfigurasi sangat mirip dengan bagaimana virtual host HTTP dikonfigurasikan.
Kelemahannya adalah nama host sekarang disahkan sebagai teks biasa sebelum enkripsi, dan pada dasarnya adalah informasi yang dibocorkan. Ini biasanya dianggap sebagai tradeoff yang dapat diterima, mengingat nama host biasanya diekspos dalam permintaan DNS.
Bagaimana jika Anda meminta situs hanya dengan alamat IP?
Apa yang dilakukan server ketika tidak tahu host spesifik mana yang Anda minta tergantung pada implementasi dan konfigurasi server. Biasanya, ada situs "default", "catchall" atau "fallback" yang ditentukan yang akan memberikan respons terhadap semua permintaan yang tidak secara spesifik menentukan host.
Situs default ini dapat berupa situs independennya sendiri (sering menampilkan pesan kesalahan), atau bisa juga situs lain di server, tergantung pada preferensi admin server.
sumber
Saya memiliki penjelasan ini untuk orang-orang non-teknologi.
Jack, Jill, dan Joe tinggal di asrama, dan mereka tidak punya ponsel.
Dalam buku telepon, semuanya terdaftar dengan nomor yang sama. (Rekor)
Anda memutar nomornya, dan seseorang mengangkat telepon; Anda mengatakan "Saya ingin berbicara dengan Jill", dan Anda membuatnya terhubung.
Alih-alih A-record (A phonenumber / IP-adress) dalam buku telepon, itu mungkin hanya mengatakan "Asrama X", maka Anda harus mencari lebih jauh untuk nomor Asrama X. Ini adalah catatan CNAME.
Jika Jill tidak tersedia, Anda mungkin mendapatkan
302 Jill mengunjungi Peter, panggil saja dia
400 Saya tidak bisa mengerti Anda.
451 Anda melanggar perintah penahanan Anda.
500 Sistem telepon kami rusak.
sumber
Pertama, Anda perlu memahami bahwa ada sejumlah konsep berbeda di sini.
Tidak ada hubungan satu-ke-satu di antara semua hal ini. Satu server dapat memiliki beberapa alamat IP; beberapa nama host dapat menunjuk pada satu alamat IP; satu nama host dapat menunjuk pada beberapa alamat IP. Beberapa situs web dapat menggunakan nama host yang sama. Satu situs web dapat tersebar di beberapa nama host.
Di masa lalu (HTTP 1.0 dan sebelumnya) setiap nama host yang ingin ditangani server berbeda harus memiliki alamat IP sendiri. Ini agak boros.
HTTP 1.1 menambahkan
Host
header "sebagai bidang wajib dalam permintaan HTTP (IIRC beberapa vendor sebelumnya mendukung ini sebagai ekstensi). Ini memberitahu server mana nama host telah diminta dan karenanya memungkinkannya untuk menyajikan konten yang berbeda untuk nama host yang berbeda pada saat yang sama Alamat IP. Dukungan untuk HTTP 1.1 di klien sekarang ada di mana-mana.Sayangnya, SSL (kemudian TLS) menambahkan kerutan. Membuat sesi SSL / TLS mengharuskan server untuk menampilkan sertifikat kepada klien yang mencakup nama host yang diminta, tetapi permintaan HTTP tidak sampai sampai sesi SSL / TLS dibuat.
Dimungkinkan untuk memiliki satu sertifikat yang mencakup beberapa nama host melalui penggunaan
SubjectAltName
bidang atau penggunaan wildcard diCommonName
bidang tersebut. Namun, ini menimbulkan tantangan administratif, terutama jika nama host yang terlibat berada di bawah domain dengan kepemilikan yang berbeda.Jadi TLS memperkenalkan ekstensi "indikasi nama server" (SNI). Dengan ekstensi ini, klien mengirimkan nama host yang diminta ke server selama prosedur jabat tangan TLS. Server kemudian dapat menyajikan sertifikat yang sesuai. Sayangnya, sementara versi saat ini dari semua implementasi SSL / TLS utama mendukung SNI, butuh waktu lama untuk versi yang lebih lama tidak digunakan lagi.
sumber
Jawabannya sedikit lebih rumit daripada beberapa jawaban yang ada. Ketika Anda melakukan pencarian DNS, Anda HARUS mendapatkan alamat IP (
A
rekam untuk IPv4,AAAA
untuk IPv6). Anda harus dapat membuka soket melalui TCP / IP untuk berkomunikasi atau semuanya gagal. Alamat itu mungkin mewakili server atau mungkin mewakili penyeimbang beban. Bahkan bisa mewakili proxy. Jika host ada di belakang CloudFlare, misalnya, alamat yang Anda dapatkan adalah dari server CloudFlare. Server sebenarnya ada di tempat lain. Ini memungkinkan tuan rumah menghindari masalah seperti serangan Denial-of-Service.Hosting virtual adalah apa yang Anda tanyakan (beberapa pertanyaan lain menyentuh ini, tetapi tidak secara mendetail). Hosting virtual mengambil permintaan web dan melihat nama host (yaitu domain.com) untuk menentukan situs web mana yang akan ditayangkan. Jadi di server web Apache HTTP Anda akan memiliki konfigurasi seperti ini
Ini disederhanakan misalnya. Jadi kami memberi tahu Apache untuk mendengarkan pada port 80 IP mana saja (di mesin virtual modern yang menghosting IP mesin Anda mungkin berbeda dari IP live-nya). Kami kemudian memberi tahu bahwa ini adalah
domain.com
situs web dan direktori tempat tinggalnya. Kami kemudian dapat mengulangi blok ini berulang-ulang untuk memberi tahu Apache untuk menangani situs web yang berbeda. Setiap server web mendukung sistem jenis ini.Cara lain untuk menangani ini adalah dengan memberi tahu server web untuk mengarahkan semua lalu lintas web ke satu skrip pemrograman tunggal (yaitu PHP, ASP.NET, dll) dan kemudian skrip tunggal akan menentukan situs web dan halaman mana yang akan ditampilkan.
sumber
Menggunakan DNS, Anda dapat menetapkan sebanyak mungkin nama ke alamat IP individual yang Anda inginkan (dalam file host Anda, Anda dapat memisahkan setiap nama dengan spasi, misalnya). Menggunakan server DNS Anda juga dapat menetapkan beberapa alamat IP untuk satu nama . Itu tidak terbatas pada hubungan satu-ke-satu.
Server web tahu situs mana yang akan dilayani dengan memeriksa URL yang diminta. Itu terlihat di mana domain diminta, port yang diminta dan protokol apa yang digunakan. Ini tidak ada hubungannya dengan DNS dan ditangani oleh protokol HTTP.
sumber
Server web memiliki konsep wadah host (di sini adalah dokumentasi untuk Tomcat, misalnya). Beberapa wadah host dapat dikonfigurasi untuk kotak / alamat ip yang sama, melayani beberapa domain. Kontainer memiliki direktori kerja yang independen, ranah otentikasi, direktori log dan hal-hal sejenisnya.
Server menemukan wadah yang relevan untuk permintaan baru, membeli nama domain, adalah bagian dari permintaan HTTP ini.
Contoh server web yang sama sekali berbeda dapat berbagi alamat IP yang sama jika mereka berjalan pada port yang berbeda. Ini sebagian besar digunakan dalam berbagai lingkungan pengembangan dan pengujian di mana nama domain mungkin tidak tersedia, karena server produksi tidak dapat berjalan pada port arbitrer.
Akhirnya, bahkan jika alamat IP yang sangat unik diperlukan untuk situs web, kotak server sering memiliki beberapa adapter jaringan sehingga dikonfigurasi untuk menggunakan beberapa alamat IP.
sumber
Alamat IP server Anda dapat menyimpan banyak nama domain yang berbeda secara bersamaan.
Ketika Anda mengakses situs web, browser Anda mengirimkan permintaan HTTP dengan nama domain di dalamnya, dan server dapat menemukan data situs web mana yang harus dikirim kepada Anda saat itu.
Ini disebut host virtual, sesederhana itu :)
Lihatlah di sini untuk informasi lebih lanjut tentang DNS dan host virtual.
sumber