Solution au problème selon lequel nginx ne trouve pas le fichier php : 1. Placez l'instruction racine dans le bloc serveur afin que chaque emplacement hérite du documentroot défini par le bloc serveur parent ; 2. nginx intercepte les fichiers inexistants ; et utilise [try_files] Récupère les URL inexistantes et renvoie une erreur.
nginx ne trouve pas la solution au fichier php :
1 Le mauvais chemin est envoyé. Lorsqu'on va dans le processus php-fpm
et que ce genre d'erreur se produit, neuf fois sur dix c'est le processus backend fastcgi qui reçoit le mauvais chemin (SCRIPT_FILENAME), et la raison pour laquelle le backend fastcgi reçoit le mauvais chemin, principalement en raison d'erreurs de configuration.
La configuration courante de nginx.conf est la suivante :
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; } }
Il y a beaucoup de choses déraisonnables dans cette configuration. L'un des problèmes évidents est que la commande racine est placée dans le bloc location /
. . Si la directive racine est définie dans un bloc d'emplacement, la directive racine ne peut prendre effet qu'à l'emplacement où elle se trouve. Il n'y a pas de directive racine dans d'autres emplacements. Par exemple, le bloc location /images ne correspondra à aucune requête. Vous devez configurer la directive racine à plusieurs reprises dans chaque requête pour résoudre ce problème.
Par conséquent, nous devons mettre la directive racine dans le bloc server
, afin que chaque emplacement hérite de la racine du document définie par le bloc du serveur parent si un emplacement doit définir une racine de document différente, s'il s'agit d'un emplacement. doit définir un Pour différentes document_roots, vous pouvez définir une directive racine distincte dans l'emplacement.
Un autre problème est que les paramètres fastCGI SCRIPT_FILENAME
sont codés en dur. Si la valeur de la directive racine est modifiée ou si le fichier est déplacé vers un autre répertoire, php-fpm renverra l'erreur "Aucun fichier d'entrée spécifié", car SCRIPT_FILENAME
est codé en dur dans la configuration et ne change pas avec le changement. de $doucument_root
. On peut modifier la configuration SCRIPT_FILENAME comme suit :
fastcgi_param SCRIPT_FILENAME documentrootdocumentrootfastcgi_script_name;
On ne peut donc pas oublier de configurer la commande root dans le bloc serveur, sinon la valeur de documentroot sera vide, et seule la valeur de documentroot sera vide. Passez fastcgi_script_name
à php-fpm, ce qui provoquera l'erreur "Aucun fichier d'entrée spécifié".
2. Le fichier demandé n'existe vraiment pas
Quand nginx reçoit une requête pour un fichier .php qui n'existe pas, car nginx uniquement, il vérifiera si $uri se termine par .php et ne jugera pas si le fichier existe. Les requêtes qui se terminent par .php nginx seront directement envoyées à php-fpm pour traitement. Si le fichier est introuvable lors du traitement php-fpm, il renverra "Aucun fichier d'entrée spécifié" avec un en-tête "404 Not Found".
Solution
Nous interceptons les fichiers inexistants dans nginx, demandons et renvoyons une erreur 404 personnalisée
Utilisez try_files
pour capturer des URL inexistantes et renvoyer des erreurs.
location ~ .php$ { try_files $uri =404; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME .... ................................... ................................... }
La configuration ci-dessus vérifiera si le fichier .php existe. S'il n'existe pas, une page 404 sera renvoyée.
Recommandations d'apprentissage associées : Programmation PHP de l'entrée à la maîtrise
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!