ugrás a tartalomhoz

Az üresen hagyott attribútumokról

Joó Ádám · 2009. Dec. 3. (Cs), 10.53
Az oldalsávon elérhető a Nicholas C. Zakas blogján Empty image src can destroy your site címen megjelent bejegyzés blogmarkja.

A bejegyzésben Nicholas ismerteti a böngészők egy számára hibásnak tűnő viselkedését.

Arra hívja fel a figyelmet, hogy egy üres src attribútummal kiszolgált img elem egy újabb oldallekérést fog eredményezni ugyanezen a címen, ezzel gyakorlatilag megduplázva a kiszolgáló terhelését.

A viselkedés magyarázata az RFC 3986 Uniform Resource Identifier (URI) szerinti helyes működés (már persze kivéve az Explorert, ami ennek a dokumentumnak az előző kiadását követi máig, az útvonal szülőentitását kérve le, és az Operát, ami önkényesen felülbírálva az előírást, semmilyen kérést nem küld). Az üres karakterlánc ugyanis érvényes relatív URL, amit a hétköznapokban is kihasználunk, pl. amikor üres action attribútummal küldjük vissza az űrlapot az azt generáló címre feldolgozás céljából.

Firefox, Chrome és Safari alatt hasonló viselkedés tapasztalható, ha a link vagy script elemek címét hagyjuk üresen.

Miután a helyzetet ismerteti, Nicholas hevesen érvel, és buzdít mindenkit a böngészőfejlesztők „jobb belátásra” bírására, a józan észre és a HTML 5-ben már „javított” előírásra hivatkozva, megadva egy vonatkozó Firefox és Webkit hibajegyet is.

