>  기사  >  백엔드 개발  >  nginx가 PHP 파일을 찾을 수 없으면 어떻게 해야 합니까?

nginx가 PHP 파일을 찾을 수 없으면 어떻게 해야 합니까?

coldplay.xixi
coldplay.xixi원래의
2020-07-22 10:08:474178검색

nginx가 PHP 파일을 찾을 수 없는 이유에 대한 해결 방법: 1. 각 위치가 상위 서버 블록에 의해 정의된 문서 루트를 상속하도록 서버 블록에 루트 명령을 배치합니다. 2. nginx는 존재하지 않는 파일을 가로채고 [try_files]를 사용하여 존재하지 않는 파일을 캡처하고 오류를 반환합니다.

nginx가 PHP 파일을 찾을 수 없으면 어떻게 해야 합니까?

nginx는 php 파일에 대한 해결책을 찾을 수 없습니다:

1. php-fpm 프로세스에 잘못된 경로가 전송되었습니다.

이런 종류의 오류가 발생하면 10개 중 9개가 돌아옵니다. -end fastcgi 프로세스가 잘못된 경로(SCRIPT_FILENAME)를 수신하는데, 백엔드 fastcgi가 잘못된 경로를 수신하는 이유는 대부분 구성 오류 때문입니다.

일반적인 nginx.conf 구성은 다음과 같습니다.

server {
    listen   [::]:80;
    server_name  example.com www.example.com;
    access_log  /var/www/logs/example.com.access.log;  
    location / {
        root   /var/www/example.com;
        index  index.html index.htm index.pl;
    }
    location /images {
        autoindex on;
    }
    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/example.com$fastcgi_script_name;
        include fastcgi_params;
    }
}

이 구성에는 불합리한 점이 많습니다. 명백한 문제 중 하나는 루트 지시문이 location / 블록에 배치된다는 것입니다. 루트 지시문이 위치 블록에 정의된 경우 루트 지시문은 해당 위치에서만 적용될 수 있습니다. 예를 들어, location /images 블록은 어떤 요청과도 일치하지 않습니다. 이 문제를 해결하려면 각 요청에서 루트 지시문을 반복적으로 구성해야 합니다. location / 块。如果root指令被定义在location块中那么该root指令只能对其所在的location生效。其它locaiont中没有root指令,像 location /images块不会匹配任何请求,需要在每个请求中重复配置root指令来解决这个问题。

因此我们需要把root指令放在server块,这样各个 location就会继承父server块定义的documentroot,如果某个location需要定义一个不同的documentroot,如果某个location需要定义一个不同的document_root,则可以在location单独定义一个root指令。

另一个问题就是fastCGI参数SCRIPT_FILENAME是写死的。如果修改了root指令的值或者移动文件到别的目录,php-fpm会返回“No input file specified”错误,因为SCRIPT_FILENAME在配置中是写死的并没有随着$doucument_root变化而变化,我们可以修改 SCRIPT_FILENAME配置如下:

fastcgi_param  SCRIPT_FILENAME  documentrootdocumentrootfastcgi_script_name;

 

所以我们不能忘记在server块中配置root指令,不然documentroot的值为空,只会传documentroot的值为空,只会传fastcgi_script_name到php-fpm,这样就会导致“No input file specified”错误。

 

二、请求的文件真的不存在

当nginx收到一个不在的.php文件的请求时,因为nginx只会检查$uri是否是.php结尾,不会对文件是否存在进行判断,.php结尾 的请求nginx会直接发给php-fpm处理。php-fpm处理时找不到文件就会返回“No input file specified”带着“404 Not Found”头。

解决办法

我们在nginx拦截不存在的文件,请求并返回自定义404错误

使用 try_files

따라서 각 위치가 상위 서버 블록에 의해 정의된 문서 루트를 상속하도록 server 블록에 루트 지시어를 넣어야 합니다. 다른 document_root의 경우 위치에 별도의 루트 지시문을 정의할 수 있습니다.

또 다른 문제는 fastCGI 매개변수 SCRIPT_FILENAME이 하드코딩되어 있다는 것입니다. 루트 지시문의 값을 수정하거나 파일을 다른 디렉터리로 이동하면 SCRIPT_FILENAME이 구성에 하드 코딩되어 있고 따르지 않기 때문에 php-fpm은 "입력 파일이 지정되지 않았습니다" 오류를 반환합니다. $document_root는 변경 사항에 따라 변경됩니다. SCRIPT_FILENAME 구성을 다음과 같이 수정할 수 있습니다.
location ~ .php$ {
 try_files $uri =404;
 fastcgi_pass 127.0.0.1:9000;
 fastcgi_index index.php;
 fastcgi_param SCRIPT_FILENAME ....
 ...................................
 ...................................
}

따라서 서버 블록에서 루트 명령을 구성하는 것을 잊지 마세요. 그렇지 않으면 documentroot의 값이 비어 있고 documentroot의 값만 비어 있게 됩니다. fastcgi_script_name만 php-fpm에 전달되어 "지정된 입력 파일 없음" 오류가 발생합니다.

🎜🎜🎜 2. 요청한 파일이 실제로 존재하지 않습니다. 🎜🎜🎜 nginx가 존재하지 않는 .php 파일에 대한 요청을 받으면 nginx는 $uri가 .php로 끝나는지 여부만 확인하고 파일이 .php로 끝나는지 확인하지 않기 때문입니다. 파일이 존재하는지 판단한 후 nginx는 처리를 위해 .php로 끝나는 요청을 php-fpm으로 직접 보냅니다. php-fpm 처리 중에 파일을 찾을 수 없으면 "404 Not Found" 헤더와 함께 "지정된 입력 파일 없음"이 반환됩니다. 🎜🎜해결책🎜🎜우리는 nginx에서 존재하지 않는 파일을 가로채서 사용자 정의 404 오류를 요청하고 반환합니다.🎜🎜존재하지 않는 URL을 캡처하고 오류를 반환하려면 try_files를 사용하세요. 🎜rrreee🎜위 구성은 .php 파일이 존재하는지 확인합니다. 존재하지 않으면 404 페이지가 반환됩니다. 🎜🎜🎜관련 학습 권장 사항: 🎜초보부터 마스터까지 PHP 프로그래밍🎜🎜🎜

위 내용은 nginx가 PHP 파일을 찾을 수 없으면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.