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