Tetapkan Vary kepada nama pengepala permintaan yang digunakan oleh pelayan anda untuk memilih perwakilan halaman awam. Pada Mac, uji satu pengepala pada satu masa, bandingkan dokumen dan metadata yang diterima, serta semak respons lalai sebelum mengubah konfigurasi.

Panduan ini ditujukan kepada sesiapa yang menyelenggara dokumen awam dan menyemak penghantarannya melalui Terminal Mac. Contoh yang digunakan ialah “Panduan Bentuk” sintetik yang tersedia sebagai HTML atau teks biasa pada satu URL. Tugasnya adalah mengenal pasti input pemilihan sebenar, mengkonfigurasi pengepala respons yang sepadan dan mengesahkan hasilnya.

Apakah yang patut dimasukkan dalam pengepala Vary halaman?

Vary menamakan medan permintaan yang mungkin mempengaruhi pemilihan perwakilan, selain kaedah permintaan dan URL sasaran. Nilainya ialah nama pengepala seperti Accept, bukannya jenis media yang diminta. Ia menerangkan tingkah laku pemilihan; menambahkannya tidak melaksanakan tingkah laku tersebut. RFC 9110: Semantik HTTP, seksyen 12.5.5.

Contohnya, jika pelayan memilih HTML atau teks biasa menggunakan Accept, medan respons yang berkaitan ialah Vary: Accept. Jika lapisan penghantaran turut memilih output termampat atau tidak termampat menggunakan Accept-Encoding, kekalkan dimensi itu juga: Vary: Accept, Accept-Encoding. Ini ialah contoh bersyarat, bukannya konfigurasi universal untuk setiap halaman. Perundingan kandungan.

Soalan praktikalnya ialah: bolehkah respons cache yang dipilih untuk satu permintaan menjadi tidak sesuai untuk permintaan lain kerana pengepala ini berubah? Pencachean HTTP menghendaki medan yang dinamakan sepadan sebelum respons boleh digunakan semula tanpa pengesahan semula. Medan yang dinamakan tetapi tiada sepadan dengan medan lain yang juga tiada, bukannya medan yang hadir. RFC 9111: Pencachean HTTP, seksyen 4.1.

Mulakan dengan menyediakan inventori pemilihan. Semak peraturan pemilihan dokumen aplikasi dan sebarang transformasi respons yang dilakukan selepas itu. Hasil yang berubah ialah bukti yang berguna, tetapi hasil yang tidak berubah daripada dua permintaan tidak membuktikan bahawa pengepala itu tidak relevan bagi semua nilai yang disokong.

Sediakan matriks permintaan sebelum mengedit apa-apa

Bagi Panduan Bentuk sintetik, andaikan tingkah laku yang dikehendaki ialah HTML untuk pilihan HTML, teks biasa untuk pilihan teks biasa dan HTML apabila Accept tiada. Kedua-dua versi mengandungi maklumat neutral yang sama: “Bulatan, segi empat sama, segi tiga.” Ini ialah keperluan ilustrasi, bukannya pemerhatian daripada laman yang diterbitkan.

Ujian Tetapan permintaan Hasil yang dikehendaki Perkara yang perlu diperiksa
HTML Accept: text/html Dokumen HTML Isi kandungan, Content-Type, Vary
Teks biasa Accept: text/plain Dokumen teks biasa Isi kandungan, Content-Type, Vary
Lalai Tiada medan Accept Dokumen HTML Pemilihan lalai dan Vary
Ulangan HTML selepas teks biasa Dokumen HTML sekali lagi Sama ada varian terdahulu menjejaskan penghantaran
Input tidak digunakan Ubah pengepala yang tiada dalam peraturan pemilihan Perwakilan yang dipilih tetap sama Sama ada pengepala itu perlu disiasat

Kekalkan pemampatan pada tetapan yang sama semasa perbandingan pertama. Jika tidak, perbezaan bait mungkin berpunca daripada pemampatan dan bukannya dokumen yang berbeza. Siasat pemilihan format dahulu, kemudian pemampatan secara berasingan. Perbezaan ini selaras dengan peranan berasingan Accept dan Accept-Encoding. Perundingan kandungan.

Catat perbezaan yang bermakna dan jangan bergantung pada saiz fail sahaja. Dalam contoh ini, respons teks biasa sepatutnya mengandungi nama bentuk tanpa penanda HTML, dan jenis medianya sepatutnya menerangkan teks biasa. Cap masa terjana yang berubah memerlukan siasatan sebelum setiap perbezaan bait dianggap sebagai varian baharu.

Matriks ini ialah bantuan diagnostik, bukannya suite ujian perundingan yang lengkap. Setelah kes asas berfungsi, tambah keutamaan bercampur sebenar dan nilai kualiti yang disokong oleh halaman anda. Permintaan satu jenis yang ringkas tidak dapat menguji semua cabang algoritma pemilihan.

