JavaScript disekat dalam penyemak imbas anda. Sila dayakan JavaScript untuk tapak berfungsi!
Tatasusunan superglobal $_SERVER
Untuk menyusun $_SERVER Jurubahasa PHP meletakkan pembolehubah yang diterima daripada pelayan. Tanpa pembolehubah ini, sukar untuk mengatur sokongan penuh untuk aplikasi Web. Di bawah ialah perihalan elemen terpenting dalam tatasusunan superglobal $_SERVER.
Komen
Array ( => pada => 200 => pada => htmlweb.ru => https => 443 => tutup => Mozilla/5.0 (serasi; Googlebot/2.1; +http://www.google.com/bot. html) => */* => beget=begetok; => gzip,deflate => /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin = > => Apache/2.4.25 (Debian) mpm-itk/2.4.7-04 OpenSSL/1.0.2l => htmlweb.ru => 185.12.92.137 => 80 => 144.76.78.4 => /var/www/ htmlweb/data/www/htmlweb.ru => http => => /var/www/htmlweb/data/www/htmlweb.ru => [e-mel dilindungi]=>.php => 35242 => /php/function/$_server.php => CGI/1.1 => HTTP/1.0 => GET => => /php/function/%24_server.php => /index.php => /index.php => 1560059525.711 => 1560059525) 1
$_SERVER[" DOCUMENT_ROOT"]
Elemen $_SERVER["DOCUMENT_ROOT"] mengandungi laluan ke direktori akar pelayan; jika skrip dilaksanakan dalam hos maya, elemen ini menentukan laluan ke direktori akar hos maya. Itu. dalam fail konfigurasi httpd.conf, hos maya mempunyai arahan DocumentRoot yang ditetapkan kepada "D:/main", elemen $_SERVER["DOCUMENT_ROOT"] akan mengandungi nilai "D:main".
$_SERVER[" REMOTE_ADDR"]
Elemen $_SERVER["REMOTE_ADDR"] mengandungi alamat IP pelanggan. Apabila menguji pada mesin tempatan, alamat ini akan sama dengan 127.0.0.1. Walau bagaimanapun, apabila menguji pada rangkaian, pembolehubah akan mengembalikan alamat IP klien atau pelayan proksi terakhir yang mana klien mencapai pelayan. Jika pelanggan menggunakan pelayan proksi, anda boleh mengetahui alamat IPnya menggunakan pembolehubah persekitaran HTTP_X_FORWARDED_FOR, yang nilainya boleh diperoleh menggunakan fungsi getenv().
Komen
Pelayan proksi ialah pelayan perantaraan khas yang menyediakan jenis perkhidmatan khas: pemampatan trafik, pengekodan data, penyesuaian untuk peranti mudah alih, dsb. Di antara banyak pelayan proksi, terdapat apa yang dipanggil pelayan proksi tanpa nama, yang membolehkan anda menyembunyikan alamat IP sebenar pelanggan; pelayan tersebut tidak mengembalikan pembolehubah persekitaran HTTP_X_FORWARDED_FOR.
Mendapatkan semula pembolehubah persekitaran HTTP_X_FORWARDED_FOR
echo @getenv(HTTP_X_FORWARDED_FOR);
$_SERVER[" SCRIPT_FILENAME"]
Elemen $_SERVER["SCRIPT_FILENAME"] mengandungi laluan mutlak ke fail daripada akar cakera. Jadi, jika pelayan menjalankan sistem pengendalian Windows, maka laluan ini mungkin kelihatan seperti ini: "d:main estindex.php", i.e. laluan ditentukan daripada cakera; dalam sistem pengendalian seperti UNIX, laluan ditentukan daripada direktori akar /, contohnya "/var/share/www/test/index.php".
/var/www/htmlweb/data/www/site/index.php
$_SERVER[" NAMA PELAYAN"]
Elemen $_SERVER["SERVER_NAME"] mengandungi nama pelayan, yang biasanya sepadan dengan nama domain tapak yang terletak di atasnya. Sebagai contoh,
Kandungan elemen $_SERVER["SERVER_NAME"] selalunya sama dengan kandungan elemen $_SERVER["HTTP_HOST"]. Sebagai tambahan kepada nama pelayan, tatasusunan superglobal $_SERVER membolehkan anda mengetahui beberapa parameter pelayan, contohnya, alamat IP pelayan, port pendengaran, yang pelayan Web dipasang dan versi protokol HTTP. Maklumat ini diletakkan dalam elemen $_SERVER["SERVER_ADDR"], $_SERVER["SERVER_PORT"], $_SERVER["SERVER_SOFTWARE"] dan $_SERVER["SERVER_PROTOCOL"]. Di bawah adalah contoh menggunakan elemen ini.
Menggunakan Elemen Tatasusunan $_SERVER
echo "Nama pelayan ialah ".$_SERVER["SERVER_NAME"].""; echo "Alamat IP pelayan ialah ".$_SERVER["SERVER_ADDR"]."
"; echo "Port pelayan - ".$_SERVER["SERVER_PORT"]."
"; echo "Pelayan web - ".$_SERVER["SERVER_SOFTWARE"]."
"; echo "Versi protokol HTTP - ".$_SERVER["SERVER_PROTOCOL"]."
";
Nama pelayan - tapak
Alamat IP pelayan - 185.12.92.137
Port pelayan - 80
Pelayan web - Apache/2.4.25 (Debian) mpm-itk/2.4.7-04 OpenSSL/1.0.2l
Versi protokol HTTP - HTTP/1.0
$_SERVER[" REQUEST_METHOD"]
Elemen $_SERVER["REQUEST_METHOD"] mengandungi kaedah permintaan yang digunakan untuk memanggil skrip: GET atau POST.
Gema $_SERVER["REQUEST_METHOD"];
$_SERVER[" QUERY_STRING"]
Elemen $_SERVER["QUERY_STRING"] mengandungi parameter yang dihantar kepada skrip jika rentetan pertanyaan ialah alamat
Sebagai contoh, apabila mengakses:
elemen $_SERVER["QUERY_STRING"] akan mengandungi semua teks selepas tanda "?":
Gema $_SERVER["QUERY_STRING"];
id=1&test=wet&id_theme=512
$_SERVER[" PHP_SELF"]
Elemen $_SERVER["PHP_SELF"] mengandungi nama skrip, bermula dari direktori akar hos maya, i.e. jika rentetan pertanyaan ialah alamat http://www.mysite.ru/test/index.php?id=1&test=wet&id_theme=512 maka elemen $_SERVER["PHP_SELF"] akan mengandungi serpihan "/test/index.php". Biasanya, serpihan yang sama diletakkan dalam elemen $_SERVER["SCRIPT_NAME"].
$_SERVER[" REQUEST_URI"]
Elemen $_SERVER["REQUEST_URI"] mengandungi nama skrip, bermula daripada direktori akar hos maya dan parameter, i.e. jika rentetan pertanyaan ialah alamat: http://www.mysite.ru/test/index.php?id=1&test=wet&id_theme=512 maka elemen $_SERVER["REQUEST_URI"] akan mengandungi serpihan "/test/index.php?id=1&test=wet&id_theme=512". Untuk memulihkan alamat penuh dalam skrip, yang diletakkan dalam baris pertanyaan, cukup untuk menggunakan gabungan elemen tatasusunan $_SERVER yang dibentangkan di bawah
Alamat penuh kepada skrip
echo "http://".$_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];Dan inilah yang sebenarnya digunakan oleh pelanggan sebagai "hos sasaran" permintaan. SERVER_NAME ditakrifkan dalam konfigurasi pelayan. Yang mana satu bergantung pada apa yang anda perlukan. Sekarang anda harus faham bahawa ini ialah nilai terkawal pelanggan yang oleh itu tidak boleh dipercayai untuk digunakan dalam logik perniagaan dan satu lagi adalah nilai terkawal pelayan yang lebih dipercayai. Walau bagaimanapun, anda perlu memastikan bahawa pelayan web mempunyai konfigurasi SERVER_NAME yang betul. Mengambil Apache HTTPD sebagai contoh, berikut ialah petikan daripada dokumentasinya:
Jika ServerName tidak dinyatakan, maka pelayan cuba membuat kesimpulan nama hos dengan melakukan carian terbalik pada alamat IP. Jika tiada port dinyatakan dalam ServerName , maka pelayan akan menggunakan port daripada permintaan masuk. Untuk kebolehpercayaan dan kebolehramalan yang optimum, anda harus menentukan nama hos dan port eksplisit menggunakan arahan ServerName.
Kemas kini: Selepas menyemak jawapan Pekka kepada soalan anda, yang mengandungi pautan kepada jawapan bobince, PHP itu akan sentiasa mengembalikan nilai HTTP_HOST untuk SERVER_NAME, yang bercanggah dengan pengalaman saya sendiri dengan PHP 4.x + Apache HTTPD 1.2.x dari beberapa tahun yang lalu , saya meniup debu dari XAMPP semasa saya pada Windows XP (Apache HTTPD 2.2.1 dengan PHP 5.2.8), menjalankannya, mencipta halaman PHP yang mencetak kedua-dua nilai, mencipta aplikasi Java ujian menggunakan URLConnection untuk menukar pengepala Hos, dan ujian mengajar saya bahawa ini memang (salah) kesnya.
Selepas mula mengesyaki PHP dan menggali beberapa Laporan ralat PHP mengenai subjek, saya mendapati bahawa punca masalah adalah dalam pelayan web yang digunakan, bahawa ia telah salah mengembalikan pengepala Hos HTTP apabila SERVER_NAME diminta. Jadi saya menggali Laporan ralat HTTPD Apache menggunakan pelbagai kata kunci agak tertakluk dan saya akhirnya menemui ralat yang berkaitan. Tingkah laku ini diperkenalkan sejak Apache HTTPD 1.3. Anda perlu menetapkan arahan UseCanonicalName dalam entri
Ini berkesan untuk saya.
Secara umum, SERVER_NAME lebih dipercayai, tetapi anda bergantung dalam konfigurasi pelayan!
HTTP_HOST ialah hos sasaran yang dihantar oleh klien. Pengguna boleh memanipulasi pengguna dengan bebas. Tidak perlu menghantar permintaan ke tapak anda meminta nilai HTTP_HOST www.stackoverflow.com.
SERVER_NAME berasal daripada definisi pelayan VirtualHost dan oleh itu dianggap lebih dipercayai. Ia juga boleh dimanipulasi secara luaran dalam keadaan tertentu yang berkaitan dengan persediaan pelayan web anda. Tengok ini Soalan SO ini, yang menangani aspek keselamatan kedua-dua pilihan.
Anda tidak sepatutnya bergantung padanya untuk selamat. Walau bagaimanapun, yang mana untuk digunakan benar-benar bergantung pada apa yang anda mahu lakukan. Jika anda ingin menentukan domain yang digunakan skrip anda, anda boleh menggunakan HTTP_HOST dengan selamat selagi nilai tidak sah yang datang daripada penyerang tidak boleh memecahkan apa-apa.
Ambil perhatian bahawa jika anda mahu menggunakan IPv6, anda mungkin mahu menggunakan HTTP_HOST dan bukannya SERVER_NAME. Jika anda memasukkan http://[::1]/ , pembolehubah persekitaran adalah seperti berikut:
HTTP_HOST = [::1] SERVER_NAME = ::1
Ini bermakna jika anda melakukan mod_rewrite, sebagai contoh, anda mungkin mendapat hasil yang buruk. Contoh ubah hala SSL:
# SERVER_NAME TIDAK akan berfungsi - Ubah hala ke https://::1/ RewriteRule .* https://%(SERVER_NAME)/ # HTTP_HOST akan berfungsi - Ubah hala ke https://[::1]/ RewriteRule .* https: //%(HTTP_HOST)/
Ini HANYA terpakai jika anda mengakses pelayan tanpa nama hos.
jika anda ingin menyemak melalui server.php atau apa sahaja yang anda mahu hubungi dengan yang berikut:
Kemudian akses semua URL yang sah untuk tapak anda dan uji perbezaannya.
Saya mengambil sedikit masa untuk memahami maksud orang dengan "SERVER_NAME lebih dipercayai". Saya menggunakan pelayan kongsi dan tidak mempunyai akses kepada arahan hos maya. Jadi saya menggunakan mod_rewrite dalam .htaccess untuk memetakan HTTP_HOST yang berbeza dalam direktori yang berbeza. Dalam kes ini, nilai HTTP_HOST ini masuk akal.
Keadaannya adalah sama jika anda menggunakan hos maya berasaskan nama: arahan Nama Pelayan di dalam hos maya hanya memberitahu anda nama hos yang akan dipetakan kepada hos maya itu. Intinya ialah dalam kedua-dua kes, nama hos yang diberikan oleh klien pada masa permintaan (HTTP_HOST) mesti sepadan dengan nama pada pelayan, yang dipetakan sendiri ke direktori. Sama ada pemetaan dilakukan terhadap arahan hos maya atau peraturan mod_rewrite htaccess adalah kedua di sini. Dalam kes ini, HTTP_HOST akan sama dengan SERVER_NAME. Saya gembira Apache dikonfigurasikan dengan cara ini.
Walau bagaimanapun, keadaan berbeza untuk hos maya berasaskan IP. Dalam kes ini dan hanya dalam kes ini, SERVER_NAME dan HTTP_HOST boleh berbeza kerana klien kini memilih pelayan melalui IP, bukan dengan nama. Malah, mungkin terdapat konfigurasi khas yang mana ini penting.
Jadi mulai sekarang, saya akan menggunakan SERVER_NAME sekiranya kod saya dialihkan ke konfigurasi khas ini.
Dengan mengandaikan anda mempunyai persediaan mudah (CentOS 7, Apache 2.4.x dan PHP 5.6.20) dan hanya satu tapak web (tidak menganggap hosting dikongsi)...
Dalam pengertian PHP, $_SERVER["SERVER_NAME"] ialah elemen PHP yang didaftarkan dalam superclass $_SERVER berdasarkan konfigurasi Apache anda (**ServerName** arahan dengan UseCanonicalName On) dalam httpd.conf (sama ada daripada konfigurasi hos maya yang didayakan fail, apa-apa sahaja, dsb.). HTTP_HOST disimpulkan daripada pengepala hos HTTP. Anggap ini sebagai input pengguna. Tapis dan semak sebelum digunakan.
Berikut ialah contoh di mana saya menggunakan $_SERVER["SERVER_NAME"] sebagai asas untuk perbandingan. Kaedah berikut adalah pada kelas kanak-kanak tertentu yang saya panggil ServerValidator (anak Pengesah). ServerValidator menyemak enam atau tujuh elemen dalam $_SERVER sebelum menggunakannya.
Apabila menentukan sama ada permintaan HTTP ialah POST, saya menggunakan kaedah ini.
Fungsi awam ialahPOST() ( return (($this->requestMethod === "POST") && // Abaikan $this->hasTokenTimeLeft() && // Abaikan $this->hasSameGETandPOSTIdentities() && // Ingore ($this ->httpHost === filter_input(INPUT_SERVER, "SERVER_NAME"))); )
Pada masa kaedah ini dipanggil, semua penapisan dan pengesahan elemen $_SERVER yang sepadan (dan set sifat yang sepadan) telah dilakukan.
($this->httpHost === filter_input(INPUT_SERVER, "SERVER_NAME")
Mengesahkan bahawa nilai $_SERVER["HTTP_HOST"] (akhirnya diperoleh daripada pengepala hos HTTP yang diminta) sepadan dengan $_SERVER["SERVER_NAME"] .
Sekarang saya menggunakan ceramah superglobal untuk menerangkan contoh saya, tetapi itu kerana sesetengah orang tidak biasa dengan INPUT_GET , INPUT_POST dan INPUT_SERVER berkaitan filter_input_array() .
Intinya ialah saya tidak memproses permintaan POST pada pelayan saya melainkan keempat-empat syarat dipenuhi. Oleh itu, dari segi permintaan POST, kegagalan untuk menyediakan pengepala hos HTTP (kehadiran disemak untuk lebih awal) ejaan azab untuk pelayar yang ketat HTTP 1.0. Selain itu, hos yang diminta mesti sepadan dengan nilai Nama pelayan dalam httpd.conf, dan dengan sambungan - nilai $_SERVER("SERVER_NAME") dalam supermaclon $_SERVER. Sekali lagi, saya akan menggunakan INPUT_SERVER dengan fungsi penapis PHP, tetapi anda telah melanggar drift saya.
Seperti yang dinyatakan oleh balusC, SERVER_NAME tidak boleh dipercayai dan boleh ditukar dalam konfigurasi apache, konfigurasi pelayan pelayan dan tembok api yang mungkin berada di antara anda dan pelayan.
Fungsi berikut sentiasa mengembalikan hos sebenar (hos ditaip tersuai) tanpa port, dan ia hampir tidak mudah:
Fungsi getRealHost())( list($realHost,)=explode(":",$_SERVER["HTTP_HOST"]); return $realHost; )
kongsiPertama, kami akan menambah baik halaman pendaftaran dengan menambah keupayaan untuk memuat naik avatar. Imej sumber mestilah dalam format jpg, gif atau png. Ia juga hendaklah tidak lebih daripada 2 MB. Jangan risau, selepas ia dimampatkan oleh skrip, saiz avatar akan menjadi lebih kurang 3 kb dan format jpg. Buka halaman reg.php dan tambahkannya dalam tag < bentuk> barisan enctype="multipart/form-data", seperti dalam contoh: