我使用自制的小型CGI路由器进行简单的webapp,代码可以在github上找到
webapp有一个像这样的登录表单
my $form = start_form( -method => 'post', -action => '/login' );
$form .= p( label('Mail'), textfield( -name => 'mail' ) );
$form .= p( label('Mail'), password_field( -name => 'pass' ) );
$form .= p( submit( -value => 'Log ind', -class => 'button button-primary' ) );
$form .= end_form();
我有一个路由器处理这样的帖子请求
$router->add_route( 'POST', '/login', sub {
if ( param ) {
# Get mail and pass
my $mail = $cgi->param( 'mail' );
my $pass = $cgi->param( 'password' );
# Check against user table
# Set cookie and redirect to admin
}
# Otherwise redirect to /login
print redirect( -url => '/login' );
});
在我的本地环境中,osx 10.10.3,perl 5,版本18,颠覆2(v5.18.2),这就像预期的那样工作,我提交表单并处理登录,没问题。
根据ENV {' SERVER_SOFTWARE'}
我的生产环境是Microsoft-IIS / 5.0在生产环境中返回404,不幸的是我无法抓住任何可能显示有用内容的日志文件。
生产和本地环境上的.htaccess文件
# RewriteBase /
DirectoryIndex index.pl index.phtml index.html
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule ^(.*)$ index.pl [L,QSA]
答案 0 :(得分:1)
问题很可能发生在不同的环境中,不仅要检查服务器软件,还要检查perl的版本和CGI.pm模块的版本。另外值得注意的是,由于整个NPH的事情,IIS可能会导致CGI.pm出现问题 - 请查看CGI.pm的POD以获取更多详细信息。
关于CGIRouter:
开箱即用CGI qw /:standard /提供了您期望从Web框架中获得的许多功能,它具有创建HTML标记的方法,如锚点,段落和H标记。 CGI可能不像一些现代框架那样性感。
不是CGI.pm不是性感的,而只是not fit for purpose in any modern web app。更不用说HTML markup functions are considered deprecated and shouldn't be used
了添加框架,任何框架,都意味着添加模块和依赖项,然后必须保持最新,并花时间了解相关框架,它的缺点和优点,以便选择适合手头任务的最佳选择。
这也是一个无论争论。从5.22开始,CGI.pm已从perl核心中删除,因此您需要很快安装它及其依赖项。如果您想使用简单易用的框架编写一个简单的RESTful Web服务,并使用最少的依赖关系,那么请查看Mojolicious :: Lite。有关更多示例和其他替代方案,请参阅CGI :: Alternatives。
答案 1 :(得分:0)
经过大量的测试后,我意识到,问题不在于路由器或者IIS没有处理POST的事实。问题是重定向子程序。
而重定向(-url =>' / admin');适用于OSX,它不适用于IIS。在IIS上,必须传递完整的URL,如同重定向(-url =>' http://example.com/admin')。