Nginx obsługuje pliki .php jako pliki do pobrania, zamiast je wykonywać


151

Instaluję witrynę w kropli (Digital Ocean). Mam problem z poprawną instalacją NGINX z PHP. Zrobiłem tutorial https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-on-ubuntu-14-04, ale kiedy próbuję uruchomić jakieś .php po prostu go pobiera ... na przykład ... http://5.101.99.123/info.phpdziała, ale ... Jeśli przejdę do głównego http://5.101.99.123, pobiera mój index.php: /

Dowolny pomysł?

-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

Mój / 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
            }

... Inne „lokalizacja” są komentowane (#)


4
Tak ... nie skonfigurowałeś poprawnie PHP-FPM z Nginx. To wszystko, co możemy ci powiedzieć, ponieważ nie pokazałeś nam żadnej swojej konfiguracji.
Brad,

który plik chcesz zobaczyć? Dzięki @Brad
Apeiron

Niezależnie od pliku (lub plików), w którym umieścisz konfigurację. Odpowiednia część to ... miejsce, w którym ustawiasz PHP-FPM w konfiguracji Nginx.
Brad,

2
po około godzinie googlowania znalazłem to askubuntu.com/a/601996/89455 - jeśli miałeś złą konfigurację przed próbą wyczyszczenia pamięci podręcznej - działało tutaj!
tm_lv

1
Zobacz podobne pytanie / odpowiedź dla PHP7 na stackoverflow.com/q/42664080/287948
Peter Krauss

Odpowiedzi:


131

Spróbuj tego:

  1. Edytować /etc/nginx/sites-available/default

  2. Usuń komentarz z obu linii nasłuchu, aby nginx nasłuchiwał na porcie 80 IPv4 i IPv6.

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

    # Make site accessible (...)
    server_name localhost;
  4. Dodaj index.phpdo indexlinii

    root /usr/share/nginx/www;
    index index.php index.html index.htm;
  5. Odkomentuj 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. Edytuj /etc/php5/fpm/php.inii upewnij się, że cgi.fix_pathinfojest ustawiony na0

  7. Zrestartuj nginx i php5-fpm sudo service nginx restart && sudo service php5-fpm restart


Zacząłem używać Linuksa tydzień temu, więc naprawdę mam nadzieję, że w tym pomogę. Używam edytora tekstu nano do edycji plików. uruchom apt-get install nano, jeśli go nie masz. Google, aby dowiedzieć się więcej.


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

8
nginx -s reload
Duke

2
z PHP7-fpm to: usługa php7.0-fpm restart
Alex

1
@Joy, wypróbowano twoją sugestię, ale nie zadziałała. Musiał użyć fastcgi_pass unix: /run/php/php7.0-fpm.sock;
jdstaerk

1
Dla php7.2: unix:/var/run/php5-fpm.sock;przekonwertuj na unix:/var/run/php/php7.2-fpm.sock;(jeszcze jedno zagnieżdżenie /php)
Oleg Reym

50

Musisz dodać to do / etc / nginx / sites-enabled / default, aby wykonywać pliki php na serwerze 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;
    }
}

Co to jest SCRIPT_FILENAME?
mp3por

2
Jeśli używasz PHP 7.0, to jest poprawne:fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
Andrew Fox,

1
@ AndrewFox- moja nazwa pliku jest php7.0-fpm.pid, a nie php7.0-fpm.sockw /var/run/php/ to, co to znaczy?
vsync,

@vsync spróbuj. sudo service php7.0-fpm restart. brak sock oznacza, że ​​trwa proces php.
zhisme

1
@Pathros - Odkryłem, że wordpress (w moim przypadku) ma pliki konfiguracyjne serwera w innym folderze i to były te, które trzeba było edytować/etc/nginx/conf.d/wordpress_https.conf
vsync

43

Miałem podobny problem, który został rozwiązany przez opróżnienie pamięci podręcznej przeglądarki (działał również dobrze z inną przeglądarką).


5
Myślę, że pomogło mi ponowne uruchomienie i tryb incognito. Wielkie dzięki za noobność, jaką możemy zrobić.
Swapnil Mhaske

4
Wielkie dzięki. Uratowałeś mój dzień) Również +1 dla incognito!
Eddie

3
To mi wystarczyło, także po godzinach wypróbowania wielu innych sugerowanych rozwiązań.
Kleag

1
Dziwne było dla mnie to, że moja strona działała na IE i Chrome, podczas gdy w Mozilli zdejmowała stronę, aby ją uruchomić. To była wina pamięci podręcznej Mozilli.
Viktor Joras

3
Uratowałeś mój czas bracie.
Amir Kaftari

12

Zaktualizuj konfigurację nginx / etc / nginx / sites-available / default lub plik konfiguracyjny

jeśli używasz php7, użyj tego

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

jeśli używasz php5, użyj tego

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

