html, adres wpisany w src=""n w dwóch liniach
src="" musi być jednym, nieprzerwanym ciągiem znaków – znak nowej linii (\n, \r\n) lub spacja wstawione wewnątrz adresu stają się częścią URL i zostaną zakodowane (np. %0A), co niemal zawsze kończy się błędem 404/400. • włącz „soft-wrap” w edytorze,
• składaj URL z fragmentów w JavaScripcie / szablonie,
• trzymaj adres w zmiennej/konstancie lub pliku konfiguracyjnym.
Jak przeglądarka parsuje atrybut
• W HTML5 parser traktuje wszystko pomiędzy cudzysłowami jako literalną wartość.
• Znak nowej linii lub tabulator nie jest usuwany ani normalizowany – staje się bajtem LF (0x0A) lub CR (0x0D).
• Przy wysyłaniu żądania URL przechodzi przez normalizację i LF/CR kodowane są jako %0A/%0D.
Przykład błędny:
<img src="https://example.com/img/
big-picture.jpg">
Zapytanie, które zobaczysz w narzędziach deweloperskich:
https://example.com/img/%0Abig-picture.jpg
Czy da się „legalnie” łamać wiersz?
• Jedyną dopuszczalną wielowierszową formą adresu jest łańcuch złożony w czasie generowania:
– po stronie serwera (PHP, Python, Node.js)
– w JS po stronie klienta.
• HTML nie oferuje ekwiwalentu \ (jak w bash) ani kontynuacji linii znanej z CSS.
Alternatywy dla długich ciągów
• Przechowywanie bazowego origin i ścieżki w osobnych zmiennych (konfiguracja->konsystencja).
• Dla obrazów responsywnych: element <picture> z kilkoma <source> zamiast jednego ogromnego srcset.
• Skracacze URL lub aliasy serwera (np. Nginx location /imgs/ { … }).
Diagnostyka
• Chrome/Firefox DevTools → zakładka Network, kolumna Request URL.
• Jeśli zobaczysz %0A, wiesz, że w pliku znajduje się twarde łamanie linii.
import img from './long-name.png';) i automatycznie wstawiają poprawny URL w HTML/JS. ?v=…) zamiast rozbudowanych nazw. href, action, data, poster – każdy atrybut przyjmujący URL podlega tej samej regule. %20), dlatego przeglądarka nie może po prostu „pominąć” białych znaków. srcset, sizes) mają własny gramatyczny separator przecinek/spacja; nawet tu znak nowej linii jest traktowany jak zwykła spacja i będzie częścią tokenu – również niezalecane. const CDN = 'https://cdn.example.com/assets/';
const file = '2024/05/very-long-name.webp';
img.src = `${CDN}${file}`;
expect(url).not.toMatch(/[\n\r\s]/)). srcset i <picture> dla dużych, responsywnych obrazów. URLPattern (Chrome 111+) do walidacji adresów po stronie klienta. Atrybut src przyjmuje jedną linię tekstu bez znaków nowej linii. Fizyczne złamanie linii w pliku HTML powoduje powstanie nieprawidłowego URL (kodowany %0A/%0D) i błąd ładowania zasobu. Poprawna praktyka to wizualne zawijanie w edytorze lub dynamiczne składanie adresów poza HTML.