Rakam respons yang boleh dibandingkan dalam Terminal Mac

Anda memerlukan dokumen ujian awam yang mengandungi bahan sintetik, URL HTTPS terakhirnya dan Mac dengan bash serta curl tersedia. Contoh ini mengandaikan dokumen ujian tersebut sudah menyokong tingkah laku HTML/teks biasa yang diterangkan di atas. Ia tidak mencipta, memuat naik atau menerbitkan dokumen itu.

Buka Terminal dan tampal blok lengkap di bawah. Masukkan URL dokumen sintetik anda apabila diminta. Skrip ini mencipta direktori laporan sementara yang baharu dan menyimpan setiap isi respons bersama pengepalanya; skrip ini tidak menimpa laporan terdahulu.

bash <<'BASH'
set -eu

printf 'Public synthetic page URL: ' > /dev/tty
IFS= read -r page_url < /dev/tty

case "$page_url" in
  https://*) ;;
  *) printf 'Enter an HTTPS URL.\n' >&2; exit 1 ;;
esac

report_dir=$(mktemp -d "${TMPDIR:-/tmp}/vary-check.XXXXXX")
printf 'Report directory: %s\n' "$report_dir"

for sample in html plain absent html-again; do
  case "$sample" in
    html|html-again) accept_header='Accept: text/html' ;;
    plain) accept_header='Accept: text/plain' ;;
    absent) accept_header='Accept:' ;;
  esac

  curl --disable --silent --show-error --fail \
    --connect-timeout 5 --max-time 20 \
    --header "$accept_header" \
    --header 'Accept-Encoding: identity' \
    --dump-header "$report_dir/$sample.headers" \
    --output "$report_dir/$sample.body" \
    --url "$page_url"
done

printf 'Finished. Responses saved in: %s\n' "$report_dir"
BASH

Di sini, --header membekalkan medan permintaan yang dikawal, manakala Accept: membuang medan Accept yang dijana secara dalaman oleh curl. --dump-header dan --output menyimpan pengepala dan isi kandungan secara berasingan. Had masa sambungan dan pemindahan mengehadkan tempoh setiap permintaan. Pilihan ini didokumenkan dalam manual curl.

Skrip berhenti apabila curl melaporkan kegagalan pemindahan atau ralat HTTP yang diliputi oleh --fail. Periksa direktori yang dilaporkan sebelum mencuba semula: rakaman terdahulu mungkin masih ada, dan pemindahan yang gagal boleh meninggalkan fail yang tidak lengkap. Skrip ini sengaja tidak mengikuti ubah hala, jadi semak baris status dalam setiap fail pengepala. Jika anda merakam ubah hala, gunakan URL dokumen terakhir dan mulakan laporan baharu. Manual curl.

Buka direktori laporan dalam Finder menggunakan laluan yang dicetak oleh skrip. Periksa fail tersebut dalam penyunting teks biasa. Bandingkan html.body dengan plain.body, kemudian bandingkan html.body dengan html-again.body. Periksa absent.headers dengan teliti seperti respons yang menggunakan keutamaan eksplisit.

Anggap hasil yang disimpan sebagai pemerhatian daripada urutan permintaan ini. Hasil tersebut tidak membuktikan bahawa cache kongsi telah menyimpan apa-apa. Jika anda perlu menguji penggunaan semula cache, ulang urutan itu melalui laluan penghantaran yang dimaksudkan dengan syarat cache boleh digunakan yang didokumenkan, dan terbalikkan juga urutannya supaya teks biasa didahulukan.

Gunakan hasil pada lapisan yang menghasilkan respons

Bagi Panduan Bentuk ilustrasi, bukti pemilihan format sepatutnya menyokong Accept sebagai medan pemilihan. Konfigurasikannya pada tempat pengepala respons HTTP dijana atau dimuktamadkan. Jika lapisan lain sudah menambah ahli Vary yang diperlukan, kekalkan ahli itu apabila menambah ahli pemilihan format. Senarai akhir sepatutnya menerangkan tingkah laku pemilihan gabungan. RFC 9110: Semantik HTTP.

Berikut ialah cebisan pengepala respons untuk contoh ini apabila pemilihan format dan perundingan pemampatan kedua-duanya aktif. Ini bukan respons HTTP lengkap atau fail konfigurasi pelayan.

Vary: Accept, Accept-Encoding

Gunakan senarai Vary yang sama seperti yang dimaksudkan pada varian yang dirundingkan dan respons lalai, serta kekalkannya pada respons 304 Not Modified yang berkenaan. MDN mendokumenkan keperluan konsistensi ini secara jelas. Jadikan laluan respons ini sebahagian daripada pengesahan anda, bukannya hanya memeriksa respons HTML berjaya yang pertama. Pengepala Vary.

