2015-04-23 112 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 ::路由器主要是爲了好玩,它永遠不會服務於任何關鍵,但感謝您的反饋 –