Web sunucuları bir sayfa gönderdiğinde neden istenmeden tüm gerekli CSS, JS ve görüntüleri göndermiyorlar?


45

Bir web sayfası tek bir CSS dosyası ve bir resim içerdiğinde, tarayıcılar ve sunucular neden bu geleneksel zaman alıcı rota ile zaman harcıyorlar:

  1. tarayıcı web sayfası için bir başlangıç ​​GET isteği gönderir ve sunucu yanıtını bekler.
  2. tarayıcı, css dosyası için başka bir GET isteği gönderir ve sunucu yanıtını bekler.
  3. tarayıcı resim dosyası için başka bir GET isteği gönderir ve sunucu yanıtını bekler.

Bunun yerine ne zaman bu kısa, doğrudan, zaman kazandıran rotayı kullanabilirler?

  1. Tarayıcı bir web sayfası için bir GET isteği gönderir.
  2. Web sunucusu cevap verir ( index.html ve ardından style.css ve image.jpg )

2
Web sayfası elbette alınana kadar herhangi bir talep yapılamaz. Bundan sonra, HTML okunduğu için istekler yapılır. Ancak bu, bir kerede yalnızca bir istek yapıldığı anlamına gelmez. Aslında, çeşitli istekler yapılır, ancak bazen istekler arasında bağımlılıklar olabilir ve sayfa düzgün bir şekilde boyanabilmesi için bazılarının çözülmesi gerekir. Tarayıcılar bazen, bir isteğin birer birer birer birer birer birer her biri tarafından ele alındığını ortaya koyan diğer yanıtları ele almak için görünmeden önce bir istek yerine getirildiği için duraklar. Gerçek şu ki, tarayıcı tarafında kaynak yoğun olma eğilimindedirler.
closetnoc

20
Kimsenin önbelleklemekten bahsetmediğine şaşırdım. Zaten bu dosyaya sahipseniz bana gönderilmesine gerek yok.
Corey Ogburn,

2
Bu liste yüzlerce şey olabilir. Aslında dosyaları göndermekten daha kısa olmasına rağmen, hala en uygun çözümden oldukça uzak.
Corey Ogburn,

1
Aslında, 100'den fazla benzersiz kaynağa sahip bir web sayfasını hiç ziyaret etmedim ..
Ahmed

2
@AhmedElsoobky: tarayıcı, sayfanın kendisini almadan, hangi kaynakların önbelleğe alınmış kaynakların başlığı olarak gönderilebileceğini bilmiyor. Ayrıca, bir sayfaya erişim, sunucuya muhtemelen ilk sayfadan (çok kiracılı bir web sitesi) farklı bir kuruluş tarafından kontrol edilen başka bir sayfanın önbelleğe alındığı bildirilirse, gizlilik ve güvenlik kabusu olur.
Lie Ryan,

Yanıtlar:


63

Kısa cevap "Çünkü HTTP bunun için tasarlanmadı".

Tim Berners-Lee , verimli ve genişletilebilir bir ağ protokolü tasarlamadı. Bir tasarım hedefi sadelikti. (Üniversitedeki ağ sınıfımın profesörü, işi profesyonellere bırakması gerektiğini söyledi.) Ana hatlarıyla belirttiğiniz sorun, HTTP protokolüyle ilgili birçok sorundan yalnızca biri. Orijinal haliyle:

  • Protokol sürümü yoktu, sadece kaynak için bir istek vardı
  • Başlık yoktu
  • Her istek yeni bir TCP bağlantısı gerektiriyordu
  • Sıkıştırma yoktu

Protokol daha sonra bu sorunların çoğunu ele almak için revize edildi:

  • İstekler sürümlendi, şimdi talepler benziyor GET /foo.html HTTP/1.1
  • Hem istek hem de yanıtla birlikte meta bilgiler için başlıklar eklendi
  • Bağlantıların yeniden kullanılmasına izin verildi. Connection: keep-alive
  • Belge boyutu önceden bilinmese bile bağlantıların yeniden kullanılmasına izin vermek için yığın yanıtlar verildi.
  • Gzip sıkıştırma eklendi

Bu noktada HTTP, geriye dönük uyumluluk kırılmadan mümkün olduğu ölçüde ele alınmıştır.

Bir sayfanın ve tüm kaynaklarının müşteriye gönderilmesi gerektiğini öneren ilk kişi siz değilsiniz. Aslında, Google SPDY denilen bir protokol tasarladı .

Bugün hem Chrome hem de Firefox, onu destekleyen sunuculara HTTP yerine SPDY kullanabilir. SPDY web sitesinden HTTP ile karşılaştırıldığında temel özellikleri şunlardır:

  • SPDY, istemci ve sunucunun, benzer başlıklar (örneğin çerezler) birden fazla istek için tekrar tekrar gönderildiğinde bant genişliği kullanımını azaltan istek ve yanıt başlıklarını sıkıştırmasına olanak tanır.
  • SPDY, tek bir bağlantı üzerinden birden fazla, aynı anda çoğaltılmış isteklere izin verir, istemci ve sunucu arasında gidiş dönüşlerde tasarruf sağlar ve düşük öncelikli kaynakların yüksek öncelikli istekleri engellemesini önler.
  • SPDY, sunucunun, istemeden istekte bulunmasını beklemeden müşterinin ihtiyaç duyduğunu bildiği kaynakları (örn. JavaScript ve CSS dosyaları) aktif olarak istemesine olanak sağlar ve sunucunun kullanılmayan bant genişliğini etkin bir şekilde kullanmasını sağlar.

Web sitenizi SPDY ile birlikte destekleyen tarayıcılara sunmak istiyorsanız, bunu yapabilirsiniz. Örneğin Apache'nin mod_spdy'si var .

SPDY, sunucu push teknolojisine sahip HTTP sürüm 2 için temel haline geldi .


2
Dang iyi ve bilgili bir cevap! Web tarayıcıları doğaya göre seridir ve talepler oldukça hızlı bir şekilde yapılabilir. Bir günlük dosyasına bir bakış, HTML ayrıştırıldıktan sonra kaynak isteklerinin oldukça hızlı yapıldığını gösterecektir. Neyse ne. Kötü bir sistem değil, kod / kaynak olabileceği kadar verimli değil.
closetnoc

6
Sadece kayıt için, SPDY kutsal kâse değil. Bazı şeyleri iyi yapar, ancak başka problemler ortaya çıkarır. İşte SPDY’den bahseden bazı noktaları içeren bir makale.
Jost

3
Bununla ilgilenen herkesin @Jost bağlantısındaki eleştirileri okumasını şiddetle tavsiye ederim. Çok yaygın olarak uygulanan bir şeyi yalnızca aşamalı olarak daha iyi değil , aynı zamanda herkesin kullanmaya başlamasından çok daha iyi bir şekilde nasıl yapacağınızı çözme sürecine dahil olan karmaşıklığın ipucunu veriyor . Nispeten büyük kullanım durumları için işleri daha iyi yapan bir gelişme düşünmek kolaydır. Her şeyi yeni protokolünüzü kullanmaya başlayacak şekilde daha iyi hale getirmek için, çünkü değişimin maliyetine değmesi çok daha iyidir, bu tamamen yapılması kolay bir şey değildir.
msouth

11
işi profesyonellere bırakmalıydı : Eğer bunu yapsaydı, ortaya çıktığı gün eski olacak bir standardın ortaya çıkması altı yıl alacaktı ve yakında bir düzine rekabet standardı ortaya çıkacaktı. Ayrıca, profesyonellerin birinden izin alması gerekiyor mu? Neden kendileri yapmadılar?
Shantnu Tiwari

