Nginx stellt .php-Dateien als Downloads bereit, anstatt sie auszuführen

151

Ich installiere eine Website in einem Tröpfchen (Digital Ocean). Ich habe ein Problem bei der ordnungsgemäßen Installation von NGINX mit PHP. Ich habe ein Tutorial https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-on-ubuntu-14-04 erstellt, aber wenn ich versuche, einige auszuführen .php-Datei lädt es nur herunter ... zum Beispiel ... http://5.101.99.123/info.phpes funktioniert, aber ... Wenn ich zur Hauptdatei gehe, http://5.101.99.123lädt es meine index.php herunter: /

Irgendeine Idee?

-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

Mein / 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
            }

... Andere "Ort" sind kommentiert (#)

Apeiron
quelle
4
Ja ... Sie haben PHP-FPM mit Nginx nicht richtig eingerichtet. Das ist alles, was wir Ihnen sagen können, da Sie uns keine Ihrer Konfigurationen gezeigt haben.
Brad
Welche Datei möchten Sie sehen? Vielen Dank @Brad
Apeiron
Unabhängig davon, in welcher Datei (oder in welchen Dateien) Sie Ihre Konfiguration ablegen. Der relevante Teil ist ... wo Sie PHP-FPM in Ihrer Nginx-Konfiguration einrichten.
Brad
2
Nach etwa einer Stunde Googeln fand diese askubuntu.com/a/601996/89455 - wenn Sie eine schlechte Konfiguration hatten, bevor Sie versuchen, den Cache zu leeren - hier funktioniert!
tm_lv
1
Siehe ähnliche Frage / Antwort für PHP7 unter stackoverflow.com/q/42664080/287948
Peter Krauss

Antworten:

131

Versuche dies:

  1. Bearbeiten /etc/nginx/sites-available/default

  2. Kommentieren Sie beide Abhörzeilen aus, damit Nginx Port 80 IPv4 und IPv6 abhört.

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

    # Make site accessible (...)
    server_name localhost;
  4. index.phpZur indexZeile hinzufügen

    root /usr/share/nginx/www;
    index index.php index.html index.htm;
  5. Kommentar 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. Bearbeiten /etc/php5/fpm/php.iniund sicherstellen, dass auf eingestellt cgi.fix_pathinfoist0

  7. Starten Sie nginx und php5-fpm neu sudo service nginx restart && sudo service php5-fpm restart


Ich habe gerade vor einer Woche angefangen, Linux zu verwenden, also hoffe ich wirklich, Ihnen dabei zu helfen. Ich benutze den Nano-Texteditor, um die Dateien zu bearbeiten. Führen Sie apt-get install nano aus, wenn Sie es nicht haben. Google darauf, um mehr zu erfahren.

Jack M.
quelle
14
service nginx restart && service php5-fpm restart
Herzog
8
nginx -s reload
Herzog
2
mit PHP7-fpm ist: Service php7.0-fpm Neustart
Alex
1
@Joy, habe deinen Vorschlag ausprobiert, aber es hat nicht funktioniert. Musste fastcgi_pass unix verwenden: /run/php/php7.0-fpm.sock;
jdstaerk
1
Für php7.2: unix:/var/run/php5-fpm.sock;konvertieren zu unix:/var/run/php/php7.2-fpm.sock;(eine weitere Verschachtelung /php)
Oleg Reym
49

Sie müssen dies zu / etc / nginx / sites-enabled / default hinzufügen, um PHP-Dateien auf Nginx Server auszuführen:

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;
    }
}
rootx
quelle
Was ist SCRIPT_FILENAME?
mp3por
2
Wenn Sie PHP 7.0 verwenden, dann ist dies richtig:fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
Andrew Fox
1
@ AndrewFox- mein Dateiname ist php7.0-fpm.pidund nicht php7.0-fpm.sockin /var/run/php/ was bedeutet das?
vsync
@vsync versuchen Sie es. sudo service php7.0-fpm restart. Wenn die Socke fehlt, zeigt dies an, dass der PHP-Prozess ausgeführt wird.
Zhisme
1
@Pathros - Ich habe festgestellt, dass WordPress (in meinem Fall) Server-Konfigurationsdateien in einem anderen Ordner hat, und diese mussten bearbeitet werden /etc/nginx/conf.d/wordpress_https.conf
vsync
43