Az igazság azonban az, hogy nagyon is létjogosult és praktikus volna ez a megvalósítás, ha a webfejlesztők és böngészőgyártók nem felejtették volna el (horribile dictu, soha nem is ismerték meg) a HTTP protokollt, és benne mondjuk az Accept fejlécet. Ha ugyanis így volna, akkor a /cikkek/123 cím URL-sávba írásakor vagy linkként kattintásakor egy application/xhtml+xml Accept fejlécet látva legenerálhatnám a HTML oldalt, majd amikor a böngésző a benne talált <link rel="stylesheet" type="text/css" href="" />, <script type="application/javascript" src=""></script> és <img src="" alt="Illusztráció" /> sorok hatására intézne egy-egy kérést ugyanarra a címre rendre text/css, application/javascript és image/* Accept fejléccel, akkor kiszolgálnám a hozzá tartozó stíluslapot, szkriptet és illusztrációt.

Nicholas, a böngészőgyártók és a webfejlesztők, akik majd nyomatékosítják a közösség „egybehangzó és józan észen alapuló” véleményét a változtatás szükségességéről már rég elfelejtették (de mégis inkább sosem ismerték meg) a HTTP protokollt, ezért most egyesült erővel még szélesebbre tágítják a szabványok és az implementációk közt tátongó szakadékot.
 
1

Igazad van

zzrek · 2009. Dec. 3. (Cs), 12.31
Igazad van, én sem ismerem ilyen szinten a http protokollt, és nagyon érdekesnek találtam amit írsz (új szemszög), de azért nem érzek túl sok realitást abban, hogy a szerver oldalon nézegessem a fejléceket csak azért hogy kiszűrjem, hogy az adott esetben milyen képet is kéne kiraknom. Stylesheet vagy script esetében talán van benne logika, hogy egy-egy HTML oldalhoz egy-egy script/stíluslap rendelhető (és felesleges megadni az src-t) de képeknél ez már a gyakorlattól elég távol álló elképzelés.
Ha pedig a gyakorlat mást mutat, mint a szabvány, akkor változzon a szabvány szvsz.
Ha pedig nincs gyakorlati realitása, már miért ne tennének ellene a böngészők? Üres img src-re ne legyen http lekérés és kész.

Másrészt viszont (főleg, ha ez elszigetelt esetekben jelenik meg), mindenki maga figyeljen arra, hogy milyen motort használ, és a hibás, üres img src-ket gyártó motorok számára kéne hibajegyeket bejegyezni, hiszen szabvány, gyakorlat és logika szempontjából ez az ő saruk, nem a böngészőké.
2

Gyakorlat

Joó Ádám · 2009. Dec. 3. (Cs), 13.00
de azért nem érzek túl sok realitást abban, hogy a szerver oldalon nézegessem a fejléceket csak azért hogy kiszűrjem, hogy az adott esetben milyen képet is kéne kiraknom


Sokan ha tehetik már a GET és a POST közt sem tesznek különbséget. Erre a fejlécre sem volna nagyobb munka ránézni, mint a műveletre. Persze a konkrét fenti példa valóban kivitelezhetetlen, mert a böngészők maguk sem használják ésszerűen a fejlécet.

A képhez csak annyit, hogy teljesen megszokott, hogy egy adott cikkhez lehet kapcsolni pontosan egy darab illusztrációt (amiből mondjuk bélyegképet is generálsz a listázó oldalakon), annak lekéréséhez pedig nem kell egy új címet definiálnod ilyenkor.

Ha pedig a gyakorlat mást mutat, mint a szabvány, akkor változzon a szabvány szvsz.
Ha pedig nincs gyakorlati realitása, már miért ne tennének ellene a böngészők? Üres img src-re ne legyen http lekérés és kész.


És ha én szeretném használni ezt a lehetőséget? Egy rossz, de maradéktalanul implementált szabvány jobb, mint bármilyen szabványtól eltérő, mert ez utóbbi kiszámíthatatlanná tesz egy platformot (nyolc évnyi Internet Explorer 6 után ezt még ecsetelni kell?). Ha nem tetszik a szabvány, akkor lehet csinálni újat, de ne térjünk el tőle, miközben azt állítjuk, hogy megfelelünk neki.

És csak megerősítendő a végszavad, illetve ismétlendő, amit a blogmark alatt írtam: tessék valid oldalt írni; telepíteni egy validátort és minden lekérésnél vetni egy pillantást az ikonra; figyelmeztetni fog az efféle hibákra. Vagy jó minőségű eszközöket használok, vagy kijavítom a hibáikat, vagy: viselem a következményeket.
3

Egyetértek

zzrek · 2009. Dec. 3. (Cs), 14.51
Egyetértek (főleg a végszóval), egy dologban még kíváncsi vagyok a véleményedre:
A szabvány (bár nem ismerem és nem is akarok elmerülni benne) leírja, hogy az üres URL hogyan kezelendő; ámde azt nem írja le (vagy máshol, esetleg más szabvány) hogy ha egy HTML oldalon URL-re történik utalás, azzal mi legyen. Ebben a konkrét esetben arra gondolok, hogy ha lenne img src, akkor sem minden esetben történik HTTP kérés, hiszen a képeket a böngésző akár gyorsítótárazhatja is... Miért ne mondhatná azt a böngésző, hogy (mivel az üres img src technikát gyakorlatilag senki sem használja) eleve gyorstárazott semmit töltünk le? Vagyis nem azért nem küld HTTP kérést, mert nem követi a szabványt, hanem azért, mert már gyorsítótárazta a semmit...
(Ebben a konkrét esetben úgy sem mondhatod hogy "És ha én szeretném használni ezt a lehetőséget?" mert úgysem használja senki)
Mit gondolsz?
4

Gyorstárazás

Joó Ádám · 2009. Dec. 3. (Cs), 15.18
A gyorsítótárazás szabályait ugyanúgy az RFC 2616 Hypertext Transfer Protocol írja le. Lehetséges, hogy valójában tényleg ne történjék oldalletöltés, de csak akkor, ha az oldalt a böngésző gyorsítótárazhatja. Sajnos a legtöbb fejlesztő ezzel sem foglalkozik, pedig a protokoll elég jó lehetőségeket biztosít.
5

SEO

erenon · 2009. Dec. 3. (Cs), 15.31
A felvetett problémák mellett említeném, hogy AFAIK a Google rossz szemmel nézi, ha egy url-re különböző tartalmakat kap. Ebben az esetben pedig nem tesz különbséget a különböző Accept fejlécek között.
6

nem kapna

zzrek · 2009. Dec. 3. (Cs), 18.33
Szerintem nem kapna különböző tartalmat, mert mindig ugyanúgy kéri le, így ugyanazt a választ kapja.
7

One resource, multiple representations

Joó Ádám · 2009. Dec. 4. (P), 23.59
Pedig a protokoll kifejezetten szorgalmazza ezt az eljárást. Kezdve ott, hogy ugyanazon erőforráson (URL-en) hétféle metódus is meghívható, folytatva azzal, hogy egy oldal különböző nyelveken történő kiszolgálásának elvileg ugyanazon a címen, az Accept-Language fejléc alapján kéne történjen, egészen odáig, hogy amennyiben egy tartalom több formátumban is elérhető (pl. a HTML mellett mondjuk PDF), akkor a kiszolgálónak bizony az Accept alapján kell valamelyiket elküldenie. Ha a Google a fejlécben ugyanazt a formátumot kérné, akkor ugyanazt kapná, ha mást, akkor meg mást.
9

Nem működik

janoszen · 2009. Dec. 8. (K), 21.26
Sajnos a Google ebben nem jeleskedik. Nekünk volt olyan problémánk, hogy angol intro szöveggel a magyar oldalra linkelt és hasonló vad dolgok. Szóval ha többnyelvű oldalt csinálunk, akkor egy redirektorral és a guglit permanensen dobjuk a főnyelvre.

Egyébként én nem örülnék, ha az üres attribútumokra a böngésző _nem_ kérné le az oldalt. Vannak olyan egyszerűbb, gyorsan alkalmi jelleggel összerakott szájtok, ahol egy pár dolgot ennek segítségével oldottam meg. Az URLek szerkezete maradjon konzisztens!
8

Seo szempontból is

vbence · 2009. Dec. 5. (Szo), 14.12
Seo szempontból is tökéletesen elfogadható a dolog. HTML-lel támogatható az ilyen alternatív reprezentációk felfedezése. Pl, ez létező HTML:
<LINK REL="alternate" TYPE="application/pdf" HREF="saját_url">
Ha az üres URL értelmezését rögzíti a szabvány, akkor itt használható lehet akár az is, a mondandóm lényege nem az, hanem hogy ha ugyanazon az URL-en, de más Accept mellett (binárisan) más adatot tudunk kiszolgálni, ennek jelzésére létezik egyértelmű és szabványos mód.
10

A legegyszerűbb megoldás(?)

Adam · 2009. Dec. 26. (Szo), 13.44
Mi lenne, ha egyszerűen nem tennénk üres src attribútumokat a forrásunkba? Szerintem nem kell nagy odafigyelés, hiszen vizuálisan is látjuk, hogy egyszerűen nem jelenik meg az adott kép ott, ahol kellene neki… Ha pedig pl. egy cikkhez nem tartozik kép, akkor az elemet magát ne rakjuk ki.

Nem egyszerűbb, mint a problémákon és azok megoldásain törni a fejünket.