Nginx sert les fichiers .php en tant que téléchargements, au lieu de les exécuter


151

J'installe un site Web dans une gouttelette (Digital Ocean). J'ai un problème pour installer correctement NGINX avec PHP. J'ai fait un tutoriel https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-on-ubuntu-14-04 mais quand j'essaie d'en exécuter .php c'est juste en train de le télécharger ... par exemple ... http://5.101.99.123/info.phpça marche mais ... Si je vais à la page principale http://5.101.99.123c'est télécharger mon index.php: /

Une idée?

-rw-r--r--  1 agitar_user www-data   418 Jul 31 18:27 index.php
-rw-r--r--  1 agitar_user www-data    21 Aug 31 11:20 info.php

Mon / etc / nginx / sites-available / default

server {
        listen 80 default_server;
        listen [::]:80 default_server ipv6only=on;

        root /var/www/html;
        index index.html index.htm index.php;

        # Make site accessible from http://localhost/
        server_name agitarycompartir.com;

               location ~ \.php$ {
                    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    #               # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
    #
    #               # With php5-cgi alone:
    #               fastcgi_pass 127.0.0.1:9000;
    #               # With php5-fpm:
                    fastcgi_pass unix:/var/run/php5-fpm.sock;
                    fastcgi_index index.php;
                    include fastcgi_params;
            }


              location / {

                    try_files $uri $uri/ =404;
                    # Uncomment to enable naxsi on this location
                    # include /etc/nginx/naxsi.rules
            }

... D'autres "localisation" sont commentés (#)


4
Oui ... vous n'avez pas configuré correctement PHP-FPM avec Nginx. C'est tout ce que nous pouvons vous dire puisque vous ne nous avez montré aucune de vos configurations.
Brad

quel fichier voulez-vous voir? Merci @Brad
Apeiron

Quel que soit le fichier (ou les fichiers) dans lequel vous mettez votre configuration. La partie pertinente étant ... où vous avez configuré PHP-FPM dans votre configuration Nginx.
Brad

2
après environ une heure de recherche sur Google, j'ai trouvé ce askubuntu.com/a/601996/89455 - si vous aviez une mauvaise configuration avant d'essayer de vider le cache - a fonctionné ici!
tm_lv

1
Voir une question / réponse similaire pour PHP7 sur stackoverflow.com/q/42664080/287948
Peter Krauss

Réponses:


131

Essaye ça:

  1. Éditer /etc/nginx/sites-available/default

  2. Décommentez les deux lignes d'écoute pour que nginx écoute sur le port 80 IPv4 et IPv6.

    listen   80; ## listen for ipv4; this line is default and implied
    listen   [::]:80 default_server ipv6only=on; ## listen for ipv6
  3. Laisser server_nametranquille

    # Make site accessible (...)
    server_name localhost;
  4. Ajouter index.phpà la indexligne

    root /usr/share/nginx/www;
    index index.php index.html index.htm;
  5. Décommenter location ~ \.php$ {}

    # pass the PHP scripts to FastCGI server listening on (...)
    #
    location ~ \.php$ {
            try_files $uri =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
    
            # With php5-cgi alone:
            #fastcgi_pass 127.0.0.1:9000;
            # With php5-fpm:
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            fastcgi_index index.php;
            include fastcgi_params;
    }
  6. Modifiez /etc/php5/fpm/php.iniet assurez-vous qu'il cgi.fix_pathinfoest défini sur0

  7. Redémarrez nginx et php5-fpm sudo service nginx restart && sudo service php5-fpm restart


Je viens de commencer à utiliser Linux il y a une semaine, donc j'espère vraiment vous aider à ce sujet. J'utilise l'éditeur de texte nano pour éditer les fichiers. lancez apt-get install nano si vous ne l'avez pas. Google dessus pour en savoir plus.


14
service nginx restart && service php5-fpm restart
Duke

8
nginx -s reload
Duke

2
avec PHP7-fpm est: service php7.0-fpm restart
Alex

1
@Joy, j'ai essayé votre suggestion mais cela n'a pas fonctionné. J'ai dû utiliser fastcgi_pass unix: /run/php/php7.0-fpm.sock;
jdstaerk

1
Pour php7.2: unix:/var/run/php5-fpm.sock;convertir en unix:/var/run/php/php7.2-fpm.sock;(un autre nidification /php)
Oleg Reym

50

Vous devez l'ajouter à / etc / nginx / sites-enabled / default pour exécuter les fichiers php sur le serveur Nginx:

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    root /usr/share/nginx/html;
    index index.php index.html index.htm;

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

Qu'est-ce que SCRIPT_FILENAME?
mp3por

2
Si vous utilisez PHP 7.0, alors ceci est correct:fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
Andrew Fox

1
@ AndrewFox- mon nom est php7.0-fpm.pidet non php7.0-fpm.sockdans /var/run/php/ ce que cela veut dire?
vsync

@vsync essayez-le. sudo service php7.0-fpm restart. si la chaussette est manquante, cela indique que le processus php est en cours d'exécution.
zhisme

1
@Pathros - J'ai trouvé que wordpress (dans mon cas) a des fichiers de configuration du serveur dans un autre dossier, et ce sont ceux qui devaient être modifiés/etc/nginx/conf.d/wordpress_https.conf
vsync

43

J'ai eu un problème similaire qui a été résolu en vidant le cache du navigateur (a également bien fonctionné avec un navigateur différent).


5
Je pense que le redémarrage et le mode incognito m'ont aidé. Merci beaucoup pour la noblesse que nous pouvons faire.
Swapnil Mhaske

4
Merci beaucoup. Vous avez sauvé ma journée) Également +1 pour la navigation privée!
Eddie