Ich hatte ein ähnliches Problem, das durch Leeren des Browser-Cache behoben wurde (funktionierte auch gut mit anderen Browsern).

np8
quelle
5
Ich denke, der Neustart und der Inkognito-Modus haben mir geholfen. Vielen Dank für die Noobness, die wir tun können.
Swapnil Mhaske
4
Vielen Dank. Du hast meinen Tag gerettet) Auch +1 für Inkognito!
Eddie
3
Dies machte es für mich, auch nach stundenlangem Ausprobieren vieler anderer Lösungsvorschläge.
Kleag
1
Es war seltsam für mich, dass meine Site mit IE und Chrome funktionierte, während sie in Mozilla die Site herunterlud, anstatt sie auszuführen. Es war Mozillas Cache-Fehler.
Viktor Joras
3
Du hast mir Zeit gespart, Bruder.
Amir Kaftari
12

Aktualisieren Sie nginx config / etc / nginx / sites-available / default oder Ihre Konfigurationsdatei

Wenn Sie PHP7 verwenden, verwenden Sie diese

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

Wenn Sie PHP5 verwenden, verwenden Sie dies

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

Besuchen Sie hier für vollständige Details Details hier

M Arfan
quelle
Ich habe versucht, dass dies bei mir nicht funktioniert hat. Ich verwende Ubuntu 14.04 und PHP 7.0. Wie kann ich dieses Problem beheben?
Kishore
oben geteilter Link "komplettes Detail" ist kaputt
Kishore
Was bedeutet include snippets/fastcgi-php.conf;?
Timo
9

Ich sehe oben viele Lösungen und viele haben für mich richtig funktioniert, aber ich habe nicht verstanden, was sie taten, und war besorgt, nur den Code zu kopieren, insbesondere fastcgi . Also hier sind meine 2 Cent,

  1. nginx ist ein Webserver (und kein Anwendungsserver ) und kann daher nur statische Seiten bedienen.
  2. Wann immer wir versuchen, eine .php-Datei zu rendern / zurückzugeben, zum Beispiel index.php, weiß nginx nicht, was zu tun ist, da es eine .php- Datei (oder eine Erweiterung außer einigen wenigen) einfach nicht verstehen kann wie .html, .js usw., die statische Dateien sind)
  3. Um andere Arten von Dateien ausführen zu können, benötigen wir also etwas, das sich zwischen nginx und der Anwendung befindet (hier die PHP-Anwendung). Hier kommt die Common Gateway Interface (CGI) ins Spiel. Es ist eine Software, die diese Kommunikation verwaltet. CGIs können in jeder möglichen Sprache Python (uWSGI), PHP (FPM) und sogar C implementiert werden. FastCGI ist im Grunde eine aktualisierte Version von CGI, die viel schneller als CGI ist.

Für einige Server wie Apache ist die Unterstützung für die Interpretation von PHP integriert, sodass kein CGI erforderlich ist.

Dieser digitale Ozeanlink erklärt die Schritte zur Installation von FPM ziemlich gut und ich schreibe nicht die Schritte, die erforderlich sind, um das Problem des Herunterladens von PHP-Dateien anstelle des Renderns zu lösen, da die anderen Antworten meiner Meinung nach ziemlich gut sind.

Koda
quelle
Netter Erklärer. Vielen Dank.
Jon
1
nginx ist ein Web - SERVER nicht Browser, bitte es beheben.
Geeocode
8

Ich hatte das gleiche Problem und keine der Antworten löste das Problem.

Ich rannte:

sudo nginx -t

um die Konfigurationsdatei unter / etc / nginx / sites-available / default zu testen.

Es gab mir diese Fehler:

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

Also ging ich in die Konfigurationsdatei und in der letzten Zeile gab es

#}

Ich habe einen Kommentar abgegeben, den Testbefehl erneut ausgeführt und es hat funktioniert

