WWW,CGI-специфика
Я положил скрипт на сервер, ввожу его путь в браузер, но вместо того, чтобы выполнять скрипт, браузер выводит его исходный текст.
При попытке запустить скрипт происходит 500 Internal Server Error! Что это за ошибка?
Как узнать IP человека, вызвавшего скрипт?
Как узнать, с какой страницы идет ссылка на скрипт?
Как узнать IP прокси, если через нее запустили скрипт?
А можно ли узнать IP юзера, запустившего скрипт через прокси?
А какие еще значения есть у этого %ENV?
Как запускать скрипт на сервере через определенные промежутки времени, или в определенное время суток, день недели, месяц?
Как, зная ip, получить имя (DNS), за которым этот ip закреплен?
Что такое method GET, и что такое method POST?
Как обрабатывать параметры, переданные скрипту?
Посоветуйте халявный хостинг с поддержкой CGI-perl.
Что надо указатьв заголовках HTTP-ответа CGI скрипта, выводящего содержимое, которое надо не показать на экране, а сохранить в файле с заданным именем, например 'download.zip' ? А то браузер сохраняет файл с именем скрипта.
Директивы SSI не обрабатываются в выводе скрипта. Что делать?
print "Ok";
Обратите внимание на двойной перевод строки в конце заголовка.
(*)Примечание:
Если у вас нет доступа к логу ошибок сервера, для отладки скрипта используйте
директиву use CGI::Carp qw (fatalsToBrowser); В этом случае при фатальной ошибке, приводящей к завершению скрипта, эта ошибка будет видна вам в браузере.
Q: Как узнать IP человека, вызвавшего скрипт?
A: $ENV{'REMOTE_ADDR'}
Q: Как узнать, с какой страницы идет ссылка на скрипт?
A: $ENV{'HTTP_REFERER'}
Q: Как узнать IP прокси, если через нее запустили скрипт?
A1 $ENV{'HTTP_VIA'}
A2: Hекоторые прокси добавляют в конец заголовка строку типа
", via ProxyName", и в результате вместо переменной HTTP_VIA эту строку можно
наблюдать в конце переменной $ENV{'HTTP_USER_AGENT'}
Q: А можно ли узнать IP юзера, запустившего скрипт через прокси?
A: $ENV{'HTTP_X_FORWARDED_FOR'}. Hо не все прокси обеспечивают IP сидящего за
ними юзера. "Честные" прокси,- у провайдеров, например,- это делают. А
некоторые халявные (анонимные) прокси-сервера, могут и не показывать IP сидящего "за" ними пользователя.
Q: А какие еще значения есть у этого %ENV ?
A: for (keys %ENV) { print "$_ = ${ENV{$_}}\n" }
A1: То же самое, но по-другому записанное (более "перловое" решение):
print join("
",map("$_ = $ENV{$_}", keys %ENV));
Q: Как запускать скрипт на сервере через определенные промежутки времени, или
в определенное время суток, день недели, месяц?
A: Это возможно, если есть шелл-доступ на сервер. Читайте man crontab
Q: Как, зная ip, получить имя (DNS), за которым этот ip закреплен?
A: Встроенная функция gethostbyaddr()
Q: Что такое method GET, и что такое method POST?
A1: rfc2616
A2: GET - передача параметров скрипту из строки location браузера. Пример:
script.cgi?mode=aa&type=bb&length=12
Минусы этого метода:
1. Все параметры видны в строке. Если в кач-ве параметров передается пароль
- получается дырка в безопасности
2. Длина данных, передаваемых таким методом, ограничена.
3. Hельзя передавать multipart form data, в т.ч. файлы через кнопочку
"Browse"
POST - передача данных скрипту через STDIN. Отсутствуют минусы метода GET.
Обычно метод GET используется, когда скрипт вызывается со страницы через линк
, а POST - при нажатии кнопки submit в форме.
О получении параметров внутри скрипта читайте в следующем Q.
Q: Как обрабатывать параметры, переданные скрипту?
A1: Используйте модуль CGI. Прочтите perldoc CGI , а для начала простой
пример:
use CGI;
$q=new CGI();
$mode=$q->param('mode');
$q - объект, который имеет несколько методов и полей, относящихся к
параметрам вызова, переменным окружения, cookie, и пр. В $mode содержится значение параметра 'mode'.
или проще: use CGI qw/:standard/;
$mode=param('mode'); если вам не нужно несколько объектов.
A2: Некоторые предпочитают пользоваться библиотекой cgi-lib (она тоже входит в модуль CGI, хотя существуют индивидуумы, которые включают ее отдельным файлом).
Пример:
use CGI qw(:cgi-lib);
ReadParse(); #Функция возвращает все параметры в хэш.
$mode=$in{'mode'};
A3: Можно пойти по пути изобретения велосипеда и начать переписывать модуль CGI, т.е. разбор параметров метода GET, потом наверняка понадобиться POST, а потом multipart form data. В написанный код закрадуться ошибки, которые придется отлавливать на последующих этапах. Это конечно дает неплохую практику программирования, но лучше просто посмотрите как написан модуль CGI.
(Высказанное в последнем ответе является тем самым ИМХО ).
Q: Посоветуйте халявный хостинг с поддержкой CGI-perl.
A:www.virtualave.net
free.prohosting.com
www.hypermart.net
www.virtualave.net
www.webservis.ru
www.h1.ru
www.holm.ru
www.hut.ru
Примечание:
В последнее время почти все халявные хостинги перестали поддерживать исходящие запросы, т.е. скачать откуда-нибудь файл используя LWP или Net::Ftp не получиться.
Если знаете хостинг с поддержкой исходящих запросов, напишите мне, буду благодарен.
Q: Что надо указатьв заголовках HTTP-ответа CGI скрипта, выводящего
содержимое, которое надо не показать на экране, а сохранить в файле с заданным
именем, например 'download.zip' ? А то браузер сохраняет файл с именем скрипта.
A: print "Content-Type: application/octet-stream\nContent-Length: ", -s 'download.zip' ,"\n";
print "Content-Disposition: attachment; filename=download.zip\n\n";
Q: Директивы SSI не обрабатываются в выводе скрипта. Что делать?
A: Есть специальный модуль - CGI::SSI.