Nginx menyajikan file .php sebagai unduhan, alih-alih menjalankannya

151

Saya memasang situs web dalam droplet (Digital Ocean). Saya memiliki masalah untuk menginstal NGINX dengan PHP dengan benar. Saya melakukan tutorial https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-on-ubuntu-14-04 tetapi ketika saya mencoba menjalankan beberapa File .php hanya mengunduhnya ... misalnya ... http://5.101.99.123/info.phpitu berfungsi tetapi ... Jika saya pergi ke utama http://5.101.99.123itu mengunduh index.php saya: /

Ada ide?

-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

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

... Lainnya "lokasi" dikomentari (#)

Apeiron
sumber
4
Ya ... Anda tidak mengatur PHP-FPM dengan Nginx dengan benar. Itu semua kami dapat memberitahu Anda meskipun karena Anda tidak menunjukkan kepada kita setiap dari konfigurasi Anda.
Brad
file mana yang ingin Anda lihat? Terima kasih @Brad
Apeiron
File apa pun (atau file) yang Anda masukkan konfigurasi Anda. Bagian yang relevan adalah ... di mana Anda mengatur PHP-FPM di konfigurasi Nginx Anda.
Brad
2
setelah seperti satu jam googling menemukan ini askubuntu.com/a/601996/89455 - jika Anda memiliki konfigurasi yang buruk sebelum mencoba membersihkan cache - bekerja di sini!
tm_lv
1
Lihat pertanyaan / jawaban serupa untuk PHP7 di stackoverflow.com/q/42664080/287948
Peter Krauss

Jawaban:

131

Coba ini:

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

  2. Hapus komentar kedua saluran untuk membuat nginx mendengarkan pada port 80 IPv4 dan IPv6.

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

    # Make site accessible (...)
    server_name localhost;
    
  4. Tambahkan index.phpke indexbaris

    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. Edit /etc/php5/fpm/php.inidan pastikan cgi.fix_pathinfodiatur ke0

  7. Mulai ulang nginx dan php5-fpm sudo service nginx restart && sudo service php5-fpm restart


Saya baru saja mulai menggunakan Linux seminggu yang lalu, jadi saya sangat berharap dapat membantu Anda dalam hal ini. Saya menggunakan editor teks nano untuk mengedit file. jalankan apt-get install nano jika Anda tidak memilikinya. Google di atasnya untuk tahu lebih banyak.

Jack M.
sumber
14
service nginx restart && service php5-fpm restart
Duke
8
nginx -s reload
Duke
2
dengan PHP7-fpm adalah: service php7.0-fpm restart
Alex
1
@Joy, coba saran Anda tetapi tidak berhasil. Harus menggunakan fastcgi_pass unix: /run/php/php7.0-fpm.sock;
jdstaerk
1
Untuk php7.2: unix:/var/run/php5-fpm.sock;konversi ke unix:/var/run/php/php7.2-fpm.sock;(satu lagi bersarang /php)
Oleg Reym
50

Anda perlu menambahkan ini ke / etc / nginx / sites-enabled / default untuk mengeksekusi file php di 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;
    }
}
rootx
sumber
Apa itu SCRIPT_FILENAME?
mp3por
2
Jika Anda menggunakan PHP 7.0, maka ini benar:fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
Andrew Fox
1
@ AndrewFox- nama file saya php7.0-fpm.piddan tidak php7.0-fpm.sockdalam /var/run/php/ arti apa?
vsync
@vsync coba. sudo service php7.0-fpm restart. jika kaus kaki hilang itu menunjukkan bahwa proses php sedang dijalankan.
zhisme
1
@ Patro - Saya menemukan bahwa wordpress (dalam kasus saya) memiliki file konfigurasi Server di folder lain, dan itu adalah yang perlu diedit/etc/nginx/conf.d/wordpress_https.conf
vsync
43

Saya memiliki masalah serupa yang diselesaikan dengan mengosongkan cache browser (juga berfungsi dengan baik dengan browser yang berbeda).

np8
sumber
5
Saya pikir mode restart dan penyamaran membantu saya. Terima kasih banyak untuk ketiadaan yang bisa kita lakukan.
Swapnil Mhaske
4
Terima kasih banyak. Anda menyelamatkan hari saya) Juga memberi +1 untuk penyamaran!
Eddie
3
Ini membuatnya untuk saya, juga setelah berjam-jam mencoba banyak solusi lain yang disarankan.
Kleag
1
Sungguh aneh bagi saya bahwa situs saya bekerja pada IE dan chrome sementara di mozilla situs itu downlode sebelum menjalankannya. Itu adalah kesalahan cache mozilla.
Viktor Joras
3
Anda menghemat waktu saya kawan.
Amir Kaftari
12

Perbarui nginx config / etc / nginx / sites-available / default atau file config Anda

jika Anda menggunakan php7 gunakan ini

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

jika Anda menggunakan php5 gunakan ini

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

Kunjungi di sini untuk detail lengkap. Detail di sini

