我在Windows上运行Apache Web服务器,以便处理一些Perl CGI脚本.在生产中这些脚本在linux机器上运行,并且在源代码库中它们都有像shebangs一样#!/usr/bin/perl,但是在我的Windows机器上,shebangs会是#!c:\perl\bin\perl.exe,所以我与源代码库有冲突.
输入Apache ScriptInterpreterSource指令.
我一直试图让它工作,基于我可以谷歌.但到目前为止还没有运气.我有:
将这些内容添加到适当的指令AllowOverride无
选项索引FollowSymLinks ExecCGI顺序允许,拒绝允许来自所有ScriptInterpreterSource Registry-Strict
补充:AddHandler cgi-script .cgi
编辑了我的注册表并添加了一个新的String
Run Code Online (Sandbox Code Playgroud)HKEY_CLASSES_ROOT\.cgi\Shell\ExecCGI\Command=C:\Perl\bin\perl.exe
现在,我知道只要他们拥有合适的shebang,CGI就可以在这台服务器上运行.
但是当我尝试访问没有shebang的CGI时,apache日志会吐出:
没有为'.cgi'类型的文件找到Exec CGI Verb
任何想法,见解,甚至疯狂的猜测都将不胜感激.
谢谢.
我们刚刚在CS课程中获得了第一个主要的Perl CGI作业.我们的任务是创建一个mp3共享站点,允许用户创建帐户,登录,共享mp3.必须显示当前用户的统计信息,可用的mp3等.必须将所有操作写入日志文件.我们的代码必须安全.
到目前为止,我已将这些操作分别实现为自己的CGI脚本.例如,我有一个脚本可以绘制登录表单,注册表单,允许mp3上传的脚本,以及另一个执行mp3服务的脚本.我还创建了一个模块,每当我调用它的实例时,它都会将相关信息发布到日志文件中.但是,每个脚本都是单独的,但登录屏幕除外,它会绘制一个表单,然后发布到login.cgi.帐户生成的工作原理相同.但是,在大多数情况下,每个人都独立行事.
我的问题:如何将这些链接在一起,以便除非用户登录,否则不允许任何操作?我假设我应该使用登录脚本(接收post动作的脚本)来驱动一切,但我该怎么做?我真的很茫然.我想有一个用户登录,主页是用选项绘制的(添加mp3,听mp3,显示统计等).我最好是绘制某种形式并将动作设置为不同的脚本吗?如何处理这些脚本的返回?饼干会以某种方式帮助吗?
其他相关信息:到目前为止,我使用本网站上的ovid教程和Lincoln Stein的书完成了CGI.pm的大部分工作.
背景:我正在为一家允许用户通过Web界面创建FTP帐户的公司编写脚本.在后台,脚本必须运行一堆命令:
还有其他一些事情......
我基本上都在寻找最安全的方法.我听说过setuid方法,sudo方法,当然还有httpd作为特权用户运行.在执行任何命令之前,将对输入的数据进行完整性检查(即,仅用户名中的字母数字字符)
流行脚本使用的方法是什么(例如webmin),因为它必须相当安全?
我在网上研究过,发现了几个有趣的Perl模块/框架,比如HTML:Mason,HTML :: Embperl,或MVC Catalyst框架等,它们可以让我在html中嵌入Perl,类似于html中的PHP代码.
但是,我的Perl项目必须上传到只提供有限权限和资源的uni服务器.
例如,Apache版本1.3.3和Perl版本5.8.0(低于Catalyst的要求)
我使用脚本来检查所有已安装的Perl模块,只有那些名称包含单词"html":
HTML::HeadParser 2.17
HTML::Entities 1.23
HTML::Filter 2.09
HTML::LinkExtor 1.31
HTML::Parser 3.26
HTML::PullParser 2.06
HTML::TokeParser 2.24
HTML::Tagset 3.03
HTML::Form 0.03
Run Code Online (Sandbox Code Playgroud)
我担心他们中没有人能让我直接将Perl嵌入到html中.
我知道我可以使用简单的print语句和"heredoc" 在Perl/CGI中的html页面上打印所有内容,但我认为这违反了MVC设计范例并且开发灵活性较低且更复杂,主要是因为现在的业务逻辑是搞砸了html标记.
我目前的解决方案是使用jQuery触发AJAX请求,以便从客户端将html加载到特定标记中.因此,在这种情况下,Perl仅用于提供服务器端数据访问,操纵相关数据并提供对AJAX请求的JSON格式响应.
我想知道有更好的方法吗?我几乎无法改变服务器状态,我认为系统管理员不会那么慷慨安装任何其他Perl模块.
更新信息:
将Perl嵌入到html中的主要原因是我对CGI编程很新,而且由于我对PHP和jQuery更熟悉,我想知道是否有一种正确的方法将Perl直接嵌入到html中,所以我可以很快完成客户端部分并专注于服务器端.
说,像这样:
<div id='user_status'>Your last visit was :[% getLastVisitDateTime($userId)%]</div>
Run Code Online (Sandbox Code Playgroud)
请关注我对Perl/CGI的一点知识,并且非常感谢您的帮助.
第2次更新: 按照Template Toolkit网站说明,我在我自己的MacBook Pro上安装了这个模块但不幸的是由于许可原因我无法将它安装到uni的服务器上:
Warning: You do not have permissions to install into
/usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi
at /usr/lib/perl5/5.8.0/ExtUtils/Install.pm line 84.
mkdir /usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-
multi/auto/Template: Permission denied at /usr/lib/perl5/
5.8.0/ExtUtils/Install.pm line 137
make: *** [pure_site_install] Error 255
Run Code Online (Sandbox Code Playgroud)
所以不幸的是,我现在正在寻找其他方式......
好吧,出于同样的原因,似乎无法安装HTML …
更新:
绝望之下,我在shell中做了以下事情:
REDIRECT_STATUS=true
SCRIPT_FILENAME=/var/www/...
REQUEST_METHOD=POST
GATEWAY_INTERFACE=CGI/1.1
export REDIRECT_STATUS
export SCRIPT_FILENAME
export REQUEST_METHOD
export GATEWAY_INTERFACE
echo "test=1" | php-cgi
Run Code Online (Sandbox Code Playgroud)
...并且仍然没有$_POST变量显示在此输出中:
<?php var_dump($_POST); ?>
Run Code Online (Sandbox Code Playgroud)
我正在尝试创建一个与php-cgi二进制文件接口的小型Web服务器.然而,情况并不顺利.该php-cgi二进制正确处理GET请求.当涉及到POST请求$_POST时,即使事情正在进行POST,数组也是空的.
我已经检查了被送入php-cgi二进制文件的HTTP标头,它们确实包含了POST数据和Content-type: application/x-www-form-urlencoded标头.
什么可以阻止php-cgi二进制文件看到请求中包含POST数据?
我正在取得进展,我从PHP源代码中挖出了一些东西:
468: static int sapi_cgi_read_post(char *buffer, uint count_bytes TSRMLS_DC)
(我不知道从哪里调用这个函数.)
看完下面的答案,我试过:
<?php
var_dump($HTTP_RAW_POST_DATA);
?>
Run Code Online (Sandbox Code Playgroud)
......产生了输出:
NULL
Run Code Online (Sandbox Code Playgroud)
......表明在这里工作的东西更奇怪.
我越来越近了...我在/main/php_content_types.c中找到了这个函数:
SAPI_API SAPI_POST_READER_FUNC(php_default_post_reader)
...它似乎是处理POST请求的代码.
我想在浏览器中运行python文件.我已经安装了apache.和配置httd.conf文件.我创建了test.py文件.然后我尝试test.py通过键入运行我的浏览器htt://localhost/test.py.当我这样做时,我收到以下错误:
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.
Please contact the server administrator, lohith.pinto@primefocusworld.com and inform them of the time the error occurred, and anything you might have done that may have caused the error.
More information about this error may be available in the server error log.
Run Code Online (Sandbox Code Playgroud)
在我的错误日志中
[Thu Jul 07 18:39:55 2011] [error] [client 127.0.0.1] (OS 2)The system cannot …Run Code Online (Sandbox Code Playgroud) 我认为这个问题非常自我解释,但我使用perl来生成一个网页.开始使用:
$cgi->start_html(-title=>'myPage',-style=>{-src=>'style.css'}, -script=>{-type=>'JAVASCRIPT', -src=>'custom.js'}, );
Run Code Online (Sandbox Code Playgroud)
项目清单
但是如果我想在标题中有多个脚本呢?还是多个CSS样式表?
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js"></script>
<script type="text/javascript" src="custom.js"></script>
<link rel="stylesheet" href="css/basic.css" type="text/css" />
<link rel="stylesheet" href="css/style.css" type="text/css" />
Run Code Online (Sandbox Code Playgroud) 当用Apache运行PHP时,我知道为每个请求加载了php核心和所有库.但是,使用PHP CGI,FastCGI或使用PHP-FPM,php进程在重新启动之前通常会持续500-1000个请求.
在此期间,它如何处理加载的PHP类或库?
假设我有一个加载大量库的文件,它会在每次请求时加载(然后转储)大型库,还是为我传递的每个新请求加载它?
"加载"我的意思是包含(并解析)类,但不创建任何对象.
APC如何发挥作用?
我必须编写一个 php 脚本来检查服务器配置。我需要检查 apache 版本和 11 个模块的状态,如 mod_actions、mod_alias (...)。
当服务器模式为CGI或FastCGI时,是否有解决方案来检查apache模块的状态?Apache_get_modules() 仅当服务器模式位于 Apache Handler 上时才有效...
谢谢
我已经安装了Windows Server2016虚拟机,并使用CGI,ISAPI,.Net等安装了IIS。我唯一的志向是用旧的CGI方法运行python脚本:请求的python文件,在单独的新文件中执行过程完成。
我按照一系列教程的建议添加了脚本映射。我确保相应地设置ISAPI筛选器和CGI限制。我似乎仍然无法解决404.2的问题。显然,找到了映射,test.py文件存在,并且我已经在“完全控制”中打开了“所有人”的文件系统,以确保这不是问题。
在ISAPI和CGI限制中,我尝试了不同的格式:有和没有%s%s,有和没有引号等。
我尝试在本地脚本上使用该python.exe命令,它运行正常。IIS出现问题,无法解决。
从Web浏览器浏览根文件夹可以成功工作并列出.py文件。
自定义网站的Web配置,显示python脚本映射
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<handlers accessPolicy="Read, Execute, Script">
<add name="Python" path="*.py" verb="*" modules="CgiModule" scriptProcessor="C:\Anaconda3\python.exe %s %s" resourceType="Either" requireAccess="Script" />
</handlers>
<directoryBrowse enabled="true" />
</system.webServer>
</configuration>
Run Code Online (Sandbox Code Playgroud)