Björn Lindholm Hansen
quelle
Eine nette Geste, um die Testbefehlssyntax zusätzlich zu einem Rat zur Behebung des Problems aufzunehmen.
Graubart
7

Das hat bei mir funktioniert.

1) MyApp-Datei

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

PHP5-Benutzer

Veränderung

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

zu

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

2) Konfigurieren Sie cgi.fix_pathinfo

Setzen Sie cgi.fix_pathinfo auf 0

Ort:

PHP5 /etc/php5/fpm/php.ini

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


3) Starten Sie die Dienste neu

FPM

php5 sudo service php5-fpm restart

php7 sudo service php7.0-fpm restart

NGINX

sudo service nginx restart
Sharif El Shobkshy
quelle
fastcgi_pass unix: /run/php/php7.0-fpm.sock; ist falsch. Es sollte /var/run/php/php7.0-fpm.sock sein; und Sie müssen die angegebene PHP-Version mit dem aktualisieren, was Sie installiert haben, zum Beispiel: /var/run/php/php7.2-fpm.sock;
VanAlbert
4

Für mich hat es geholfen, ?$query_stringam Ende von /index.php wie folgt hinzuzufügen :

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

Wenn eine der vorgeschlagenen Antworten nicht funktioniert, versuchen Sie Folgendes:

1.fix www.conf in etc / php5 / fpm / pool.d:

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

2.fix nginx.conf in 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. Korrigieren Sie die Standarddatei in etc / nginx / site-available

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

4. Starten Sie den Nginx-Dienst neu

sudo service nginx neu starten

5. Starten Sie den PHP-Dienst neu

Service php5-fpm Neustart

6.genießen

Erstellen Sie eine beliebige PHP-Datei in / usr / share / nginx / html und führen Sie sie unter "Servername / Dateiname.php" aus (Servername hängt von Ihrer Konfiguration ab, normalerweise ist localhost, Dateiname.php ist der Name der Datei, die in / usr / share / nginx erstellt wurde / html).

Ich benutze Ubuntu 14.04

Huuthang
quelle
2

Die obige Antwort schien zu viel für die Lösung zu sagen, die ich erreicht hatte. So sah meine Datei aus:

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

Hoffe, das hilft einigen Leuten, die an einem Sonntagnachmittag frustriert sind (c:

Benjamin McFerren
quelle
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;
    }
}

Die obigen Schnipsel haben bei php7.2 für mich funktioniert

Avnee.Angel
quelle
1

Für alle, die das gleiche Problem mit PHP 7 haben, habe ich Folgendes getan, damit nginx PHP-Dateien in CentOS 7 ordnungsgemäß ausführt. Dies ist der Fall, wenn jemand das gleiche Problem hat:

  • Befolgen Sie Schritt für Schritt dieses Dokument zu Digital Ocean .

  • Öffnen Sie das /etc/nginx/conf.d/default.conf(standardmäßig sind weder Websites aktiviert noch Websites verfügbar, Sie können sie entsprechend bearbeiten).

  • Bearbeiten Sie den locationParameter wie folgt:

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;
}
  • Starten Sie die Nginx- und PHP-Dienste neu sudo systemctl restart php-fpmund sudo systemctl restart nginx.

  • Vor allem aber, Browser-Cache löschen oder in incognito (Chrome)oder Private Browsing (Firefox)etc ...

Hoffe diese hilfreiche und fröhliche Codierung

SonDang
quelle
1

Meine Lösung war hinzuzufügen

    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;

zum Beispiel in meine benutzerdefinierte Konfigurationsdatei etc/nginx/sites-available/example.com.conf

Das Hinzufügen zu /etc/nginx/sites-available/defaulthat bei mir nicht funktioniert.

Kelvin Low
quelle
1

In meinem Fall, in dem ich nicht verwendet habe, habe /etc/nginx/sites-available/defaultich eine andere Serverblock-Konfigurationsdatei (z. B. example.com) verwendet. Die einzige Möglichkeit, dieses Problem zu beheben, besteht darin, den symbolischen Link der Standard-Serverblock-Konfigurationsdatei zu entfernen:

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

