Назад | Перейти на главную страницу

Как вызвать сценарий Perl CGI, когда пользователь запрашивает HTML-страницу?

Есть ли способ вызвать Perl CGI-скрипт, когда HTML-страница запрашивается на сервере?

Так же, как скрипт может быть привязан к действию, есть ли способ привязать скрипт к «Запросу страницы»

Будет ли вызвана программа Perl CGI или нет, зависит в первую очередь от конфигурации сервера и части пути к ресурсу.

Сценарий Perl CGI может возвращать HTML (и обычно это так). Таким образом, при запросе скрипта часто запрашивается html-страница, даже если URL-адрес не содержит «.html».

Если URL, скажем, http://www.example.com/cgi-bin/myscript.html Я подозреваю, что большинство веб-серверов попытаются проверить, является ли myscript.html работающей программой или каким-либо сценарием.

Смотрите также http://httpd.apache.org/docs/2.0/howto/cgi.html особенно "CGI вне каталогов ScriptAlias"

Чтобы незаметно изменить /some/path/foo.html на /other/path/bar.cgi, см. http://httpd.apache.org/docs/2.0/misc/rewriteguide.html

Есть ли способ вызвать сценарий Perl-CGI, когда HTML-страница запрашивается на сервере?

Да.

Есть несколько возможных способов, в зависимости от того, чего вы хотите достичь. Пример: вы пытаетесь выполнить /cgi-bin/script1 когда /htdocs/docs2/doc1.html называется.

  1. Если ваша цель - просто загрузить основной doc1.html в то время как - сбоку, не затрагивая эту HTML-страницу - выполняется отдельный сценарий CGI (именно так работают счетчики), вы гарантируете, что doc1.html содержит некоторый код HTML или JavaScript, который вызывает URL-адрес /cgi-bin/script1 .

    Опять же, этот метод предназначен для тех случаев, когда вы НЕ хотите создавать HTML-код с помощью сценария CGI; и doc1.html это фактический HTML-документ, который вы хотите загрузить.

    Вот пара способов сделать это:

    • Имейте атрибут «onload» в теле HTML, который выполняет асинхронный вызов AJAX для CGI URL.

      Конечно, это может быть любой код JS-скрипта на странице, а не только «загрузка», если вам все равно, выполняется ли CGI до того, как страница завершит загрузку.

    • Сделайте так, чтобы веб-страница содержала изображение (если вы хотите, чтобы оно было скрыто, используйте прозрачный GIF размером 1x1, используя старую технику, или сделайте CSS изображения display значение свойства должно быть «скрыто» усниг более современный подход). Изображения src значение атрибута должно быть URL-адресом вашего сценария CGI. Если изображение действительно должно быть чем-то видимым, сценарий CGI должен вернуть ответ перенаправления HTTP, указывающий на URL-адрес фактического изображения.

      Обратите внимание, что примерно так же работали все счетчики страниц в старые времена Интернета (они все еще могут, хотя я случайно предполагаю, что в наши дни они, скорее всего, связаны с AJAXy вместо использования некоторых вещей Google Analytics).

    • Очень похоже на предыдущий, но используется скрытый <IFRAME> атрибут "src" указывает на сценарий CGI.

    Очевидно, что оба последних подхода (IFRAME или IMG) синхронны, например ваша страница не на 100% завершит загрузку изображения или кадра, пока сценарий CGI не завершит отправку своего HTTP-ответа; тогда как первый может быть синхронным или асинхронным вызовом XMLHTTPRequest (также известным как AJAX).

    Остальные подходы касаются сценария CGI, который выполняется ВМЕСТО HTML-файла.

  2. "Doc1.html" должен содержать только перенаправление (обычно обновление META HTTP или изменение фрагмента кода JavaScript window.location значение) в URL-адрес CGI. Затем пусть CGI-скрипт создает HTTP-ответ, который либо возвращает желаемый HTML, либо возвращает HTTP-перенаправление на другую HTML-страницу.

  3. Если вы используете Apache, вы можете фактически переписать URL-адреса, например, используя mod_rewrite; и, следовательно, псевдоним веб-сервера /htdocs/docs2/doc1.html к /cgi-bin/script1 для вас внутренне.

  4. Вы также можете выполнить несколько иную версию полной перезаписи UEL, изменив конфигурацию веб-сервера так, чтобы «docs2» был действительным каталогом CGI вместе с «cgi-bin» (единственное, что делает cgi-bin особенным, это то, что ваш веб-сервер имеет запись конфигурации, указывающую, что это каталог сценария CGI); затем soft-alias dic1.html для script1.

    IMHO, не очень полезный или хороший метод, но это может быть самый простой и лучший подход для определенных сценариев.

Я предполагаю, что вы хотите обслуживать простой HTML-файл и запускать скрипт Perl CGI в фоновом режиме.

Немного старомодно, но вы можете использовать SSI, например <!--#exec cgi="/cgi.pl" -->

Может делать что-то подобное в JavaScript (возможно, с onload или отправка скрытой формы).