在我的所有Windows服务器上,除了一台机器,当我执行以下代码来分配临时文件文件夹时:
use CGI;
my $tmpfile = new CGITempFile(1);
print "tmpfile='", $tmpfile->as_string(), "'\n";
Run Code Online (Sandbox Code Playgroud)
变量$tmpfile被赋值'.\CGItemp1',这就是我想要的.但是在我的一台服务器上,它被错误地设置为C:\temp\CGItemp1.
所有服务器都运行Windows 2003 Standard Edition,IIS6和ActivePerl 5.8.8.822(升级到更高版本的Perl不是一个选项).从命令行或IIS中作为CGI脚本(其中scriptmap .pl= c:\perl\bin\perl.exe "%s" %s)运行脚本时,结果始终相同.
我如何修复这个Perl安装并强制它.\CGItemp1默认返回' '?
我甚至将整个Perl文件夹从一个工作服务器复制到了这台机器,但没有任何乐趣.
我检查了' TMP'和' TEMP'环境变量$ENV{TMP},$ENV{TEMP}并且它们是相同的.
从命令行,它们指向用户配置文件目录,例如:
C:\DOCUME~1\[USERNAME]\LOCALS~1\Temp\1
在IIS下作为CGI脚本运行时,它们都指向:
c:\windows\temp
在注册表项中HKEY_USERS/.DEFAULT/Environment,两台服务器都具有:
%USERPROFILE%\Local Settings\Temp
ActiveState实现CGITempFile()显然正在使用另一种机制来确定它应该如何生成临时文件夹.
真正的问题在于CGI.pm模块和附件处理.每当文件上传到网站时,都CGI.pm需要将其存储在临时的某个地方.为此,CGITempFile()在内部调用CGI.pm以分配临时文件夹.所以不幸的是我无法使用File::Temp.不管怎么说,还是要谢谢你.
这帮了很多.我之前有一个快速扫描CGI.pm源,但你的建议让我回过头来仔细研究它以了解底层算法.我把事情搞定了,但最奇怪的是c:\temp服务器上最初没有文件夹.
为了获得临时修复,我创建了一个c:\temp文件夹并为该网站的匿名用户帐户设置了相关权限.但是因为这是一个共享的盒子,我不能这样做,即使临时文件被删除了.简而言之,我将c:\temp文件夹重命名为不同的东西,并且奇怪地返回了正确的' …
让我们说,在ColdFusion网站上,用户已导航到 http://www.example.com/sub1/
服务器端代码通常用于告诉您用户所在的URL,如下所示: http://#cgi.server_name##cgi.script_name#?#cgi.query_string#
但是,"cgi.script_name"会自动包含该文件夹的默认cfm文件 - 例如,该代码在解析和扩展时会向我们显示" http://www.example.com/sub1/index.cfm "
因此,无论用户是访问sub1/index.cfm还是sub1 /,"cgi.script_name"var都将包含"index.cfm".
问题是,如何确定用户实际访问的URL?这个问题主要是针对搜索引擎优化的目的 - 301通常更喜欢将"/index.cfm"重定向到"/"以确保任何一条内容只有一个网址 - 因为这主要是为了蜘蛛的利益,javascript isn在这种情况下是一个合适的解决方案.另外,假设一个人无权访问isapi_rewrite或mod_rewrite-问题是如何在ColdFusion中实现这一点,具体而言.
在Perl中,获取多选表单字段的选定值的最佳方法是什么?
<select name="mult" multiple="multiple">
<option value="1">Opt. 1</option>
<option value="2">Opt. 2</option> <!-- selected -->
<option value="3">Opt. 3</option>
<option value="4">Opt. 4</option> <!-- selected -->
<option value="5">Opt. 5</option>
</select>
Run Code Online (Sandbox Code Playgroud)
我得到这样的常规表单字段: $param1 = param('param1');
是Perl CGI的新手,使用ActivePerl,SQLite DB,Apache服务器和Windows.我有一个输入表单,其中包括Id,Name,Password等字段.每当有人创建新条目时,无论他们进入密码字段,应加密并存储在数据库中.
下一次当同一个用户输入密码时,应该验证它.现在我想要一个解密函数或代码.
我发现了一种叫做MD5加密的东西.请任何人可以给我更多关于此的信息,并帮助我如何编写代码或任何相关的链接?
我有一个长期运行的CGI和超时错误的问题:
超时等待CGI脚本的输出
客户端是jQuery编程的表单.用户输入一些数据并接收分析已启动的消息.除了在分析数据时带有链接的电子邮件之外,用户不希望看到更多消息.那么,此时,与客户端的连接已关闭,对吧?
在服务器端,Perl CGI脚本获取数据并执行一些C程序(使用Perl的系统)来分析它们.此过程可能需要几秒钟到几小时,具体取决于输入的数据.
然后,相同的CGI程序解析结果并向用户发送一封电子邮件,其中包含指向结果网页的链接.
因为对于某些数据,CGI可以运行几个小时我收到错误消息.
我假设增加ScriptTimeout是一个坏主意.我甚至不确定mod_cgi是否已安装.
我该怎么做才能避免这个错误?
服务器:在Mac OS X中运行的Apache2.
我试图从PHP扩展.这是我遇到的一个基本问题,无法弄明白......
password.pl
#!/usr/bin/perl
use CGI;
$q = new CGI;
print "Content-type:text/html\r\n\r\n";
print '<html>';
print '<head>';
print '<title>Card</title>';
print '</head>';
print '<body>';
print '<FORM METHOD=POST ACTION=/card.pl>';
print '<INPUT TYPE=password NAME=password SIZE=25>';
print '<input type=submit value=Submit>';
print '</FORM>';
print '</body>';
print '</html>';
1;
Run Code Online (Sandbox Code Playgroud)
card.pl
#!/usr/bin/perl
use CGI;
$q = new CGI;
$password = $q->param("password");
print $password;
if ($password == pass)
{
print 'Yup';
}
else
{
print 'Wrong Password';
}
1;
Run Code Online (Sandbox Code Playgroud)
什么都没有从password.pl表单传递给card.pl?我以前用过一个类似的例子没问题?
更多咖啡......
我正在开发一个PHP网站,但我使用Perl CGI进行文件上传.
我在WAMP下安装了ActivePerl.
当我开发在Unix服务器上运行的站点时,我想在本地镜像该环境,所以我想在WAMP cgi-bin之外执行CGI文件.
我怎样才能做到这一点?
使用CGI :: Carp,我想用它set_die_handler来优雅地输出错误信息.
网页预计不会遇到错误,但如果确实发生并且它print header已经在调用之后的某个地方发生,它会将标题作为文本输出,并且页面很可能被错误地格式化.
正如问题所述,我想检查是否已经调用了CGI :: header().这可以通过使用全局变量并在我可能调用函数的每个位置设置它来完成,但我希望这可能已经在内部执行; 或者可能有办法解析已发送到STDOUT的内容.非工作代码的示例:
BEGIN {
set_die_handler(
sub {
print header if not CGI::header_called;
# or possibly,something like: if (<STDOUT> !~ /Content\-Type/)
...
});
}
Run Code Online (Sandbox Code Playgroud)
注意:
与CGI.pm的年龄相关的注释被接受,但也很快被驳回:)它意识到Perl具有MVC框架
我正在尝试使用Apache2(Apache/2.4.6(Ubuntu))运行cgi脚本fastcgi_module.这是我设置的虚拟主机
<VirtualHost *:8080>
ServerName cgi.local
DocumentRoot /home/noobeana/CGI
<Directory /home/noobeana/CGI>
AllowOverride All
Order allow,deny
Allow from all
Require all granted
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
SetHandler fastcgi-script
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
这是我创建的用于运行测试()的Perl脚本(正确775'/home/noobeana/CGI/test.pl):
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "Hello there!<br />\n";
Run Code Online (Sandbox Code Playgroud)
Perl可执行文件的路径确实是/usr/bin/perl其他一切看起来很好,但是当我在浏览器中打开http://cgi.local:8080/test.pl时,脚本会永远运行 - 我必须停止Apache强制退出.此外,print正在输出到Apache的错误日志(而不是浏览器),只要脚本正在运行,它就会显示以下多行:
[Fri Feb 07 10:24:54.059738 2014] [:warn] [pid 4708:tid 140365322880896] FastCGI: (dynamic) server "/home/noobeana/CGI/test.pl" started (pid 4771)
Content-type: text/html
Hello there!<br />
[Fri Feb 07 10:24:54.078938 …Run Code Online (Sandbox Code Playgroud) 我有简单的脚本.我已经在命令行中测试了它.一切都好.但是我的浏览器无法执行它.它总是试图下载它.我已经解决了所有apache配置文件,但我找不到任何麻烦.
/etc/apache2/sites-available looks like this:
ScriptAlias /cgi-bin/ /var/www/president/cgi
<Directory "/cgi-bin/ /var/www/president/cgi">
AddHandler cgi-script cgi pl
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Run Code Online (Sandbox Code Playgroud)
脚本很简单
#!/usr/bin/perl -w
use CGI;
print "Content-type: text/html\n\n";
foreach (sort keys %ENV) {
print "<i>$_</i>: $ENV{$_}<br/>\n";
}
Run Code Online (Sandbox Code Playgroud) cgi ×10
perl ×9
apache ×2
apache2 ×2
activestate ×1
cgi.pm ×1
coldfusion ×1
fastcgi ×1
forms ×1
select ×1
timeout ×1
ubuntu-12.04 ×1
url ×1
wamp ×1