dann Nginx neu laden:

$ sudo systemctl reload nginx
Waqleh
quelle
1

Ich habe mein Problem jetzt mit diesem Code gelöst (ändern Sie Ihre 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;
}
André Bastos
quelle
0

Was für mich mit Ubuntu 16.04 und PHP7 funktioniert hat, war das Löschen dieser Zeile

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

Danach wurden keine PHP-Dateien mehr heruntergeladen.

Briankip
quelle
0

Kommentieren Sie den .php-Speicherort in / etc / nginx / sites-available / default aus

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;
    }
Manivannan Murugavel
quelle
0

Wenn dir etwas anderes nicht hilft. Und vielleicht haben Sie Apache2 früher mit der Testdatei info.php installiert. Löschen Sie einfach die App-Daten (Cache, Cookie) für localhost.

Al Che
quelle
0

Überprüfen Sie, ob Ihre Nginx-Konfigurationsdateierweiterung * .conf ist.
Zum Beispiel: /etc/nginx/conf.d/myfoo.conf

Ich habe die gleiche Situation. Nachdem ich meine Konfigurationsdatei von myfoo in myfoo.conf umbenannt habe, wurde dies behoben. Vergessen Sie nicht, nginx nach dem Umbenennen neu zu starten.

Ivan
quelle
0

Zuerst müssen Sie Remove cachein Ihrem Browser

Öffnen Sie dann das Terminal und führen Sie den folgenden Befehl aus:

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

Fügen Sie dann den folgenden Code in die defaultDatei ein:

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

Wenn eine Nichtübereinstimmung vorliegt, korrigieren Sie einfach Nginx und starten Sie es mit dem folgenden Befehl vom Terminal aus neu

sudo systemctl nginx neu starten

Dann gehen Sie zum Browser und genießen Sie ...

Sanaulla
quelle
0

Für mich war es die Zeile: fastcgi_pass unix: /var/run/php5-fpm.sock;

das musste nur sein: fastcgi_pass unix: /run/php5-fpm.sock;

Dongato
quelle
0

Ich wollte gerade versuchen, dies zu beheben. Für mich war das Problem, dass Cloudflare die PHP-Datei zwischengespeichert hatte und mich immer wieder dazu brachte, sie herunterzuladen.

Die Lösung für mich bestand darin, den Cache in Cloudflare zu leeren.

KristinnVikarJ
quelle
Vielleicht möchten Sie uns sagen, wie?
Thorsten Staerk
0

Ich hatte das gleiche Problem, das es gelöst hat. Dieser Serverblock hat diesen Block auch über anderen Standortblöcken, wenn Sie Probleme mit dem Laden von CSS haben. Was ich meiner Site-verfügbaren Conf-Datei hinzugefügt habe.

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;
}
Alex M.
quelle
0

Das ist es also, was in meinem Fall schließlich als Umschreiberegeln funktioniert hat, bei denen der Täter
die Nginx-Umschreiberegeln wie folgt geändert hat.

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

wird...

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

Anscheinend wurde die Anfrage ohne das letzte Schlüsselwort nicht neu gestartet, sodass sie nie das .phpStandortsegment erreichte und einfach als Download interpretiert wurde.

Olubodun Agbalaya
quelle
0

Für eine Aufzeichnung stellte ich fest, dass mein PHP-Fpm nicht lief und ich reparierte es mit service php7.2-fpm stop

IslamTaha
quelle
0

Noch etwas zu überprüfen: Wenn Sie den HTTPS-Zugriff vor dem Einrichten von PHP eingerichtet haben - ich habe certbot verwendet - müssen Sie die Änderungen in / etc / nginx / sites-available / default zweimal vornehmen, da es zwei gibt Serverblöcke (einer überwacht Port 80 und einer überwacht Port 443).

(Ich habe diesen Server hauptsächlich für E-Mail eingerichtet und hatte bei der ersten Installation von nginx keine Verwendung für PHP, nur um Certbot einfacher ausführen zu können.)

David Brown
quelle