2
Dürüst olmak gerekirse, o zamanlar nitelikli profesyoneller yok. Hiç kimse bir dünya çapında ağ kurmayı bilmiyor, çünkü kimse bir ağ kurmamıştı. Hiper medya kavramı Tim tarafından icat edilmedi, on yıldan beri CERN'de "bilgi kaybı" sorununu çözmek için bir "Bilgi Yönetimi" önerisini yazmadan önce, çeşitli yerel alan hiper medya sistemi konusunda deneyime sahipti.
Yalan Ryan

14

Web tarayıcınız, web sayfasını (HTML) sunucudan indirinceye kadar bu kaynakları birleştiren ek kaynaklar hakkında bir şey bilmiyor.

Merak ediyor olabilirsiniz, sunucu neden kendi HTML'sini ayrıştırmıyor ve web sayfasının ilk talebi sırasında tüm ek kaynakları web tarayıcısına göndermiyor? Kaynaklar birden fazla sunucuya yayılmış olabilir ve web tarayıcısı tüm bu kaynaklara ihtiyaç duymayabilir;

Web tarayıcısı bir kaynak önbelleği tutar, böylece aynı kaynakları onları barındıran sunuculardan tekrar tekrar indirmek zorunda kalmaz. Hepsi aynı jQuery kütüphanesini kullanan bir web sitesinde farklı sayfalarda gezinirken, bu kütüphaneyi her seferinde, sadece ilk seferinde indirmek istemezsiniz.

Böylece, web tarayıcısı sunucudan bir web sayfası aldığında, önbellekte bulunmadığı bağlantılı kaynakları kontrol eder ve bu kaynaklar için ek HTTP istekleri yapar. Oldukça basit, çok esnek ve genişletilebilir.

Bir web tarayıcısı genellikle paralel olarak iki HTTP isteği yapabilir. Bu AJAX'a benzemez - ikisi de web sayfalarını yüklemek için eşzamanlı olmayan yöntemlerdir - eşzamansız dosya yüklemesi ve eşzamansız içerik yüklemesi. Canlı tutma ile tek bir bağlantı kullanarak birkaç istek yapabiliriz ve boru hattıyla yanıt beklemek zorunda kalmadan birkaç istek yapabiliriz. Bu tekniklerin her ikisi de çok hızlıdır, çünkü çoğu genel gider genellikle TCP bağlantılarını açmak / kapatmaktan gelir:

hayatta kal

ardışık düzen

Biraz web geçmişi ...

Web sayfaları düz metin e-posta olarak başladı, bilgisayar sistemleri bu fikir etrafında tasarlandı ve herkes için ücretsiz bir iletişim platformu oluşturdu. web sunucuları o zamanlar hala özeldi. Daha sonra, görüntüler, stiller, komut dosyaları vb. Ek MIME türleri biçiminde "email spec" e daha fazla katman eklenmiştir. Sonuçta, MIME, Çok Amaçlı İnternet Posta Uzantısı anlamına gelir . Er ya da geç, esasen multimedya e-posta iletişimi, standart web sunucuları ve web sayfalarını gördük.

HTTP, verilerin çoğu zaman e-posta olmasa da, e-postaya benzer mesajlar bağlamında iletilmesini gerektirir.

Bunun gibi bir teknoloji geliştikçe, geliştiricilerin mevcut yazılımı bozmadan aşamalı olarak yeni özellikler eklemelerine izin vermesi gerekir. Örneğin, teknik özelliklere yeni bir MIME türü eklendiğinde - JPEG diyelim - web sunucularının ve web tarayıcılarının bunu yapması biraz zaman alacaktır. Sadece aniden JPEG'i teknik özelliklere zorlamayın ve tüm tarayıcılara göndermeye başlayın, web tarayıcısının desteklediği kaynakları talep etmesine izin verin, bu da herkesi mutlu eder ve teknolojiyi ilerletir. Bir ekran okuyucu bir web sayfasındaki tüm JPEG'lere ihtiyaç duyuyor mu? Muhtemelen değil. Cihazınız Javascript'i desteklemiyorsa bir sürü Javascript dosyası indirmeye zorlanmalı mıyım? Muhtemelen değil. Sitenizi düzgün bir şekilde dizine eklemek için Googlebot’un tüm Javascript dosyalarınızı indirmesi gerekiyor mu? Hayır!