Odwiedź tutaj, aby uzyskać szczegółowe informacje. Szczegóły tutaj


Próbowałem, to nie zadziałało, używam Ubuntu 14.04 i PHP 7.0, jak mogę rozwiązać ten problem?
Kishore

powyżej udostępniony link „wszystkie szczegóły” jest uszkodzony
Kishore

Co oznacza include snippets/fastcgi-php.conf;?
Timo

9

Widzę wiele rozwiązań powyżej i wiele z nich działało poprawnie dla mnie, ale nie rozumiałem, co robią i martwiłem się, że wystarczy skopiować i wkleić kod, a konkretnie fastcgi . Więc oto moje 2 centy,

  1. nginx jest serwerem WWW (a nie serwerem aplikacji ) i dlatego może obsługiwać tylko strony statyczne.
  2. za każdym razem, gdy próbujemy renderować / zwrócić plik .php, na przykład index.php, nginx nie wie, co zrobić, ponieważ po prostu nie może zrozumieć pliku .php (lub w tym przypadku żadnego rozszerzenia poza kilkoma wybranymi jak .html, .js itp., które są plikami statycznymi)
  3. Tak więc, aby uruchamiać inne rodzaje plików, potrzebujemy czegoś, co znajduje się między nginx a aplikacją (tutaj aplikacja php). W tym miejscu pojawia się wspólny interfejs bramy (CGI). Jest to oprogramowanie, które zarządza tą komunikacją. CGI można zaimplementować w dowolnym możliwym języku Python (uWSGI), PHP (FPM), a nawet C. FastCGI to w zasadzie ulepszona wersja CGI, która jest znacznie szybsza niż CGI.

W przypadku niektórych serwerów, takich jak Apache, istnieje wbudowana obsługa interpretacji PHP, a zatem nie ma potrzeby korzystania z CGI.

To łącze do cyfrowego oceanu dość dobrze wyjaśnia kroki instalacji FPM i nie piszę kroków potrzebnych do rozwiązania problemu pobierania plików php zamiast renderowania, ponieważ inne odpowiedzi IMHO są całkiem dobre.


Niezłe wyjaśnienie. Dzięki.
Jon

1
nginx to SERWER WWW, a nie przeglądarka, proszę to naprawić.
Geeocode

8

Miałem ten sam problem i żadna z odpowiedzi nie rozwiązała problemu.

Biegłem:

sudo nginx -t

aby przetestować plik konfiguracyjny w / etc / nginx / sites-available / default.

Dał mi te błędy:

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

Więc wszedłem do pliku konfiguracyjnego i w ostatniej linii było

#}

Odkomentowałem, ponownie uruchomiłem polecenie testowe i zadziałało


Niezły dodatek do składni polecenia testowego, oprócz porady dotyczącej rozwiązania problemu.
siwobrody

7

To zadziałało dla mnie.

1) plik 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;
      }
}

Użytkownicy PHP5

Zmiana

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

do

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

2) Skonfiguruj cgi.fix_pathinfo

Ustaw cgi.fix_pathinfo na 0

Lokalizacja:

PHP5 /etc/php5/fpm/php.ini

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


3) Uruchom ponownie usługi

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; jest nieprawidłowe. Powinien to być /var/run/php/php7.0-fpm.sock; i musisz zaktualizować określoną wersję php za pomocą tego, co zainstalowałeś, na przykład: /var/run/php/php7.2-fpm.sock;
VanAlbert,

4

U mnie pomogło dodanie ?$query_stringna końcu /index.php, jak poniżej:

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

3

Jeśli którakolwiek z proponowanych odpowiedzi nie działa, spróbuj tego:

1. naprawić www.conf w etc / php5 / fpm / pool. D:

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

2. naprawić nginx.conf w 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. Napraw domyślny plik w etc / nginx / site-available

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

4. uruchom ponownie usługę Nginx

Uruchom ponownie usługę sudo nginx

5. uruchom ponownie usługę php

restart usługi php5-fpm

6. cieszyć się

Utwórz dowolny plik php w / usr / share / nginx / html i uruchom w "nazwa_serwera / nazwa_pliku.php" (nazwa_serwera zależy od twojej konfiguracji, normalnie to localhost, nazwa_pliku.php to nazwa pliku utworzonego w / usr / share / nginx / html).

Używam Ubuntu 14.04


2

Powyższa odpowiedź wydawała się zbytnio komentować rozwiązanie, do którego doszedłem. Tak wyglądał mój plik:

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

Mam nadzieję, że pomoże to niektórym osobom sfrustrowanym w niedzielne popołudnie (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;
    }
}

Powyższe fragmenty działały u mnie w przypadku php7.2


1

