web-dev-qa-db-fra.com

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

J'installe un site Web dans une gouttelette (Digital Ocean). J'ai un problème pour installer NGINX avec PHP correctement. 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 je essayez de lancer un fichier .php, il est juste en train de le télécharger ... par exemple ... http://5.101.99.123/info.php ça marche mais ... Si je vais au http://5.101.99.123 principal, c'est en train de 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
            }

... Les autres "location" sont commentés (#)

102
Apeiron

Essaye ça:

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

  2. Décommentez les deux lignes d’écoute pour que nginx écoute sur les ports 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. Laissez server_name seul

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

    root /usr/share/nginx/www;
    index index.php index.html index.htm;
    
  5. Uncomment 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. Éditez /etc/php5/fpm/php.ini et assurez-vous que cgi.fix_pathinfo est défini sur 0

  7. Redémarrez nginx et php5-fpm (si vous ne savez pas comment faire, redémarrez le serveur)


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

101
Jack M.

Vous devez ajouter ceci à/etc/nginx/sites-enabled/default pour exécuter les fichiers php sur Nginx Server:

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;
    }
}
35
rootx

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

19
np8

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

11
M Arfan

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 PHP5

Changement

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

à

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

2) Configurez 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) services de redémarrage

FPM

php5 Sudo service php5-fpm restart

php7 Sudo service php7.0-fpm restart

NGINX

Sudo service nginx restart
6
Sharif El Shobkshy

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

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

Alors je suis allé dans le fichier de configuration et sur la dernière ligne il y avait 

#}

Je ne commentais pas, exécutais à nouveau la commande de test et cela fonctionnait

6

Pour moi, il a été utile d’ajouter ?$query_string à la fin de /index.php, comme ci-dessous:

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

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

  1. nginx est un navigateur web (et non un navigateur application) et ne peut donc servir que des pages statiques.
  2. chaque fois que nous essayons de restituer/retourner un fichier .php, par exemple index.php, nginx ne sait pas quoi faire, car il ne comprend tout simplement pas un fichier .php (ni d'ailleurs extension en dehors de quelques uns choisis comme .html, .js etc. qui sont des fichiers statiques)
  3. Ainsi, afin d’exécuter d’autres types de fichiers, nous avons besoin de quelque chose entre nginx et l’application (ici l’application php). C'est ici 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 tous les langages possibles Python (uWSGI), PHP (FPM) et même C. FastCGI est fondamentalement une version mise à niveau 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 d'un CGI.

Ce lien Digital Ocean , explique très bien les étapes à suivre 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, les autres réponses à mon humble avis étant plutôt bonnes.

2
coda

La réponse ci-dessus semblait trop commenter pour 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 le dimanche après-midi (c:

2

Dans mon cas, je n'utilisais pas /etc/nginx/sites-available/default J'utilisais un fichier de configuration de bloc de serveur différent (par exemple, exemple.com), et le seul moyen de résoudre ce problème consiste à 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
Waqleh

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;

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

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

1

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

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

0
Dongato

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

J'avais eu le même problème ce qui a été résolu ce bloc serveur ont également ce bloc au-dessus des autres blocs d'emplacement si vous avez des problèmes de chargement css. Ce que j'ai ajouté à mon fichier conf 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
Alex M

Voilà donc ce qui a finalement fonctionné dans mon cas en tant que règles de réécriture où le coupable
J'ai modifié les règles de réécriture de nginx comme suit.

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

devient...

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

Apparemment, sans le mot-clé last , la demande n’a pas été relancée; elle n’a donc jamais atteint le segment de position .php; elle a simplement été interprétée comme un téléchargement -

0
Olubodun Agbalaya

Si quelque chose ne vous aide pas. Et peut-être avez-vous précédemment installé Apache2 avec le fichier de test info.php. Il suffit d'effacer App Data (cache, cookie) pour localhost.

0
Al Che

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

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

0
Ivan

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, posté ici, donc dans le 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 ni sites activés ni sites disponibles, vous pouvez modifier en conséquence).

  • Editez le paramètre location 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 Nginx et les services PHP Sudo systemctl restart php-fpm et Sudo systemctl restart nginx.

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

J'espère que ce codage utile et heureux

0
SonDang

J'étais sur le point d'essayer de résoudre ce problème, pour moi le problème était que Cloudflare avait mis en cache le fichier php et continuait à me faire le télécharger.

La solution pour moi était de purger le cache sur Cloudflare.

0
KristinnVikarJ

J'ai résolu mon problème maintenant avec ce code (changez votre 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
André Bastos

Vous devez d'abord Remove cache dans 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 fichier default:

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;
    }
}

Si tout ne correspond pas, corrigez et redémarrez Nginx à partir du terminal à l'aide de la commande suivante

Sudo systemctl redémarrer nginx

Ensuite, allez au navigateur et profitez ...

0
Sanaulla

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

0
IslamTaha