如何使用 FCGI 获取 cookie
·
回答问题
我有以下 Perl FastCGI 脚本:
#!/usr/bin/perl
use warnings;
use strict;
use FCGI;
use POSIX;
use FindBin qw($Bin);
use FCGI::ProcManager qw(pm_manage pm_pre_dispatch pm_post_dispatch);
use Data::Dumper;
&demonize();
my $socket = FCGI::OpenSocket(":9000", 5);
my $request = FCGI::Request(\*STDIN, \*STDOUT, \*STDERR, \%ENV, $socket, FCGI::FAIL_ACCEPT_ON_INTR);
pm_manage(n_processes => 2);
chdir $Bin or die "Error::$!\n";
while($request->Accept() >= 0 ) {
pm_pre_dispatch();
print "\%ENV => \n ", Dumper($env), "\n\n";
pm_post_dispatch();
}
.....
我使用以下配置在 nginx 上部署了我的应用程序:
server {
listen 80;
server_name eventise.my;
root /home/tigran/Documents/Development/perl/eventise/www;
location / {
index index.html;
}
location ~* \.(gif|jpg|png|js|css|html)$ {
expires 30d;
}
location /perl/ {
fastcgi_pass localhost:9000;
fastcgi_param SCRIPT_FILENAME /home/tigran/Documents/Development/perl/eventise/fcgi-bin$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
fastcgi_pass_header Cookie;
}
}
当我使用 Chrome 的高级 REST 客户端向我的应用程序发送带有 cookie 的请求时,我在%ENV中看不到 cookie。相反,我看到:
%ENV =>
$VAR1 = {
'HTTP_ACCEPT' => 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'REQUEST_METHOD' => 'GET',
'SCRIPT_FILENAME' => '/home/tigran/Documents/Development/perl/eventise/fcgi-bin/perl/',
'HTTP_USER_AGENT' => 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36',
'REMOTE_PORT' => '56832',
'QUERY_STRING' => '',
'HTTP_CACHE_CONTROL' => 'max-age=0',
'HTTP_ACCEPT_LANGUAGE' => 'en-US,en;q=0.8',
'FCGI_ROLE' => 'RESPONDER',
'CONTENT_TYPE' => '',
'DOCUMENT_URI' => '/perl/',
'SERVER_NAME' => 'eventise.my',
'HTTP_ACCEPT_ENCODING' => 'gzip,deflate,sdch',
'HTTP_CONNECTION' => 'keep-alive',
'CONTENT_LENGTH' => '',
'SERVER_PORT' => '80',
'REMOTE_ADDR' => '127.0.0.1',
'REQUEST_URI' => '/perl/',
'SERVER_ADDR' => '127.0.1.1',
'HTTP_HOST' => 'eventise.my'
};
我哪里做错了?
Answers
看起来 Chrome 高级 REST 客户端不支持 cookie:
但是不能设置“Cookie”标头,因为规范不允许。有关详细信息,请参阅http://www.w3.org/TR/XMLHttpRequest/#the-setrequestheader-method。
更多详情:http://blog.getpostman.com/index.php/2013/09/18/legacy-app-update-cookies-and-devtools-for-v0-9-x/
您可以使用旧版本的 Postman 发送/编辑 cookie,或者您可以使用 Postman 代理:
一种解决方法是使用 Postman Proxy 使用从浏览器获取的 cookie 值设置 cookie 标头。
我认为这很笨拙,可以改进。如果您正在测试的 API 使用 cookie,我建议坚持安装 v0.8.x。由于 v0.8.x 和 v0.9.x 可作为单独的应用程序使用,您可以并行使用它们以充分利用 Postman。
更多推荐

所有评论(0)