Gopher
протокол меню, старший за веб
Що це таке
Gopher — це протокол для отримання документів і меню через інтернет: клієнт відкриває
TCP-з’єднання, надсилає один рядок із тим, що йому потрібно, читає відповідь і на цьому
закінчує. Офіційно він називається Internet Gopher Protocol, його адреси починаються з
gopher://, а сайт, опублікований через нього, зазвичай називають норою Gopher (gopher hole).
Протокол походить з 1991 року, а RFC 1436 описав його в березні 1993-го.
Обмін настільки короткий, що його можна набрати вручну. Клієнт під’єднується до порту 70, надсилає селектор (рядок, який сервер видав раніше, можливо, порожній), а за ним символи повернення каретки й переведення рядка, і сервер відповідає та закриває з’єднання. Між запитами не зберігається нічого: ні сесії, ні cookie, ні заголовків. Порожній селектор просить у сервера його головне меню.
Серце протоколу — меню. Кожен рядок меню є одним пунктом: один символ типу, текст для показу, а
далі селектор, хост і порт, розділені табуляціями. Рядок, у якому стоїть лише крапка, завершує
меню. Ось невелике меню, де кожну табуляцію записано як <TAB>:
0Про цей сервер<TAB>/about.txt<TAB>example.org<TAB>70
1Звіти<TAB>/reports<TAB>example.org<TAB>70
7Пошук у звітах<TAB>/search<TAB>example.org<TAB>70
.
Символ типу повідомляє клієнтові, що він отримає, ще до запиту. RFC 1436 визначає 0 для
текстового файлу, 1 для іншого меню, 7 для пошуку, який приймає запит, 9 для двійкового
файлу, g для зображення GIF і ще кілька. Два типи, поширені сьогодні, прийшли з практики, а не з
RFC: i для рядка звичайного тексту всередині меню і h для документа HTML, через який клієнти
також передають вебадресу браузерові.
Протокол навмисно малий. У RFC 1436 є розділ під назвою «Simplicity is intentional», і це
інформаційний RFC, а не інтернет-стандарт. Формат адрес gopher:// з’явився пізніше, в RFC 4266,
де перший символ шляху позначає тип пункту, а решта є селектором.
Чому це важливо
Сьогодні Gopher важить не стільки як шлях до великої аудиторії, скільки як ясна картина того, що потрібно документові, а без чого він обійдеться. Меню — це навігація, зведена до кістяка: кожен вихід зі сторінки стоїть у списку, має тип і займає окремий рядок, і нічого не сховано за наведенням курсора чи скриптом. Публікація туди змушує поставити питання, які HTML дозволяє відкласти. Як називається ця сторінка? Які в неї справжні посилання? Чи має текст сенс, коли посилання з нього вийняли?
Для організації нора Gopher — це додаткові вхідні двері, а не заміна вебу. Читачам потрібен окремий клієнт, і їх небагато. Скільки коштують ці двері, залежить цілком від того, як їх збудовано. Якщо підтримувати її вручну як другу копію сайту, вона розходиться з ним, щойно одну копію відредагують, а про другу забудуть. Якщо генерувати її з того самого джерела в тому самому збиранні, вона коштує один шаблон і трохи місця на диску, а найбільше користі дає як навантажувальне випробування тексту.
Друге, що варто розуміти, стосується безпеки. Gopher не має шару шифрування. Кожен селектор, а отже, кожна сторінка, яку просить читач, іде мережею відкритим текстом, і так само кожна відповідь. У RFC 1436 немає механізму входу, а запит, який читач уводить у пункт пошуку, теж передається відкритим текстом. Для публічних документів це прийнятно, для всього іншого ні, і тому власні журнали оператора заслуговують на таку саму увагу, як і вміст.
Зате протокол дешево налагоджувати. Без TLS, заголовків і стану один командний рядок показує точні байти, які отримує клієнт, тож копія в Gopher стає одним із найпростіших для перевірки виходів сайту.
Як це виглядає на практиці
Цей сайт є норою Gopher так само, як і вебсайтом. Сторінка
Engineer у терміналі наводить адресу, gopher://engineer.company/, описує Gopher як
протокол меню 1991 року з простим TCP, без шифрування й без скриптів і каже, що сайт там є набором
меню. Вона називає клієнти Lynx, Bombadillo і gopher-cli та показує запит, зроблений вручну за
допомогою printf і nc на порт 70: увесь протокол в одному рядку.
Збирання, яке за цим стоїть, описано в розповіді про віддзеркалення сайту в Gemini і Gopher. Те саме збирання, що пише HTML, пише й 777 меню Gopher, розгорнутих у те саме дерево, і віддає їх невеликий демон на тому самому хості. Розповідь називає найжорсткіше обмеження: рядок меню є набором полів, розділених табуляціями, тож посилання не може стояти всередині речення, а текст жорстко переноситься на шістдесяти восьми колонках під час збирання сайту. Робота в цих межах загострила текст.
Шаблони показують, як кожна сторінка стає меню. Посилання в тексті зберігають слова й втрачають
адреси, заголовки втрачають свої решітки, пункти списків стають зірочками з відступом, а текст
переноситься на 68 колонках. Код є винятком і проходить без перенесення, бо рядок коду, розірваний
на колонці 68, стає іншою програмою. Категорії та послуги стають пунктами типу 1, що ведуть до
їхніх власних меню, а внизу кожної сторінки стоїть пункт h, чий селектор URL: веде до
вебверсії тієї самої сторінки.
Нора Gopher навчила сайт і дечого про журнали. Сторінка Конфіденційність пояснює, що з вересня 2026 року сайт рахує лише кількість запитів, на які щодня відповіли копії в Gemini і Gopher, без адреси, сторінки й відвідувача. У день, коли почався підрахунок, з’ясувалося, що операційна система запускає копію в Gopher наново для кожного відвідувача й називає цей запуск за адресою, з якої відвідувач прийшов, у власному журналі. Тепер записи в тому журналі видаляються через тридцять днів, як і все інше, що зберігає сайт.
Де виникають проблеми
Сторінка уривається посередині й показує вміст теки
Читач відкриває сторінку й отримує її першу половину, а за нею список файлів у теці. Сервери на
кшталт Gophernicus читають gophermap перед тим, як її надіслати, і рядок без табуляцій, перший
символ якого збігається з однією з їхніх директив, сприймається як інструкція: # ховає рядок як
коментар, = вставляє інший файл, а * чи . зупиняє меню. Цей сайт натрапив на це, коли рядок
CSS в українській нотатці про підкреслення в Safari почався із зірочки, що закриває коментар CSS,
і робочий сервер обрізав сторінку в цьому місці й показав замість решти index.html, index.md та
index.gmi. Записуйте кожен такий рядок як явний пункт i і зупиняйте збирання на будь-якому
голому рядку, що досі починається із символу директиви.
Розмітка й сутності приходять як текст
Абзац з’являється одним дуже довгим рядком, повним кутових дужок, або з амперсандом, який досі записаний як сутність HTML. Конвертер скопіював HTML у формат, який нічого не знає про HTML. Прибирайте теги, зберігаючи текст посилань, декодуйте сутності й не чіпайте код у тексті, щоб його символи вціліли.
Рядки виходять за правий край
Текст вилазить за межі екрана, або тексти для показу обрізано посеред слова. Клієнти Gopher не зобов’язані нічого переносити, а RFC 1436 просить тримати тексти для показу коротшими за 70 символів. Переносьте текст під час збирання, свідомо скорочуйте підписи в меню й не пускайте код у перенесення.
Посилання відкриває не те
Адреса gopher:// відкриває помилку або сторонній пункт. RFC 4266 читає перший символ шляху як
тип пункту, тож gopher://example.org/reports просить тип r і селектор eports. Ставте тип
перед селектором, як у gopher://example.org/1/reports, і копіюйте адреси з робочого меню, а не
набирайте їх вручну.
Список прочитаного йде відкритим текстом
Кожну сторінку, яку відкриває читач, бачить будь-хто на шляху мережею, і вона, можливо, потрапляє в журнали, яких ніхто не збирався вести. Публікуйте лише те, що могло б стояти на листівці, читайте журнали всієї машини, а не тільки демона, і давайте кожному з них строк зберігання.
Що почитати далі
- RFC 1436: The Internet Gopher Protocol — первинний опис: запит і відповідь, рядки меню, типи пунктів і причини тримати все простим.
- RFC 4266: The gopher URI Scheme
— як адреса
gopher://кодує хост, порт, тип пункту й селектор. - IANA Service Name and Transport Protocol Port Number Registry — офіційний реєстр, де порт 70 записано за Gopher.
- Gophernicus — вихідний код і документація сучасного сервера Gopher, зокрема формат gophermap, який він читає.