4

これは正常に機能します (別のドメインにリダイレクトします):

#! /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 のライブ ヘッダーから取得した出力は次のとおりです。

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
4

2 に答える 2

1

試行錯誤の末に解決策を見つけたと思います。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); 

⋮ 

私の場合、メール プログラムがメッセージを受け入れてキューに入れるのに数秒かかっていました。ウェブページは非常に遅く見えました。上記を実装した後、リダイレクトが即座に発生し、数秒後にメッセージがメール ログに表示されます。

于 2014-01-07T00:08:02.330 に答える
-1

リダイレクト ヘッダーが送信されたら、終了する必要があります。私が正しければ、'Location:' の後にスペースが必要です。これを実現するには、CGI リダイレクト メソッドを使用できます。

  #!/usr/bin/perl
  print "Location: http://MyOwnDomain.com/\n\n"; 
  close(STDOUT); close(STDIN); close(STDERR); 
  exit 0;

CGI でリダイレクト: http://perldoc.perl.org/CGI.html#GENERATING-A-REDIRECTION-HEADER

  use CGI; # load CGI routines
  $q = CGI->new; 
  print $q->redirect('http://somewhere.else/in/movie/land');
于 2013-02-05T08:35:57.317 に答える