Dla każdego, kto ma ten sam problem z PHP 7, zrobiłem to, aby nginx poprawnie wykonywał pliki php w CentOS 7, opublikowane tutaj, więc na wypadek, gdyby ktoś miał ten sam problem:

  • Postępuj krok po kroku z tym dokumentem na temat Digital Ocean .

  • Otwórz /etc/nginx/conf.d/default.conf(domyślnie nie mam włączonych ani dostępnych witryn, możesz odpowiednio edytować).

  • Edytuj locationparametr jak poniżej:

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;
}
  • Uruchom ponownie usługi Nginx i PHP sudo systemctl restart php-fpmoraz sudo systemctl restart nginx.

  • Ostatnia, ale najważniejsza, wyczyść pamięć podręczną przeglądarki lub uruchom ją incognito (Chrome)lub Private Browsing (Firefox)itp.

Mam nadzieję, że to pomocne i szczęśliwe kodowanie


1

Moim rozwiązaniem było dodanie

    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;

na przykład do mojego niestandardowego pliku konfiguracyjnego etc/nginx/sites-available/example.com.conf

Dodawanie do /etc/nginx/sites-available/defaultnie działa dla mnie.


1

W moim przypadku nie korzystałem /etc/nginx/sites-available/defaultz innego pliku konfiguracyjnego bloku serwera (np. Example.com), a jedynym sposobem na rozwiązanie tego problemu jest usunięcie domyślnego dowiązania symbolicznego do pliku konfiguracyjnego bloku serwera:

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

następnie przeładowuję Nginx:

$ sudo systemctl reload nginx

1

Rozwiązałem teraz swój problem tym kodem (zmień swoje 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

To, co zadziałało dla mnie z Ubuntu 16.04 i php7, to usunięcie tej linii

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

Po tym przestał pobierać pliki php.


0

Usuń komentarz z lokalizacji .php w / 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

Jeśli cokolwiek innego ci nie pomoże. A może wcześniej zainstalowałeś apache2 z plikiem testowym info.php. Po prostu wyczyść dane aplikacji (pamięć podręczna, plik cookie) dla hosta lokalnego.


0

sprawdź, czy rozszerzenie pliku konfiguracyjnego nginx to * .conf.
na przykład: /etc/nginx/conf.d/myfoo.conf

Mam taką samą sytuację. Po zmianie nazwy mojego pliku konfiguracyjnego z myfoo na myfoo.conf zostało to naprawione. Nie zapomnij o ponownym uruchomieniu nginx po zmianie jego nazwy.


0

Najpierw musisz Remove cachew swojej przeglądarce

Następnie otwórz terminal i uruchom następujące polecenie:

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

Następnie dodaj następujący kod w defaultpliku:

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

Jeśli jakakolwiek niezgodność, po prostu popraw i uruchom ponownie Nginx z terminala za pomocą następującego polecenia

sudo systemctl zrestartuj nginx

Następnie przejdź do przeglądarki i ciesz się ...


0

Dla mnie była to linia: fastcgi_pass unix: /var/run/php5-fpm.sock;

który musiał być po prostu: fastcgi_pass unix: /run/php5-fpm.sock;


0

Miałem zamiar zwariować, próbując to naprawić, dla mnie problem polegał na tym, że Cloudflare zapisał plik php w pamięci podręcznej i zmuszał mnie do jego pobierania.

Rozwiązaniem dla mnie było wyczyszczenie pamięci podręcznej w Cloudflare.


może chcesz nam powiedzieć, jak?
Thorsten Staerk

0

Miałem ten sam problem, który go rozwiązał, ponieważ ten blok serwera ma również ten blok nad innymi blokami lokalizacji, jeśli masz problemy z ładowaniem css. Które dodałem do mojego pliku konfiguracyjnego dostępnego w witrynie.

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

Więc to w końcu zadziałało w moim przypadku jako reguły przepisywania, w których winowajcą
zmieniłem zasady przepisywania nginx w następujący sposób.

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

staje się...

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

Najwyraźniej bez ostatniego słowa kluczowego żądanie nie zostało ponownie uruchomione, więc nigdy nie trafiło do .phpsegmentu lokalizacji i zostało po prostu zinterpretowane jako pobranie -


0

dla przypomnienia, stwierdziłem, że mój php-fpm nie działa i naprawiłem to za pomocą service php7.2-fpm stop


0

Jeszcze jedna rzecz do sprawdzenia: jeśli skonfigurowałeś dostęp HTTPS przed skonfigurowaniem PHP - użyłem certbot - musisz dwukrotnie wprowadzić zmiany w / etc / nginx / sites-available / default , bo tam będą dwa bloki serwerów (jeden nasłuchujący na porcie 80 i jeden nasłuchujący na porcie 443).

(Skonfigurowałem ten serwer głównie dla poczty e-mail i nie miałem żadnego zastosowania dla PHP, kiedy po raz pierwszy zainstalowałem nginx, tylko jako sposób na łatwiejsze uruchomienie certbota).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.