Lösung für das Problem, dass Nginx die PHP-Datei nicht finden kann: 1. Platzieren Sie die Root-Anweisung im Serverblock, sodass jeder Speicherort das vom übergeordneten Serverblock definierte Documentroot erbt. 2. Nginx fängt nicht vorhandene Dateien ab und verwendet [try_files]. Fängt nicht vorhandene URLs ab und gibt einen Fehler zurück.
nginx kann die Lösung für die PHP-Datei nicht finden:
1 Der falsche Pfad wird gesendet Wenn Sie zum php-fpm-Prozess
gehen und diese Art von Fehler auftritt, ist es in neun von zehn Fällen der Backend-FastCGI-Prozess, der den falschen Pfad (SCRIPT_FILENAME) empfängt, und den Grund, warum das Backend Wenn fastcgi den falschen Pfad erhält, liegt dies meist an Konfigurationsfehlern.
Die übliche Konfiguration von nginx.conf lautet wie folgt:
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; } }
Es gibt viele unvernünftige Dinge in dieser Konfiguration. Eines der offensichtlichen Probleme ist, dass der Root-Befehl im location /
-Block platziert ist . Wenn die Root-Direktive in einem Standortblock definiert ist, kann die Root-Direktive nur an dem Ort wirksam werden, an dem sie sich befindet. An anderen Standorten gibt es keine Root-Anweisung. Der Standortblock /images entspricht beispielsweise keiner Anfrage. Um dieses Problem zu lösen, müssen Sie die Root-Anweisung wiederholt konfigurieren.
Daher müssen wir die Root-Direktive in den server
-Block einfügen, damit jeder Standort den vom übergeordneten Serverblock definierten Documentroot erbt. Wenn ein Standort einen anderen Documentroot definieren muss muss eine definieren. Für verschiedene document_roots können Sie eine separate Root-Direktive in location definieren.
Ein weiteres Problem besteht darin, dass die fastCGI-Parameter SCRIPT_FILENAME
fest codiert sind. Wenn der Wert der Root-Direktive geändert oder die Datei in ein anderes Verzeichnis verschoben wird, gibt php-fpm den Fehler „Keine Eingabedatei angegeben“ zurück, da SCRIPT_FILENAME
in der Konfiguration fest codiert ist und sich mit der Änderung nicht ändert von $doucument_root
. Wir können die SCRIPT_FILENAME-Konfiguration wie folgt ändern:
fastcgi_param SCRIPT_FILENAME documentrootdocumentrootfastcgi_script_name;
Wir dürfen also nicht vergessen, den Root-Befehl im Serverblock zu konfigurieren, da sonst der Wert von documentroot lautet leer, und nur der Wert von documentroot wird leer sein. Übergeben Sie fastcgi_script_name
an php-fpm, was den Fehler „Keine Eingabedatei angegeben“ verursacht.
2. Die angeforderte Datei existiert wirklich nicht
Wenn Nginx eine Anfrage für eine .php-Datei erhält, die nicht existiert, weil Nginx Es prüft nur, ob $uri mit .php endet, und beurteilt nicht, ob die Datei vorhanden ist. Anfragen, die mit .php enden, werden von nginx direkt zur Verarbeitung an php-fpm gesendet. Wenn die Datei während der PHP-FPM-Verarbeitung nicht gefunden werden kann, wird „Keine Eingabedatei angegeben“ mit dem Header „404 Not Found“ zurückgegeben.
Lösung
Wir fangen nicht vorhandene Dateien in Nginx ab, fordern einen benutzerdefinierten 404-Fehler an und geben ihn zurück.
Verwenden Sie try_files
, um nicht vorhandene URLs zu erfassen und Fehler zurückzugeben.
location ~ .php$ { try_files $uri =404; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME .... ................................... ................................... }
Die obige Konfiguration prüft, ob die .php-Datei vorhanden ist. Wenn sie nicht vorhanden ist, wird eine 404-Seite zurückgegeben.
Verwandte Lernempfehlungen: PHP-Programmierung vom Einstieg bis zur Beherrschung
Das obige ist der detaillierte Inhalt vonWas soll ich tun, wenn Nginx die PHP-Datei nicht finden kann?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!