我想在开始我的cgi程序时输出一个html表单。我知道我可以通过以下示例perl脚本来完成此操作。
sub MakePage()
{
print "Content-type: text/html\n\n";
print "<html><head><title>Hello World Form</title></head><body>\n";
print "<center><big><big><big><strong>\n";
print "Hello World Form<p>\n";
print "</strong></big></big></big>\n";
print "<FORM ACTION=\"./stdin.cgi\" METHOD=\"POST\">\n";
print "The Field...<br>\n";
print "<input type=\"text\" name=\"TXhelloField\" size=\"100\" \n";
print "value=\"" . MakeString() . "\">\n";
print "<INPUT type=\"submit\" name=\"BXsub\" value=\"Submit\">\n";
print "</form>";
print "</body></html>\n";
}
MakePage();
但是,我想将html表单放在一个名为form1.html的文件中,然后用这样的方法调用它:
sub MakePage()
{
Location: form1.html;
}
我是cgi和perl的新手,我很难解决这个问题,并且在教程中没有太多运气。感谢。
答案 0 :(得分:3)
您需要输出标题,以及合适的状态代码和说明。
print "Status: 302 Found\r\n"
print "Location: http://example.com/form1.html\r\n";
print "Content-type: text/html;charset=utf-8\r\n\r\n";
print "<!DOCTYPE HTML><html lang="en"><head><title>Moved</title></head><body><p>This document can be found at <a href="http://example.com/form1.html">http://example.com/form1.html</a>.</p>\r\n";
(注意:位置标题需要绝对URI,即使大多数浏览器都会播放错误恢复游戏)。
答案 1 :(得分:3)
看看HTML :: Template或Template :: Toolkit。它们将帮助您将HTML与perl代码分开。 e.g。
use HTML::Template;
use CGI;
my $template = HTML::Template->new(filename => 'form1.tmpl');
# replace MAKESTRING TMPL_VAR with string returned by your function
$template->param(MAKESTRING => MakeString());
my $cgi = CGI->new();
print $cgi->header();
print $template->output();
答案 2 :(得分:1)
如果您只是想进行重定向,我建议您使用CGI.pm的redirect
方法(print $q->redirect('http://myserver.com/form1.html')
),而不是手动打印HTTP标头。
如果您需要将任何Perl数据放入返回的页面,将页眉/页脚/侧边栏添加到页面等,然后使用正确的模板解决方案,正如imran建议的那样,绝对是可行的方法。 (哪一个?Template::Toolkit多年来一直是最受欢迎和广泛使用的模板引擎,但它的声誉很慢。其他好的选择是Template::Alloy,这是一个大多数下降 - 取代TT更快,或Text::Xslate,这是我个人使用的选择。)