3
Cela l'a fait pour moi, même après des heures à essayer beaucoup d'autres solutions suggérées.
Kleag

1
C'était étrange pour moi que mon site fonctionne sur IE et Chrome alors que dans Mozilla, il a téléchargé le site au lieu de l'exécuter. C'était la faute du cache de Mozilla.
Viktor Joras

3
Tu as sauvé mon temps mon frère.
Amir Kaftari

12

Mettez à jour nginx config / etc / nginx / sites-available / default ou votre fichier de configuration

si vous utilisez php7, utilisez ceci

    location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/run/php/php7.0-fpm.sock;      
    }

si vous utilisez php5, utilisez ceci

    location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/run/php/php5-fpm.sock;
            fastcgi_index index.php;
            include fastcgi_params;
    }

Visitez ici pour plus de détails Détails ici


J'ai essayé que cela ne fonctionne pas pour moi, j'utilise ubuntu 14.04 et php 7.0 comment puis-je résoudre ce problème?
Kishore

ci-dessus le lien partagé "détail complet" est rompu
Kishore

Que signifie include snippets/fastcgi-php.conf;?
Timo

9

Je vois beaucoup de solutions ci-dessus et beaucoup ont fonctionné correctement pour moi, mais je ne comprenais pas ce qu'elles faisaient et je craignais de simplement copier-coller le code, en particulier, fastcgi . Alors voici mes 2 cents,

  1. nginx est un serveur Web (et non un serveur d'applications ) et ne peut donc servir que des pages statiques.
  2. chaque fois, nous essayons de rendre / renvoyer un fichier .php, par exemple index.php, nginx ne sait pas quoi faire, car il ne peut tout simplement pas comprendre un fichier .php (ou d'ailleurs toute extension à part quelques comme .html, .js etc. qui sont des fichiers statiques)
  3. Ainsi, pour exécuter d'autres types de fichiers, nous avons besoin de quelque chose qui se trouve entre nginx et l'application (ici l'application php). C'est là qu'intervient l'interface de passerelle commune (CGI). C'est un logiciel qui gère cette communication. Les CGI peuvent être implémentés dans n'importe quel langage Python (uWSGI), PHP (FPM) et même C. FastCGI est essentiellement une version améliorée de CGI qui est beaucoup plus rapide que CGI.

Pour certains serveurs comme Apache, il existe un support intégré pour interpréter PHP et donc pas besoin de CGI.

Ce lien océanique numérique explique assez bien les étapes pour installer FPM et je n'écris pas les étapes nécessaires pour résoudre le problème du téléchargement des fichiers php au lieu du rendu puisque les autres réponses à mon humble avis sont plutôt bonnes.


Bel expliquant. Merci.
Jon

1
nginx est un serveur Web et non un navigateur, veuillez le réparer.
Geeocode

8

J'ai eu le même problème et aucune des réponses n'a résolu le problème.

L'Iran:

sudo nginx -t

pour tester le fichier de configuration dans / etc / nginx / sites-available / default.

Cela m'a donné ces erreurs:

nginx: [emerg] unexpected end of file, expecting "}" in /etc/nginx/sites-enabled/default:115
nginx: configuration file /etc/nginx/nginx.conf test failed

Je suis donc entré dans le fichier de configuration et sur la dernière ligne, il y avait

#}

J'ai décommenté, exécuté à nouveau la commande de test et cela a fonctionné


Belle touche pour inclure la syntaxe de la commande de test en plus d'un conseil pour résoudre le problème.
greybeard

7

Cela a fonctionné pour moi.

1) Fichier MyApp

vi / etc / nginx / sites-available / myApp

server {
  listen 80;
  listen [::]:80;

  root /var/www/myApp;
  index index.php index.html index.htm;

  location ~ \.php$ {
      try_files $uri =404;
      fastcgi_split_path_info ^(.+\.php)(/.+)$;
      fastcgi_pass unix:/run/php/php7.0-fpm.sock;
      fastcgi_index index.php;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
          include fastcgi_params;
      }
}

Utilisateurs de PHP5

Changement

fastcgi_pass unix:/run/php/php7.0-fpm.sock;

à

fastcgi_pass unix:/var/run/php5-fpm.sock;

2) Configurer cgi.fix_pathinfo

Définissez cgi.fix_pathinfo sur 0

Emplacement:

PHP5 /etc/php5/fpm/php.ini

PHP7 /etc/php/7.0/fpm/php.ini


3) Redémarrer les services