Kaynak: Node.js. gibi olaya dayalı bir web sunucusu geliştirdim. Buna Hızlı Sunucu denir .

Referanslar:

Daha fazla okuma:


Aslında, tüm bu yan sorunların üstesinden gelebiliriz (gibi şeyler: Önbellek, İçerik Türü başlığı ... vb.), Bu sorunları çözmek için Geçici Çözümler vardır . Ve yukarıdaki yazıdaki yorumlarda önerdiğim gibi, bu başlık gibi bir şey kullanabiliriz> Cached-Resources: image.jpg; style.css; önbelleğe alma problemini çözmek için .. (Zamanınız varsa, yukarıdaki açıklamalara göz atabilirsiniz ..)
Ahmed

Evet, bu fikir daha önce aklımdan geçmekteydi, ancak bu HTTP için çok fazla yüklüydü ve kaynakların birden fazla sunucuya yayılabileceği gerçeğini çözmüyor. Dahası, önerilen zaman kazandıran yöntemin aslında zaman kazandıracağını düşünmüyorum, çünkü veriler ona nasıl baktığınıza bakılmaksızın bir akış olarak gönderilecek ve canlı tutma ile 100 eşzamanlı 100 istek temelde 1 istek haline gelecektir. Önerdiğiniz teknoloji ve yetenek zaten bir şekilde var gibi görünüyor. Bkz. En.wikipedia.org/wiki/HTTP_persistent_connection
perry

@perry: https://Kimlik doğrulaması, ancak gizli tutulması gereken, halka açık olarak dağıtılmış büyük dosyaların gönderilmesine alternatif olarak ne düşünürsünüz : URL’ye, meşru bir cevabın başlığının belirli bölümlerinin bir karesini dahil edin. veri yükünün bir imzasını veya karma değerini içerir ve tarayıcılar alınan verileri başlığa göre doğruladı mı? Böyle bir tasarım, yalnızca bazı SSL el sıkışma adımlarını kurtarmakla kalmaz, aynı zamanda proxy'lerin önbelleğe alınmasına daha da önem verir. URL’yi bir SSL bağlantısı üzerinden alın; veriler her yerden beslenebilir.
Supercat

11

Çünkü bu kaynakların ne olduğunu bilmiyorlar. Bir web sayfasının gerektirdiği varlıklar HTML'ye kodlanır. Ancak bir ayrıştırıcı bu varlıkların ne olduğunu belirledikten sonra, kullanıcı aracısı tarafından talep edilebilir.

Ek olarak, bu varlıklar bilindikten sonra, ayrı ayrı sunulmaları gerekir, böylece uygun başlıklar (yani içerik türü) sunulabilir, böylece kullanıcı aracısı nasıl işleneceğini bilir.


2
Özellikle request.js gibi bir şey kullanıyorsanız. Tarayıcı sadece neye ihtiyacı olduğunu sorar. Hepsini aynı anda yüklemek zorunda kaldığınızı hayal edin ...
Aran Mulholland

2
Bu doğru cevaptır ve yorum yapanların çoğu eksik görünmektedir - sunucunun proaktif olarak kaynakları göndermesi için ne olduğunu bilmeleri gerekir, bu da sunucunun HTML'yi ayrıştırması gerektiği anlamına gelir .

1
Ancak soru, web sunucusunun neden kaynakları göndermediğini soruyor , istemcinin neden aynı anda istemediklerini sormuyor. Sunucuların, tümü bir araya gönderilen ve bir paketi oluşturmak için HTML'yi ayrıştırmaya dayanmayan bir ilişkili varlıklar paketinin olduğu bir dünyayı hayal etmek çok kolaydır.
David Meister

