Предупреждение: это длинный вопрос, и, вероятно, ответить на него может только профессиональный программист Perl или кто-то, кто связан с регистратором доменов или компанией, занимающейся регистрацией.
Я занимаюсь хостингом, дизайном и регистрацией доменов. Мы являемся регистратором некоторых TLD, и некоторые из них требуют от нас наличия whois-сервера для доменов, зарегистрированных у нас. У меня настроен сервер whois, который работает, но я знаю, что он делает это неправильно, поэтому я пытаюсь понять, что мне нужно изменить.
Мой сценарий настроен так, что можно перейти на whois.xxxxxxxxxx.com через браузер или выполнить whois -h whois.xxxxxxxxxx.com из оболочки. Whois в домене, зарегистрированном у нас, дает данные whois, а домен, не зарегистрированный у нас, говорит, что он не зарегистрирован у нас.
При необходимости я могу указать URL-адрес whois или его можно узнать из моего профиля. Я просто не хочу помещать это здесь, чтобы это выглядело как реклама или чтобы поисковые системы в конечном итоге это сделали.
Проблема в том, как это делает мой сценарий. Мой URL-адрес whois настроен в файле apache httpd.conf как обычный поддомен для прослушивания порта 80, а также настроен для прослушивания порта 43. При вызове через браузер он работает правильно, предоставляет форму для предоставления домена и проверяет нашу базу данных для этого домена. То, как это работает при вызове из оболочки, тоже хорошо, но то, как он различает 2, странно, и как он получает домен, также странно. Это работает, но это не может быть правильным способом.
В чем разница между оболочкой и http:
if ($ENV{REQUEST_METHOD} ne "GET") {
&shell_process;
}
else {
&http_process;
}
Казалось бы, логичнее, чтобы это работало:
if ($ENV{SERVER_PORT} eq 43) {
&shell_process;
}
else {
&http_process;
}
Это не работает, потому что даже при вызове через порт 43 в качестве запроса whois переменные ENV говорят «SERVER_PORT = 80».
Как он получает доменное имя при вызове из оболочки:
$domain = lc($ENV{REQUEST_METHOD});
Вы могли бы подумать, что доменом будет QUERY_STRING или, что более вероятно, в переменных ARGV, но это не так.
Вот переменные ENV (которые имеют значение) при вызове через http:
SERVER_NAME = whois.xxxxxxxxxxxxx.com
REQUEST_METHOD = GET
QUERY_STRING = domain=roughdraft.ws&submit=+Get+Whois+
SERVER_PORT = 80
REQUEST_URI = /index.cgi?domain=premierwebsitesolutions.ws&submit=+Get+Whois+
HTTP_HOST = whois.xxxxxxxxxxxxxx.com
Вот переменные ENV (которые имеют значение) при вызове через оболочку:
SERVER_NAME = whois.xxxxxxxxxxxxxx.com
REQUEST_METHOD = premierwebsitesolutions.ws
QUERY_STRING =
SERVER_PORT = 80
REQUEST_URI =
Обратите внимание, что SERVER_PORT в любом случае остается 80, даже если через оболочку он настроен на порт 43.
Обратите внимание, как через оболочку REQUEST_METHOD выполняется поиск домена.
Я много искал и нашел swhoisd: Simple Whois Daemon, но это только для небольших баз данных. Я также нашел модуль Perl Daemon :: Whois, но он использует базу данных cdb, о которой я ничего не знаю, у нее нет инструкций, и это демон, который мне действительно не нужен, потому что скрипт отлично работает при вызове через apache на порт 43.
Кто-нибудь знает, как это должно быть сделано? Могу ли я заставить скрипт увидеть, что он был вызван через порт 43? Это нормально использовать REQUEST_METHOD таким образом? Должен ли сервер whois работать как демон?
Спасибо за помощь или попытку.
Майк