FPM

php5 sudo service php5-fpm restart

php7 sudo service php7.0-fpm restart

NGINX

sudo service nginx restart

fastcgi_pass unix: /run/php/php7.0-fpm.sock; est incorrect. Ce devrait être /var/run/php/php7.0-fpm.sock; et vous devez mettre à jour la version php spécifiée avec tout ce que vous avez installé, par exemple: /var/run/php/php7.2-fpm.sock;
VanAlbert

4

Pour moi, cela m'a aidé à ajouter ?$query_stringà la fin de /index.php, comme ci-dessous:

location / {
        try_files $uri $uri/ /index.php?$query_string;
}

3

Si l'une des réponses proposées ne fonctionne pas, essayez ceci:

1. corrigez www.conf dans etc / php5 / fpm / pool.d:

listen = 127.0.0.1:9000;(delete all line contain listen= )

2. corriger nginx.conf dans usr / local / nginx / conf:

remove server block server{} (if exist) in block html{} because we use server{} in default (config file in etc/nginx/site-available) which was included in nginx.conf.

3. corriger le fichier par défaut dans etc / nginx / site-available

location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi_params; }

4. redémarrer le service nginx

redémarrage du service sudo nginx

5. redémarrer le service php

redémarrage du service php5-fpm

6. profiter

Créez n'importe quel fichier php dans / usr / share / nginx / html et exécutez-le dans "nom_serveur / nom_fichier.php" (nom_serveur dépend de votre configuration, normalement est localhost, nom_fichier.php est le nom du fichier créé dans / usr / share / nginx / html).

J'utilise Ubuntu 14.04


2

La réponse ci-dessus semblait trop commenter la solution que j'ai trouvée. Voici à quoi ressemblait mon fichier:

/ etc / nginx / sites-available / default

location ~ \.php$ {
# fastcgi_split_path_info ^(.+\.php)(/.+)$;
# # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
#
# # With php5-cgi alone:
# fastcgi_pass 127.0.0.1:9000;
# With php5-fpm:
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}

J'espère que cela aidera certaines personnes frustrées un dimanche après-midi (c:


2
server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    root /var/www/html;
    index index.php index.html index.htm;

    location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/run/php/php7.2-fpm.sock;
    }
}

Les extraits ci-dessus ont fonctionné pour moi dans le cas de php7.2


1