@DavidMeister Sunucu her zaman müşterinin ne istediğini bilmediğinden - bir arama motoru için bir web tarayıcısı CSS / JS'yi önemsemeyebilir ve bunun ötesinde bir belgeye bağlı başka birçok kaynak vardır - tümünün gönderilmesine gerek yoktur RSS bir web tarayıcısına beslenir (içeriğin çoğu muhtemelen zaten HTML’dedir), bir besleme okuyucusu ise RSS’in <head>alternatif linklerini bulmak için sadece ayrıştırma yapabilir - istemci bir liste gönderebilir neyle ilgileniyor, ama sonra neyin uygun olduğunu bilmesi gerekiyor ve başlangıçta geri dönüyoruz
Zhaph - Ben Duguid

@ Zhaph-BenDuguid Cevabın protokolün başka bir şeyle nasıl çalıştığı ile ilgisi olduğunu vurgulamak için alternatif bir dünyadan bahsediyorum. Ek olarak, bir sunucunun gereksiz olsa bile tüm verileri bir kerede göndermesi daha hızlı olabilir. Temelde, bant genişliği kullanımına karşı gecikme sorunlarını takas ediyorsunuz.
David Meister

8

Çünkü, örneğinizde, web sunucusu , müşterinin zaten elinde olup olmadığına bakılmaksızın , her zaman CSS ve görüntüler gönderir, böylece bant genişliğini büyük oranda boşa harcarsınız (ve böylece amacınızı yerine getirmek için gecikmeyi azaltmak yerine , bağlantıyı daha yavaş hale getirir ). CSS, JavaScript ve resim dosyalarının genellikle tam da bu nedenle çok uzun zaman aşımına uğrayan zamanlarla gönderildiğini unutmayın (bunları değiştirmeniz gerektiğinde olduğu gibi, tekrar uzun süre önbelleğe alınacak yeni kopyaya zorlamak için sadece dosya adını değiştirirsiniz).

Şimdi, " Tamam, ancak müşteri zaten bu kaynakların bir kısmına sahip olduğunu gösterebildiğinden, sunucunun tekrar göndermeyeceğini " söyleyerek bu bant genişliği israfına çalışmayı deneyebilirsiniz . Gibi bir şey:

GET /index.html HTTP/1.1
Host: www.example.com
If-None-Match: "686897696a7c876b7e"
Connection: Keep-Alive

GET /style.css HTTP/1.1
Host: www.example.com
If-None-Match: "70b26618ce2c246c71"

GET /image.png HTTP/1.1
Host: www.example.com
If-None-Match: "16d5b7c2e50e571a46"

Ardından, yalnızca değişmemiş dosyaların bir TCP bağlantısı üzerinden gönderilmesini sağlayın (kalıcı bağlantı üzerinden HTTP boru hattını kullanarak). Ve tahmin et ne oldu? O nasıl zaten (ayrıca kullanabilirsiniz çalışır If-Modified-Since yerine If-None-Match ).


Ancak, çok fazla bant genişliği boşa harcayarak gecikmeyi azaltmak istiyorsanız (orijinal isteğinizde olduğu gibi), bugün web sitenizi tasarlarken standart HTTP / 1.1 kullanarak bunu yapabilirsiniz. Çoğu insanın bunu yapmamasının nedeni, buna değmeyeceğini düşünmeleridir.

Bunu yapmak için, CSS veya JavaScript’lerin ayrı bir dosyaya sahip olmanıza gerek yoktur, bunları <style>ve <script>etiketlerini kullanarak ana HTML dosyasına ekleyebilirsiniz (muhtemelen elle bile yapmanız gerekmez, şablon motorunuz muhtemelen otomatik olarak yapabilir) . URI'yi kullanarak veri dosyasını HTML dosyasına da dahil edebilirsiniz :

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="Red dot" />

Tabi ki, base64 kodlaması, bant genişliği kullanımını biraz arttırır, ancak israf edilen bant genişliğini umursamıyorsanız, bu bir sorun olmamalıdır.

Şimdi, gerçekten önemsiyorsanız, web komut dosyalarını her iki dünyanın da en iyisini elde etmek için yeterince akıllı hale getirebilirsiniz: ilk istek üzerine (kullanıcının çerezleri yoktur), yalnızca tek bir HTML'ye gömülü her şeyi (CSS, JavaScript, resimler) gönderin Yukarıda açıklandığı gibi dosya, dosyaların harici kopyaları için bir link rel = "prefetch" etiketleri ekleyin ve bir çerez ekleyin. Kullanıcı zaten (örn. Daha önce ziyaret ettiği) bir çerez varsa, o zaman ona sadece normal bir HTML göndermek <img src="example.jpg">, <link rel="stylesheet" type="text/css" href="style.css">vb

Böylece ilk ziyaretinizde tarayıcı sadece tek bir HTML dosyası ister ve her şeyi alır ve gösterirdi. Sonra (boştayken) belirtilen harici CSS, JS, resimleri önceden yüklerdi. Kullanıcı bir dahaki sefere ziyaret ettiğinde, tarayıcı yalnızca değiştirilmiş kaynakları talep eder ve alır (muhtemelen sadece yeni HTML).

Ekstra CSS + JS + görüntü verileri, web sitesinde yüzlerce kez tıklasanız bile, yalnızca iki kez gönderilir. Önerdiğiniz çözümün önerdiği gibi yüzlerce kez çok daha iyi. Ve asla (değil ilk kez, ne de sonraki günler) birden kullanmak bir gecikme artan gidiş-dönüş.

Şimdi, eğer kulağa çok iş gibi geliyorsa ve SPDY gibi başka bir protokolle gitmek istemiyorsanız , Apache için mod_pagespeed gibi modüller var, bu çalışmaların bir kısmını sizin için otomatik olarak yapabilir (birden fazla CSS / JS dosyasını birleştirerek) Birine, küçük CSS'leri otomatik olarak yerleştirme ve küçük resim yapma, orijinallerin yüklenmesini, tembel yükleme görüntülerini vb. bekletmeden web sayfanızın tek bir satırını değiştirmenize gerek kalmadan küçük yer tutucuya çizili görüntüler yapın.


3
Bence bu doğru cevabı.
el.pescado

7

HTTP2, SPDY'ye dayanır ve tam olarak önerdiğiniz şeyi yapar:

Yüksek düzeyde, HTTP / 2:

  • metin yerine ikili
  • sipariş ve engelleme yerine tamamen çoğaltılır
  • bu nedenle paralellik için bir bağlantı kullanabilir
  • ek yükü azaltmak için başlık sıkıştırmayı kullanır
  • Sunucuların proaktif olarak yanıtları istemci önbelleklerine “itmesine” izin verir

Daha fazlası için tıklayın HTTP 2 Faq


3

Çünkü bu şeylerin aslında gerekli olduğunu varsaymaz .

Protokol, belirli bir dosya türü veya kullanıcı aracısı için herhangi bir özel işlem tanımlamaz. Bir HTML dosyası ile PNG görüntüsü arasındaki farkı bilmiyor. İstediğiniz şeyi yapmak için, Web sunucusunun dosya türünü tanımlaması, başka hangi dosyaları yönlendirdiğini bulmak için ayrıştırması ve sonra ne yapmak istediğinizi göz önüne alarak hangi dosyaların gerçekten gerekli olduğunu belirlemesi gerekir. dosya . Bununla ilgili üç büyük sorun var.

