可以正常工作(重定向到其他域):

#! /usr/bin/perl
print "Location:http://AnyDomainBesidesMyOwn.com/\n\n";
close(STDOUT); close(STDIN); close(STDERR);
[some long process]


但是以下方法使浏览器停滞不前,拒绝重定向,直到漫长的过程完成为止。上面的唯一变化是,我将重定向到脚本运行所在的同一域中的另一个页面。

#! /usr/bin/perl
print "Location:http://MyOwnDomain.com/\n\n";
close(STDOUT); close(STDIN); close(STDERR);
[some long process]


我知道我可以通过分叉一个新流程来使它起作用,但是必须有一种更简单的方法...对吗?

更新:这是我从Firefox中的Live Headers获得的输出:

http://example.com/test3.cgi

GET /test3.cgi HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:18.0) Gecko/20100101 Firefox/18.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive

HTTP/1.1 302 Found
Date: Sun, 27 Jan 2013 23:31:49 GMT
Server: Apache
Location: http://example.com/
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 187
Keep-Alive: timeout=2, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=iso-8859-1




然后设计重定向之后:

http: //example.com/ [Have to include the space b/c stackoverflow limits the number of links I can include in a post]

GET / HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:18.0) Gecko/20100101 Firefox/18.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive

HTTP/1.1 200 OK
Date: Sun, 27 Jan 2013 23:31:54 GMT
Server: Apache
Accept-Ranges: bytes
X-Mod-Pagespeed: 0.10.21.2-1381 [Same problem even on a domain w/o pagespeed installed]
Vary: Accept-Encoding
Content-Encoding: gzip
MS-Author-Via: DAV
Cache-Control: max-age=0, no-cache
Content-Length: 12189
Keep-Alive: timeout=2, max=99
Connection: Keep-Alive
Content-Type: text/html

最佳答案

我相信经过反复尝试,我已经找到了解决方案。关键是使用fork()并退出父进程。然后关闭子进程中的所有文件句柄:

#!/usr/bin/perl

print "Location: ../myHomePage.htm\n\n";

exit 0 if fork();
close(STDIN);
close(STDOUT);
close(STDERR);

# do some long process
open(SM, "| /usr/sbin/sendmail -ti -odq);

⋮


以我为例,邮件程序花了几秒钟来接受消息并将其排队。该网页似乎很呆滞。完成上述操作后,重定向立即发生,几秒钟后,该消息出现在邮件日志中。

关于perl - Perl重定向浏览器并继续处理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14698984/

10-14 16:21
查看更多