【问题标题】:Perl CGI on IIS form POST returns 404IIS 表单 POST 上的 Perl CGI 返回 404
【发布时间】:2015-04-23 18:47:50
【问题描述】:

我正在使用一个自制的小型 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,subversion 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]

【问题讨论】:

    标签: perl iis


    【解决方案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。

    【讨论】:

    • 谢谢,我写 CGI::Router 主要是为了好玩,它永远不会用于任何关键的事情,但感谢您的反馈
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2019-06-08
      • 2019-01-05
      • 2020-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多