Господа-товарищи, а с какой версии Apache перестал понимать символ подчёркивания (_) в имени домена? Точно знаю, что v2.4.18 ещё понимает, а v2.4.25 уже не понимает. При прочих равных. Последний, при попытке обратится по такому имени, возвращает код ответа 400.
Да при чём тут nginx. Мне важно, до какой версии могу обновить апач, чтобы всё не посыпалось. п.с. Было v2.4.18 + php56, - работало. Поставил v2.4.25 + php7, - глюкнуло. Убил полдня, чтобы найти где и что глючит. Обплевал линуксоида в лице монитора. Оттёр и вернул v2.4.18 + php7, - работает. Но обновить надо.
Потестил на apache 2.4.25 при LogLevel debug в логах появляется сообщение vhost.c(796) [strict] Invalid host name Спойлер Это происходит в недрах функции strict_hostname_check, которая вызывается из fix_hostname Код (Text): int strict = (http_conformance != AP_HTTP_CONFORMANCE_UNSAFE); Код (Text): else { rv = fix_hostname_non_v6(r, host); if (strict && rv == APR_SUCCESS) rv = strict_hostname_check(r, host); } if (rv != APR_SUCCESS) goto bad; https://github.com/apache/httpd/blob/trunk/server/core.c#L4064-L4082 Похоже, что вырубить эту проверку можно только поставив HttpProtocolOptions Unsafe http://httpd.apache.org/docs/2.4/mod/core.html#httpprotocoloptions
Это не решение. Запрет символа "_" в имени домена это явный глюк (ибо символ разрешён по стандарту). Поэтому допустимое решение это обновить до чуть более ранней версии, где глюка ещё нет, или ждать версию, где этот глюк исправят. Учитывая, что исправления у линуксоидов можно ждать годами, это ... грустно. А вообще, мой вопрос теряет актуальность. Я и сам бы нашёл ответ, ещё вчера, но выяснилось, что не могу найти бинарники предыдущих версий (мне нужно под винду). Бред какой-то, - есть только последняя версия бинарников. Почему ни один сайт не хранит предыдущие - загадка Природы.
Например, здесь https://tools.ietf.org/html/rfc3986 : unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" или здесь https://ru.wikipedia.org/wiki/URL или в других местах А какой стандарт знаешь ты?
И? Берешь правильный параграф того стандарта, на который ссылаешься и видишь ссылки на другие стандарты. В контексте твоей задачи - 1034 и 1035, например. Ссылка на 1034 есть в правильном месте того стандарта, ссылку на который ты присылаешь. Ты просто не в том параграфе смотришь.
"Domain Concepts and Facilities November 1987" Ничего более древнего не нашёл? --- Добавлено --- Интересно, а как апач решает проблему национальных имён с таким подходом? --- Добавлено --- Да в том том. Кстати, в том месте, на которое ты ссылаешься, есть запись "reg-name = *( unreserved / pct-encoded / sub-delims )". Где unreserved определён выше.
Вот жеж, rfc для него слишком стар ) Вроде есть даже тикет на эту тему, подчеркивание разрешилось в результате бага и было довольно оперативно поправлено.
10 лет работало. Это "оперативно"? --- Добавлено --- Не имеет значения, стар не стар. Имеет значение "текущий стандарт", а текущий rfc3986 от 2005г. Или я ошибаюсь?
@Chushkin зачем в домене символ _, он вроде только в DNS используется и веб-сервер на него не должен отвечать. В DNS тип записи TXT для DKIM например. Просто стало интересно.
Не-а. Домен часть URI и должен соответствовать его правилам. А то, что DNS-сервера не соответствуют правилам URI это их проблемы, но никак не HTTP-сервера. --- Добавлено --- Затем, что это соответствует стандарту. Устаревший стандарт прошлого века разрешает в доменах только "-". Текущий стандарт - несколько, кроме "_". Может они тоже не нужны?
Стандарт на uri разрешает подчеркивание и кучу других символов в uri, стандарт на доменное имя - запрещает подчеркивание в доменных именах. Почему dns-сервера должны забить на свой rfc и следовать другом?
Потому что, - всё течёт всё движется. Стандарт 30-и летней давности давным давно устарел. 60 лет назад вообще никаких DNS не было. Может этот "стандарт" применить?