Menambah elemen meta dengan http-equiv="Vary" bukan pengganti yang disokong. WHATWG mentakrifkan set khusus arahan pragma HTML, yang tidak merangkumi Vary, dan menerangkan bahawa arahan tersebut sebahagian besarnya berasingan daripada pengepala HTTP. Gunakan konfigurasi pengepala respons yang sebenar. Standard HTML: Arahan pragma.

Jika antara muka penerbitan anda tidak dapat menetapkan pengepala respons, semak sama ada lapisan pengehosan atau aplikasi menawarkan sokongan yang didokumenkan. Jika pilihan itu tiada, alternatif praktikal bagi contoh sintetik ini ialah memberikan URL berasingan kepada dokumen HTML dan teks biasa dengan perwakilan yang stabil, bukannya merundingkan formatnya pada satu URL. Ini menghapuskan dimensi pemilihan tersebut; transformasi lain masih perlu dinilai secara berasingan.

Diagnosis variasi yang tiada, berlebihan dan mengelirukan

Gunakan rakaman untuk memilih siasatan seterusnya. Panduan membuat keputusan berikut terpakai pada tingkah laku yang dinyatakan bagi contoh ini; ia bukan dakwaan tentang mana-mana perkhidmatan pengehosan tertentu.

Pemerhatian Siasatan seterusnya
Permintaan HTML dan teks biasa menghasilkan format yang berbeza, tetapi Vary tidak menyertakan Accept Periksa tempat pengepala respons akhir dihimpunkan
Varian eksplisit menyertakan Accept, tetapi respons lalai tidak Periksa laluan respons sandaran
Permintaan HTML berulang menerima versi teks biasa Bandingkan pemilihan pada sumber asal dengan penghantaran melalui cache
Setiap permintaan menghasilkan dokumen HTML yang sama Semak sama ada perundingan format wujud sebelum menambah ahli berkaitan format
Pengepala yang tidak berkaitan muncul dalam Vary Cari peraturan pemilihan yang memerlukannya sebelum membuangnya
Saiz semula pelayar mengubah tataletak tanpa mengubah HTML yang dihantar Semak sama ada ini persembahan responsif dan bukannya pemilihan pelayan

Kes lalai yang tiada memerlukan perhatian khusus: RFC 9111 menerangkan bagaimana ketiadaan Vary dalam respons lalai boleh menyebabkan respons itu dipilih untuk permintaan kemudian walaupun alternatif tersedia. Betulkan laluan lalai bersama-sama dengan varian eksplisit. RFC 9111: Pencachean HTTP.

Elakkan penggunaan Vary: * sebagai jalan pintas untuk inventori yang belum lengkap. Mengikut peraturan pencachean HTTP, respons tersimpan yang mengandungi ahli itu sentiasa gagal ujian padanan. Ia tidak mengenal pasti medan permintaan yang memilih dokumen anda. RFC 9111: Pencachean HTTP.

Semakan pelayar masih berguna selepas perbandingan Terminal. Fetch Standard WHATWG mengambil kira Vary secara jelas apabila memilih respons daripada cache HTTP. Semak dokumen melalui laluan pemuatan pelayar biasa serta melalui permintaan curl terkawal. Fetch Standard: Pengambilan melalui rangkaian HTTP atau cache.

Selaraskan penghantaran halaman dengan keperluan Google Search

Bagi halaman yang bergantung pada peranti, bezakan reka bentuk responsif daripada penyajian dinamik. Google mendokumenkan bahawa reka bentuk responsif menyajikan HTML yang sama pada URL yang sama merentas peranti, manakala penyajian dinamik memilih HTML yang berbeza menggunakan User-Agent dan bergantung pada Vary: User-Agent. Google mengesyorkan reka bentuk responsif kerana lebih mudah dilaksanakan dan diselenggara. Amalan terbaik untuk tapak mudah alih dan pengindeksan yang mengutamakan mudah alih.

Oleh itu, Panduan Bentuk sintetik yang hanya menyusun semula HTML yang sama dengan CSS tidak memerlukan User-Agent dalam Vary hanya kerana perubahan tataletak itu. Jika pelayan benar-benar memilih HTML yang berbeza mengikut peranti, masukkan kes peranti itu dalam matriks permintaan. Google juga menasihatkan agar kandungan utama dikekalkan setara antara versi desktop dan mudah alih. Amalan terbaik untuk tapak mudah alih dan pengindeksan yang mengutamakan mudah alih.

Akhiri dengan rekod penghantaran yang ringkas dan mudah disemak: peraturan pemilihan dokumen, matriks permintaan, respons yang dirakam dan senarai Vary yang terhasil. Setiap pengepala yang disenaraikan perlu mempunyai peranan yang dapat dikenal pasti, setiap varian yang disokong perlu kekal dapat dibezakan, dan respons lalai perlu mengikuti kontrak penghantaran yang sama.

Sumber