CGI-скрипт Perl выводит необработанный HTML даже после явной настройки Content-Type - PullRequest
0 голосов
/ 15 апреля 2019

У меня много проблем с получением моего Perl CGI-скрипта для рендеринга HTML.Он продолжает выводить HTML как обычный текст.Я даже пытался явно установить Content-Type с print header("text/html");

Что-то не так с приведенным ниже кодом?-

use CGI qw(:standard);

# other code

print header("text/html"); 
# also tried just print header;

my $banner = "Some text";
print start_html($banner);
print h3($banner);

print start_form(-method=>"POST");
# HTML form specific code
print end_form;

print end_html;

Когда я проверяю вкладку Элементы в инструментах разработчика Chrome, по какой-то причине весь HTML-код оборачивается тегом <pre>, который, в свою очередь, находится внутри другого HTML-документа.Так что HTML-код искажен, но я не могу понять, почему -

<code>    <html>

    <head></head>

    <body>
        <pre style="word-wrap: break-word; white-space: pre-wrap;">&lt;!DOCTYPE html
        PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
    &lt;html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US"&gt;
    &lt;head&gt;
    &lt;title&gt;Some text&lt;/title&gt;
    &lt;meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /&gt;
    &lt;/head&gt;
    &lt;body&gt;
    &lt;h3&gt;Some text&lt;/h3&gt;&lt;form method="post" action="/path/script.pl?param1=val1&param2=val2" enctype="multipart/form-data"&gt;

    //form specific code

&lt;/form&gt;
    &lt;/body&gt;
    &lt;/html&gt;

Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

2 голосов
/ 16 апреля 2019

Когда я запускаю вашу программу, я получаю следующий вывод:

Content-Type: text/html; charset=ISO-8859-1

<!DOCTYPE html
    PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US">
<head>
<title>Some text</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>
<h3>Some text</h3><form method="post" action="http://localhost" enctype="multipart/form-data"></form>
</body>
</html>

Это именно то, что я ожидал увидеть, и ничего похожего на то, что вы видите. Я вижу две возможности объяснить это несоответствие:

  1. В разделе # other code вашей программы есть что-то, что выводит набор заголовков CGI (и, возможно, теги <pre>).
  2. Вы на самом деле не запускаете код в среде CGI, и существует некоторая необычная веб-конфигурация, которая берет выходные данные из вашей программы и встраивает их в другую веб-страницу.

Простой способ различить эти два случая - запустить вашу программу из командной строки и посмотреть, какой вывод вы получите. Если вы получили выходные данные, то проблема где-то в # other code, если вы получили мой вывод, то проблема в конфигурации веб-сервера.

Кроме того, я настоятельно рекомендую вам прочитать раздел, озаглавленный Функции генерации HTML больше не должны использоваться в последней версии документации по модулю CGI и * Страница 1021 * CGI :: Alternatives , чтобы увидеть некоторые предложения для лучших подходов.

0 голосов
/ 15 апреля 2019

Что-то не так в следующем коде?-

Да.Для начала он даже не компилируется.

$ perl <<'__EOS__'
use CGI qw(:standard);

// other code

print header("text/html"); // also tried just print header;
my $banner = "Some text";
print start_html($banner);
print h3($banner);

print start_form(-method=>"POST");
// HTML form specific code
print end_form;

print end_html;
__EOS__
Bareword found where operator expected at - line 3, near "// other"
        (Missing operator before other?)
Bareword found where operator expected at - line 3, near "other code"
        (Do you need to predeclare other?)
Bareword found where operator expected at - line 5, near "// also"
        (Missing operator before also?)
Bareword found where operator expected at - line 11, near "// HTML"
        (Missing operator before HTML?)
Bareword found where operator expected at - line 11, near "specific code"
        (Do you need to predeclare specific?)
syntax error at - line 3, near "// other "
syntax error at - line 5, near "// also tried "
syntax error at - line 11, near "// HTML form "
Execution of - aborted due to compilation errors.

Но после изменения всех // на # мы получим прекрасно работающую программу, которая не выводит никаких элементов PRE.

$ perl <<'__EOS__'
use CGI qw(:standard);

# other code

print header("text/html"); # also tried just print header;
my $banner = "Some text";
print start_html($banner);
print h3($banner);

print start_form(-method=>"POST");
# HTML form specific code
print end_form;

print end_html;
__EOS__
Content-Type: text/html; charset=ISO-8859-1

<!DOCTYPE html
        PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US">
<head>
<title>Some text</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>
<h3>Some text</h3><form method="post" action="http://localhost" enctype="multipart/form-data"></form>
</body>
</html>
0 голосов
/ 15 апреля 2019

Попробуйте:

print(header(-type => 'text/html'));

по крайней мере, это сработало для меня.

...