Pour tous ceux qui ont le même problème avec PHP 7, voici ce que j'ai fait pour que nginx exécute correctement les fichiers php dans CentOS 7, publié ici donc au cas où quelqu'un aurait le même problème:

  • Suivez pas à pas ce document sur Digital Ocean .

  • Ouvrez le /etc/nginx/conf.d/default.conf(par défaut, je n'ai pas de sites activés ni disponibles, vous pouvez modifier en conséquence).

  • Modifiez le locationparamètre comme ci-dessous:

default.conf :

location ~ \.php$ {
    try_files $uri =404;
    #fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;

    #instruct nginx execute php7 files instead download them :D
    fastcgi_pass unix:/var/run/php-fpm/www.sock;

    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}
  • Redémarrez les services Nginx et PHP sudo systemctl restart php-fpmet sudo systemctl restart nginx.

  • Dernier mais le plus important, effacez le cache du navigateur ou exécutez dans incognito (Chrome)ou Private Browsing (Firefox)etc ...

J'espère que ce codage utile et heureux


1

Ma solution était d'ajouter

    location ~ \.php$ {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;

à mon fichier de configuration personnalisé, par exemple etc/nginx/sites-available/example.com.conf

Ajouter à /etc/nginx/sites-available/defaultn'a pas fonctionné pour moi.


1

Dans mon cas, je n'utilisais pas /etc/nginx/sites-available/defaultJ'utilisais un fichier de configuration de bloc de serveur différent (par exemple, example.com), et la seule façon dont j'ai pu résoudre ce problème est de supprimer le lien symbolique du fichier de configuration de bloc de serveur par défaut:

$ rm /etc/nginx/sites-enabled/default

puis recharger Nginx:

$ sudo systemctl reload nginx

1

J'ai résolu mon problème maintenant avec ce code (changez votre adresse IP):

location / {
access_log off;
    log_not_found  off;
    client_max_body_size    2000m;
    client_body_buffer_size 512k;
    proxy_buffering on;
    proxy_send_timeout 300s;
    proxy_read_timeout 300s;
    proxy_buffer_size 64k;
    proxy_buffers 32 64k;
    proxy_busy_buffers_size 128k;
    proxy_temp_file_write_size 128k;
    proxy_connect_timeout 300s;
    proxy_http_version 1.1;
    proxy_set_header Range "";
    proxy_pass   https://123.123.123.123:444;
    proxy_set_header   Host   $host;
    proxy_set_header   X-Real-IP  $remote_addr;
    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header   X-Forwarded-Proto $scheme;
    proxy_redirect     off;
}

0

Ce qui a fonctionné pour moi avec Ubuntu 16.04 et php7 supprimait cette ligne

fastcgi_split_path_info ^(.+\.php)(/.+)$;

Il a cessé de télécharger les fichiers php après cela.


0

Décommentez l'emplacement .php dans / etc / nginx / sites-available / default

sudo vi / etc / nginx / sites-available / default:

location ~ \.php$ {
            include snippets/fastcgi-php.conf;

            # With php5-cgi alone:
    #       fastcgi_pass 127.0.0.1:9000;
            # With php5-fpm:
            fastcgi_pass unix:/var/run/php5-fpm.sock;
    }

0

Si rien d'autre ne vous aide. Et peut-être plus tôt vous avez installé apache2 avec le fichier de test info.php. Effacez simplement les données d'application (cache, cookie) pour l'hôte local.


0

vérifiez que l'extension de votre fichier de configuration nginx est * .conf.
par exemple: /etc/nginx/conf.d/myfoo.conf

J'ai la même situation. Après avoir renommé mon fichier de configuration de myfoo en myfoo.conf, il a été corrigé. N'oubliez pas de redémarrer nginx après l'avoir renommé.


0

Vous devez d'abord Remove cachedans votre navigateur

Ensuite, ouvrez le terminal et exécutez la commande suivante:

sudo apt-get install php-gettext
sudo nano /etc/nginx/sites-available/default

Ajoutez ensuite le code suivant dans le defaultfichier:

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    root /usr/share/nginx/html;
    index index.php index.html index.htm;

    server_name localhost;

    location / {
        try_files $uri $uri/ =404;
    }

    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

En cas de discordance, il suffit de corriger et de redémarrer Nginx à partir du terminal par la commande suivante

sudo systemctl redémarrer nginx

Ensuite, allez dans le navigateur et profitez ...


0

Pour moi, c'était la ligne: fastcgi_pass unix: /var/run/php5-fpm.sock;

qui devait être simplement: fastcgi_pass unix: /run/php5-fpm.sock;


0

J'étais sur le point de devenir fou en essayant de résoudre ce problème, pour moi, le problème était que Cloudflare avait mis en cache le fichier php et me faisait continuer à le télécharger.

Le correctif pour moi était de purger le cache sur Cloudflare.


peut-être voulez-vous nous dire comment?
Thorsten Staerk le

0

J'avais eu le même problème ce qui a résolu c'était ce bloc de serveur également avoir ce bloc au-dessus d'autres blocs d'emplacement si vous avez des problèmes de chargement de css. Ce que j'ai ajouté à mon fichier de configuration disponible sur les sites.

location ~ [^/]\.php(/|$) {
fastcgi_split_path_info  ^(.+\.php)(/.+)$;
fastcgi_index            index.php;
fastcgi_pass             unix:/var/run/php/php7.3-fpm.sock;
include                  fastcgi_params;
fastcgi_param   PATH_INFO       $fastcgi_path_info;
fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

0

C'est donc ce qui a finalement fonctionné dans mon cas en tant que règles de réécriture où le coupable a
changé les règles de réécriture nginx comme suit.

   location /vendors { rewrite ^/vendors/?$ /vendors.php break; } 

devient...

  location /vendors { rewrite ^/vendors/?$ /vendors.php last; }

Apparemment, sans le dernier mot-clé, la requête n'a pas été redémarrée, elle n'a donc jamais atteint le .phpsegment d'emplacement et a simplement été interprétée comme un téléchargement -


0

pour un enregistrement, j'ai trouvé que mon php-fpm ne fonctionnait pas et je l'ai corrigé avec service php7.2-fpm stop


0

Une dernière chose à vérifier: si vous avez configuré l'accès HTTPS avant de configurer PHP - j'ai utilisé certbot - vous devrez effectuer les modifications dans / etc / nginx / sites-available / default deux fois car il y en aura deux blocs de serveur (un écoutant sur le port 80 et un écoutant sur le port 443).

(J'étais en train de configurer ce serveur principalement pour le courrier électronique et je n'avais aucune utilité pour PHP lorsque j'ai installé nginx pour la première fois, simplement pour exécuter certbot plus facilement.)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.