İlk sorun, sunucu ucundaki dosya türlerini tanımlamanın standart ve sağlam bir yolunun bulunmamasıdır . HTTP, Content-Type mekanizmasıyla yönetir, ancak sunucuya yardım etmez, bu da kendi başına halletmesi gerekir (kısmen Content-Type'a ne koyacağını bilmesi için). Dosya adı uzantıları, bazen kötü amaçlı amaçlar için yaygın olarak desteklenir, ancak kırılgan ve kolayca kandırılabilir. Dosya sistemi meta verileri daha az kırılgandır, ancak çoğu sistem bunu çok iyi desteklemez, bu nedenle sunucular bile rahatsız etmez. İçerik koklama (bazı tarayıcılar ve Unix filekomutunun yapmayı denediği gibi) eğer pahalı yapmaya istekli iseniz güçlü olabilir, ancak güçlü koklama, sunucu tarafında pratik olması için çok pahalı ve ucuz koklama yeterince sağlam değildir.

İkinci sorun, bir dosyayı ayrıştırmanın hesaplamalı olarak pahalı bir yöntemdir . Bu, ilkiyle biraz bağlantılıdır, çünkü içeriği sağlam bir şekilde kesmek istiyorsanız, dosyayı bir sürü farklı potansiyel yolla ayrıştırmanız gerekir, ancak dosya türünü tanımladıktan sonra da geçerlidir, çünkü referansların ne olduğunu bulmak için. Bir seferde sadece birkaç dosya yaptığınız zaman, tarayıcıda olduğu gibi o kadar da kötü değil, fakat bir Web sunucusu aynı anda yüzlerce veya binlerce isteği yerine getirmek zorunda. Bu ekler ve eğer çok ileri giderse, işleri birden fazla istekten daha yavaşlatabilir. Slashdot veya benzeri sitelerden bir bağlantıyı ziyaret ettiyseniz, yalnızca yüksek kullanım nedeniyle sunucunun acı verici bir şekilde yavaş olduğunu bulmak için bu prensibi eylem halinde gördünüz.

Üçüncü sorun, sunucunun dosyayla ne yapmak istediğinizi bilmesinin bir yolu olmamasıdır . Bir tarayıcı HTML'de referans olarak alınacak dosyalara ihtiyaç duyabilir, ancak dosyanın yürütülmekte olduğu tam içeriğe bağlı olarak gerekmeyebilir. Bu yeterince karmaşık olurdu, ancak Web’de sadece tarayıcılardan daha fazlası var: örümcekler, yayın toplayıcılar ve sayfa kazıma karışımları arasında, HTML’de başvurulan dosyalara ihtiyaç duymayan birçok kullanıcı aracısı türü var : bunlar sadece HTML'nin kendisini önemser. Bu diğer dosyaları bu tür kullanıcı aracısına göndermek yalnızca bant genişliğini boşa harcar.

Sonuç olarak, bu bağımlılıkları sunucu tarafında bulmak, değerinden daha fazla sorun oluşturuyor . Bunun yerine, müşterinin neye ihtiyacı olduğunu bulmasına izin verdiler.


Eğer yeni bir protokol geliştirecek ya da önceden var olan bir sorunu düzelteceksek, tüm bu sorunlara bir şekilde ya da böyle bakabiliriz! Ve web sunucusu sadece bir kez dosyaları ayrıştırır ve daha sonra tanımlanmış kurallara bağlı olarak onları sınıflandırır, böylece hangi dosyaları ilk önce göndereceğimi önceliklendirebilir .. vb. bu dosyalar ile, ne göndermesi gerektiğini, ne zaman yapılacağı ve hangi kurallara bağlı olarak .. (web botları ve örümcekler bir problem değildir, davranışları onlarla farklı olacaktır. ..)
Ahmed,

@AhmedElsobky: Sözünü ettiğin şey, bir ağ protokolünden ziyade, belirli bir uygulamaya benzer sesler. Ancak, nelerin gönderileceğini belirleyebilmesinden önce dosyalar ile ne yapmak istediğinizi gerçekten bilmek zorundadır: aksi takdirde kaçınılmaz olarak birçok kullanıcının istemediği dosyaları gönderir. User-Agent dizgilerine güvenemezsiniz, bu nedenle kullanıcının amacının ne olduğunu belirlemek için bunları kullanamazsınız.
The Spooniest 17:14
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.