IIS表单POST上的Perl CGI返回404

时间:2015-04-23 18:47:51

标签: perl iis

我使用自制的小型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]

2 个答案:

答案 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')。