Heim >Backend-Entwicklung >PHP-Problem >Was soll ich tun, wenn Nginx die PHP-Datei nicht finden kann?

Was soll ich tun, wenn Nginx die PHP-Datei nicht finden kann?

coldplay.xixi
coldplay.xixiOriginal
2020-07-22 10:08:474298Durchsuche

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.

Was soll ich tun, wenn Nginx die PHP-Datei nicht finden kann?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn