2015-04-23 90 views
0

我使用一个简单的Web应用程序一个土生土长的小CGI路由器,代码可以在这里找到在github的Perl CGI返回404

web应用程序有一个登录表单如

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(); 

和我有一个路由器处理POST请求这样

$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),这是工作像预期,我提交表格并处理登录,没问题。

我的生产环境是Microsoft-IIS/5.0根据ENV {“SERVER_SOFTWARE”}

在生产环境中返回一个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

经过大量测试后,我意识到,问题不在于路由器或POST不由IIS处理。问题是重定向子例程。

重定向(-url =>'/ admin');适用于OSX,它不适用于IIS。在IIS上,完整的URL必须像重定向一样传递(-url =>'http://example.com/admin')。

1

问题是最有可能下降到不同的环境中,检查不仅仅是服务器软件,但Perl和CGI.pm模块的版本也版本。另外值得注意的是,由于整个NPH的事情,IIS可能导致CGI.pm出现问题 - 请查看CGI.pm的POD以了解更多细节。

至于CGIRouter:

开箱CGI Qw的/:标准/提供你们许多人都期望从一个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

添加了一个框架,任何框架,将意味着增加模块和依赖然后就必须不断更新,以及花时间在理解问题的框架,它的利弊并选择最适合手头任务的专业人士。

这也是一个无参数。 CGI.pm已从5.22版本的perl核心中移除,因此您将需要很快安装它和它的依赖关系。如果你想用一个简单的使用框架来编写一个简单的RESTful Web服务,并且最小的依赖性,那么看看Mojolicious :: Lite。有关更多示例和其他替代方法,请参阅CGI :: Alternatives。

+0

谢谢,我写CGI ::路由器主要是为了好玩,它永远不会服务于任何关键,但感谢您的反馈 –