M Arfan
sumber
Saya mencoba ini tidak berhasil untuk saya, saya menggunakan ubuntu 14.04 dan php 7.0 bagaimana saya bisa memperbaiki masalah ini?
Kishore
tautan bersama di atas "perincian lengkap" rusak
Kishore
Apa artinya include snippets/fastcgi-php.conf;?
Timo
9

Saya melihat banyak solusi di atas dan banyak yang bekerja dengan benar untuk saya, tetapi saya tidak mengerti apa yang mereka lakukan dan khawatir hanya menyalin paste kode, khususnya, fastcgi . Jadi, inilah 2 sen saya,

  1. nginx adalah server web (dan bukan server aplikasi ) dan karenanya, ia hanya dapat melayani halaman statis.
  2. kapan saja, kami mencoba merender / mengembalikan file .php, misalnya index.php, nginx tidak tahu apa yang harus dilakukan, karena tidak dapat memahami file .php (atau dalam hal ini ekstensi apa pun selain beberapa yang dipilih) seperti .html, .js dll. yang merupakan file statis)
  3. Jadi untuk menjalankan jenis file lain kita perlu sesuatu yang berada di antara nginx dan aplikasi (di sini aplikasi php). Di sinilah antarmuka gateway umum (CGI) masuk. Ini adalah perangkat lunak yang mengelola komunikasi ini. CGI dapat diimplementasikan dalam bahasa apa pun yang mungkin Python (uWSGI), PHP (FPM) dan bahkan C. FastCGI pada dasarnya adalah versi upgrade CGI yang jauh lebih cepat daripada CGI.

Untuk beberapa, server seperti Apache, ada yang dibangun dalam dukungan untuk menafsirkan PHP dan dengan demikian tidak perlu untuk CGI.

Tautan samudra digital ini , menjelaskan langkah-langkah untuk menginstal FPM dengan cukup baik dan saya tidak menulis langkah-langkah yang diperlukan untuk menyelesaikan masalah file php yang diunduh alih-alih render karena jawaban lain IMHO cukup bagus.

coda
sumber
Penjelajah yang bagus. Terima kasih.
Jon
1
nginx adalah SERVER web bukan browser, mohon perbaiki.
Geeocode
8

Saya memiliki masalah yang sama dan tidak ada jawaban yang memecahkan masalah.

Saya berlari:

sudo nginx -t

untuk menguji file konfigurasi di / etc / nginx / sites-available / default.

Itu memberi saya kesalahan ini:

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

Jadi saya pergi ke file konfigurasi dan pada baris terakhir ada

#}

Saya membatalkan komentar, menjalankan perintah pengujian lagi dan itu berhasil

Bjorn Lindholm Hansen
sumber
Sentuhan yang bagus untuk memasukkan sintaks uji-perintah di samping saran untuk memperbaiki masalah.
greybeard
7

Ini berhasil bagi saya.

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

Pengguna PHP5

Perubahan

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

untuk

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

2) Konfigurasikan cgi.fix_pathinfo

Setel cgi.fix_pathinfo ke 0

Lokasi:

PHP5 /etc/php5/fpm/php.ini

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


3) Mulai kembali layanan

FPM

php5 sudo service php5-fpm restart

php7 sudo service php7.0-fpm restart

NGINX

sudo service nginx restart
Sharif El Shobkshy
sumber
fastcgi_pass unix: /run/php/php7.0-fpm.sock; salah. Seharusnya /var/run/php/php7.0-fpm.sock; dan Anda perlu memperbarui versi php yang ditentukan dengan apa pun yang telah Anda instal, misalnya: /var/run/php/php7.2-fpm.sock;
VanAlbert
4

Bagi saya itu membantu menambahkan ?$query_stringdi akhir /index.php, seperti di bawah ini:

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

Jika salah satu jawaban yang diajukan tidak berfungsi, coba ini:

1. perbaiki www.conf di etc / php5 / fpm / pool.d:

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

2. memperbaiki nginx.conf di 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. perbaiki file default di etc / nginx / site-available

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

4. mulai layanan nginx

sudo service nginx restart

5. mulai kembali layanan php

layanan restart php5-fpm

6. senang

Buat file php di / usr / share / nginx / html dan jalankan di "server_name / file_name.php" (server_name tergantung pada konfigurasi Anda, normalnya adalah localhost, file_name.php adalah nama file yang dibuat di / usr / share / nginx / html).

Saya menggunakan Ubuntu 14.04

huuthang
sumber
2

Jawaban di atas sepertinya terlalu banyak mengomentari solusi yang saya capai. Seperti inilah tampilan file saya:

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

