CGI 스크립트의 메시지가 브라우저에서 렌더링되지 않습니까?

StackOverflow https://stackoverflow.com/questions/1636221

  •  06-07-2019
  •  | 
  •  

문제

파일 :: copy를 사용하여 한 네트워크 공유에서 일부 파일을 다른 네트워크 공유로 복사하려고합니다.

이것은 내 코드입니다.

#!C:/strawberry/perl/bin/perl.exe
use File::Copy;
print "Content-type: text/html\n\n";
print "<H1>Hello World</H1>\n";
copy("s:\\nl\\cover\\config.jsp", "s:\\temp\\config.jsp") 
    or die "File cannot be copied.";
print "this is not displayed";

'다이'메시지가 렌더링되지 않는 이유는 무엇입니까?

도움이 되었습니까?

해결책

웹 서버에서 이것을 실행중인 경우 (이유를 상상할 수 없습니다. "Content-Type" 헤더), 사용중인 오류 메시지 die 그리고 warn 서버의 오류 로그로 이동합니다.

또한 CGI로 이것을 호출하는 경우 HTML을 보내고 HTML을 보내지 않는다고 주장하여 브라우저에 누워있는 경우에 유의하십시오.

특히 Perl을 배우고 있다면 모든 것을 점령해야합니다. s와 당신의 모든 것을 가로 지릅니다 에스:

#!C:/strawberry/perl/bin/perl.exe

use strict;   # every time
use warnings; # every time

use CGI qw(:cgi);
use CGI::Carp qw(fatalsToBrowser); # only during debugging

use File::Copy;
use File::Spec::Functions qw(catfile);

$| = 1;

# prefer portable ways of dealing with filenames
# see http://search.cpan.org/perldoc/File::Spec

my $source = catfile(qw(S: n1 cover config.jsp));
my $target = catfile(qw(S: temp config.jsp));

print header('text/plain');

if ( copy $source => $target ) {
    print "'$source' was copied to '$target'\n";
}
else {
    print "'$source' was not copied to '$target'\n";
    # you can use die if you want the error message to
    # go to the error log and an "Internal Server Error"
    # to be shown to the web site visitor.
    # die "'$source' was not copied to '$target'\n";
}

보다 CGI 기능 지향 인터페이스 가져 오기 목록의 경우.

다른 팁

stderr를 stdout 스트림으로 보내고 있습니까? 모든 인쇄물은 HTML 출력을 고려할 때 브라우저에 연결된 STDOUT에 도착합니다.

하지만, die Stderr 스트림에 씁니다. 이것은 브라우저 창이 아니라 어떤 종류의 오류 로그로 갈 수 있습니다. 어디로 가고 있는지에 대해서는 Perl이 내부에서 실행되는 것에 따라 다릅니다.

확인하는 한 가지 방법은 print 대신 뭔가 dieing or 절.

그래서 몇 가지 질문 :

  1. 어떻게 실행하고 있습니까?
  2. 명령 줄에있는 경우 정확한 명령을 보여주십시오.
  3. 어떤 종류의 웹 서버에 있으면, 우리가 당신을 위해 로그를 찾을 수 있도록 어느 것을 알려주십시오.

die 스크린이 아닌 웹 서버의 오류 로그에있는 메시지를 stderr로 보냅니다. 오류 처리를 더 잘 제어하거나 설치할 수있는 CGI 모듈이 있습니다. $SIG{__DIE__} 핸들러 (당신이 그것이 무엇인지 모르고 걱정하지 않는다면, 당신은 필요하지 않습니다), CGI 스크립트를 디버깅하는 빠른 방법을 원할 때, 나는 이것을 상단에 놓았습니다. 대본의 :

    #! /usr/bin/perl
    $src = join'',<DATA>;
    eval $src;
    print "Content-type: text/plain\n\n$@\n" if $@;
    __END__
    ... my cgi script starts here ...

스크립트를 변수로로드합니다 eval 해당 변수의 내용에서 Perl 통역사를 실행하고 유효한 헤더로 표준 출력 (브라우저 창)에 오류를 인쇄합니다.

copy("s:\\nl\\cover\\config.jsp", "s:\\temp\\config.jsp") 
     or die "File cannot be copied.";
print "this is not displayed";

이러한 메시지 중 하나만 표시해야하며 무엇을 요구하는지 불분명합니다.

질문 말한다 왜 그런지 궁금합니다 die 메시지가 표시되지 않습니다. 나에게, 그것은 당신이 "파일을 복사 할 수 없다"는 메시지를 보지 못한다는 것을 의미합니다. 그리고 이것에 대한 가장 분명한 이유는 사본 조작이 성공하기 때문입니다. 그러나 CGI에서 실행중인 경우 오류 로그를 보는 것에 대한 이전 응답도 참조하십시오.

그러나 메시지의 텍스트는 실제로 "이것은 표시되지 않습니다"라는 메시지를 보지 못한다는 것을 암시합니다. (왜 다른 것이 표시되지 않는다고 언급 하시겠습니까?)이 경우, 당신이 그것을보고 있지 않은 이유는 때문입니다. die 프로그램이 종료됩니다. 후 copy 실패하고 die 실행, 귀하의 프로그램은 죽었습니다. 종료. 그것은이 필멸의 CPU를 섞어 스택에 합류했습니다. 그렇지 않을 것입니다 print "this is not displayed" 당신이 그것을 통해 4 백만 볼트를 넣으면. 전 프로세스입니다.

코드를 편집 한 후, 당신의 다이는 명령으로 간주되며 아마도 탈출해야한다는 것이 분명합니다. 스택 오버플로에서 파란색으로 렌더링되는 방법에 유의하십시오 (키워드임을 나타냅니다). 동의어로 전환하십시오 "shutdown" 대신에.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top