nginx가 PHP 파일을 찾을 수 없는 이유에 대한 해결 방법: 1. 각 위치가 상위 서버 블록에 의해 정의된 문서 루트를 상속하도록 서버 블록에 루트 명령을 배치합니다. 2. nginx는 존재하지 않는 파일을 가로채고 [try_files]를 사용하여 존재하지 않는 파일을 캡처하고 오류를 반환합니다.
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의 값만 비어 있게 됩니다.
2. 요청한 파일이 실제로 존재하지 않습니다. nginx가 존재하지 않는 .php 파일에 대한 요청을 받으면 nginx는 $uri가 .php로 끝나는지 여부만 확인하고 파일이 .php로 끝나는지 확인하지 않기 때문입니다. 파일이 존재하는지 판단한 후 nginx는 처리를 위해 .php로 끝나는 요청을 php-fpm으로 직접 보냅니다. php-fpm 처리 중에 파일을 찾을 수 없으면 "404 Not Found" 헤더와 함께 "지정된 입력 파일 없음"이 반환됩니다. 해결책우리는 nginx에서 존재하지 않는 파일을 가로채서 사용자 정의 404 오류를 요청하고 반환합니다.존재하지 않는 URL을 캡처하고 오류를 반환하려면fastcgi_script_name
만 php-fpm에 전달되어 "지정된 입력 파일 없음" 오류가 발생합니다.try_files
를 사용하세요. rrreee위 구성은 .php 파일이 존재하는지 확인합니다. 존재하지 않으면 404 페이지가 반환됩니다. 관련 학습 권장 사항: 초보부터 마스터까지 PHP 프로그래밍위 내용은 nginx가 PHP 파일을 찾을 수 없으면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!