Semoga ini bisa membantu beberapa orang yang frustrasi pada hari Minggu sore (c:

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

Cuplikan di atas berfungsi untuk saya jika menggunakan php7.2

Avnee. Angel
sumber
1

Bagi siapa pun yang memiliki masalah yang sama dengan PHP 7, ini adalah apa yang saya lakukan untuk membuat nginx mengeksekusi file php dengan benar di CentOS 7, diposting di sini jadi jika ada orang yang memiliki masalah yang sama:

  • Ikuti langkah demi langkah dokumen ini di Digital Ocean .

  • Buka /etc/nginx/conf.d/default.conf(secara default saya tidak memiliki situs-diaktifkan atau situs-tersedia, Anda dapat mengeditnya).

  • Edit locationparameter seperti di bawah ini:

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;
}
  • Mulai kembali layanan Nginx dan PHP sudo systemctl restart php-fpmdan sudo systemctl restart nginx.

  • Terakhir tetapi yang paling penting, hapus cache browser atau jalankan di incognito (Chrome)atau Private Browsing (Firefox)dll ...

Semoga coding ini bermanfaat dan bahagia

SonDang
sumber
1

Solusi saya adalah menambahkan

    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;

ke file konfigurasi khusus saya, misalnya etc/nginx/sites-available/example.com.conf

Menambahkan /etc/nginx/sites-available/defaulttidak berfungsi untuk saya.

Kelvin Low
sumber
1

Saya kasus saya, saya tidak menggunakan /etc/nginx/sites-available/defaultsaya menggunakan file konfigurasi blok server yang berbeda (misalnya example.com), dan satu-satunya cara saya dapat memperbaiki masalah ini adalah dengan menghapus file konfigurasi blok server default tautan simbolik:

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

lalu muat ulang Nginx:

$ sudo systemctl reload nginx
Wakaf
sumber
1

Saya memecahkan masalah saya sekarang dengan kode ini (ubah IP Anda):

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
sumber
0

Apa yang berhasil bagi saya dengan Ubuntu 16.04, dan php7 menghapus baris ini

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

Itu berhenti mengunduh file php setelah itu.

briankip
sumber
0

Batalkan komentar lokasi .php di / 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;
    }
Manivannan Murugavel
sumber
0

Jika ada hal lain yang tidak membantu Anda. Dan mungkin sebelumnya Anda menginstal apache2 dengan file tes info.php. Cukup hapus Data Aplikasi (cache, cookie) untuk localhost.

Al Che
sumber
0

periksa ekstensi file konfigurasi nginx Anda adalah * .conf.
misalnya: /etc/nginx/conf.d/myfoo.conf

Saya mendapat situasi yang sama. Setelah saya mengubah nama file konfigurasi saya dari myfoo ke myfoo.conf, itu diperbaiki. Jangan lupa untuk me-restart nginx setelah mengganti nama itu.

Ivan
sumber
0

Pertama Anda harus Remove cachedi browser Anda

Kemudian buka terminal dan jalankan perintah berikut:

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

Kemudian tambahkan kode berikut dalam defaultfile:

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

Jika ada ketidaksesuaian koreksi dan restart Nginx dari terminal dengan perintah berikut

sudo systemctl restart nginx

Lalu buka browser dan Nikmati ...

Sanaulla
sumber
0

Bagi saya itu adalah baris: fastcgi_pass unix: /var/run/php5-fpm.sock;

yang harus adil: fastcgi_pass unix: /run/php5-fpm.sock;

Dongato
sumber
0

Saya akan menjadi mental mencoba untuk memperbaikinya, bagi saya masalahnya adalah Cloudflare telah men-cache file php dan terus membuat saya mengunduhnya.

Perbaikan untuk saya adalah membersihkan cache di Cloudflare.

KristinnVikarJ
sumber
mungkin Anda ingin memberi tahu kami caranya?
Thorsten Staerk
0

Saya telah mengalami masalah yang sama yang memecahkannya adalah blok server ini juga memiliki blok ini di atas blok lokasi lain jika Anda memiliki css tidak memuat masalah. Yang saya tambahkan ke file conf situs-tersedia.

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.
sumber
0

Jadi inilah yang akhirnya berhasil dalam kasus saya sebagai aturan penulisan ulang di mana pelakunya
saya mengubah aturan penulisan ulang nginx sebagai berikut ..

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

menjadi...

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

Tampaknya tanpa kata kunci terakhir , permintaan tersebut tidak dapat dimulai ulang, sehingga tidak pernah menyentuh .phpsegmen lokasi, dan hanya ditafsirkan sebagai unduhan -

Olubodun Agbalaya
sumber
0

sebagai catatan, saya menemukan bahwa php-fpm saya tidak berjalan dan saya memperbaikinya service php7.2-fpm stop

IslamTaha
sumber
0

Satu hal lagi yang perlu diperiksa: jika Anda telah mengatur akses HTTPS sebelum mengatur PHP - Saya menggunakan certbot - Anda harus membuat perubahan di / etc / nginx / sites-available / default dua kali karena akan ada dua blok server (satu mendengarkan pada port 80 dan satu mendengarkan pada port 443).

(Saya sedang menyiapkan server ini terutama untuk email dan tidak menggunakan PHP ketika saya pertama kali menginstal nginx hanya sebagai cara untuk menjalankan certbot lebih mudah.)

David Brown
sumber