Pelayan tanpa dosa php. Tatasusunan global $_SERVER dalam PHP. Kami menggunakan pelayan terbina dalam

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

  • Lihat senarai lengkap elemen tatasusunan $_SERVER
  • anda boleh sama ada menggunakan fungsi print_r(), yang mencetak dump tatasusunan, atau menggunakan fungsi phpinfo(), yang memaparkan maklumat tentang penterjemah PHP.

    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 ServerName dalam httpd.conf (juga semak amaran di bahagian bawah dokumen!).

    ServerName example.com UseCanonicalName on

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

    kongsi

    Pertama, 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:


    Pendaftaran










    Sekarang mari berjimat reg.php

    2. Kemudian anda perlu mencipta medan lain dalam jadual pengguna. Mari pergi ke phpmyadmin, pilih pangkalan data dan jadual yang dikehendaki.


    Kami menetapkan semua nilai seperti dalam rajah:

    Laluan ke avatar akan direkodkan dalam medan ini, dan ia akan disimpan dalam folder berasingan, mari kita panggil ia "avatar". Folder akan terletak dalam direktori yang sama dengan fail skrip yang lain.

    3. Pergi ke fail jimat_ pengguna. php dan tambah kod berikut selepas mengalih keluar ruang daripada log masuk dan kata laluan:

    //alih keluar ruang tambahan
    $log masuk = trim($log masuk);

    // Tambah baru ********************************************

    //tambah semak untuk panjang log masuk dan kata laluan
    if (strlen($login)< 3 or strlen($login) > 15) {
    exit("Log masuk mesti mengandungi sekurang-kurangnya 3 aksara dan tidak lebih daripada 15.");
    }
    if (strlen($password)< 3 or strlen($password) > 15) {
    exit("Kata laluan mestilah sekurang-kurangnya 3 aksara dan tidak lebih daripada 15.");
    }

    if (!empty($_POST["fupload"])) //semak sama ada pengguna telah menghantar imej
    {
    $fupload=$_POST["fupload"]; $fupload = trim($fupload);
    jika ($fupload =="" atau kosong($fupload)) (
    unset($fupload);// jika pembolehubah $fupload kosong, maka padamkannya
    }
    }
    jika (!isset($fupload) atau kosong($fupload) atau $fupload =="")
    {
    //jika pembolehubah tidak wujud (pengguna tidak menghantar imej), kemudian berikannya gambar yang telah disediakan terlebih dahulu dengan tulisan "tiada avatar"
    $avatar = "avatars/net-avatara.jpg"; //anda boleh melukis net-avatara.jpg atau mengambilnya daripada sumber
    }
    lain
    {
    //jika tidak - muatkan imej pengguna
    $path_to_90_directory = "avatars/";//folder tempat imej awal dan salinan termampatnya akan dimuatkan

    If(preg_match("/[.](JPG)|(jpg)|(gif)|(GIF)|(png)|(PNG)$/",$_FILES["fupload"]["name"])) //menyemak format imej sumber
    {
    $nama fail = $_FILES["fupload"]["nama"];
    $source = $_FILES["fupload"]["tmp_name"];
    $target = $path_to_90_directory . $nama fail;
    move_uploaded_file($source, $target);//memuat naik yang asal ke folder $path_to_90_directory
    if(preg_match("/[.](GIF)|(gif)$/", $filename)) (
    $im = imagecreatefromgif($path_to_90_directory.$filename) ; //jika yang asal dalam format gif, kemudian buat imej dalam format yang sama. Diperlukan untuk pemampatan seterusnya
    }
    if(preg_match("/[.](PNG)|(png)$/", $nama fail)) (
    $im = imagecreatefrompng($path_to_90_directory.$filename) ;//jika yang asal dalam format png, kemudian buat imej dalam format yang sama. Diperlukan untuk pemampatan seterusnya
    }

    If(preg_match("/[.](JPG)|(jpg)|(jpeg)|(JPEG)$/", $filename)) (
    $im = imagecreatefromjpeg($path_to_90_directory.$filename); //jika yang asal dalam format jpg, kemudian buat imej dalam format yang sama. Diperlukan untuk pemampatan seterusnya
    }
    //PENCIPTAAN IMEJ SEKOLAH DAN PEMAMPATAN SETERUSNYA DIAMBIL DARI LAMAN www.codenet.ru
    // Cipta petak 90x90
    // dest - imej yang terhasil
    // w - lebar imej
    // nisbah - pekali perkadaran
    $w = 90; // persegi 90x90. Boleh dibekalkan dalam saiz lain.
    // cipta imej asal berdasarkan
    // fail sumber dan tentukan saiznya
    $w_src = imagesx($im); //kira lebar
    $h_src = imagesy($im); //kira ketinggian imej
    // buat imej segi empat sama kosong
    // truecolor adalah penting!, jika tidak, kita akan mendapat hasil 8-bit
    $dest = imagecreatetruecolor($w,$w);
    // potong tengah segi empat sama sepanjang x jika foto itu mendatar
    jika ($w_src>$h_src)
    imagecopyresampled($dest, $im, 0, 0,
    bulat((maks($w_src,$h_src)-min($w_src,$h_src))/2),
    0, $w, $w, min($w_src,$h_src), min($w_src,$h_src));
    // potong bahagian atas segi empat sama sepanjang y,
    // jika foto menegak (walaupun anda juga boleh menggunakan bahagian tengah)
    jika ($w_src<$h_src)
    imagecopyresampled($dest, $im, 0, 0, 0, 0, $w, $w,
    min($w_src,$h_src), min($w_src,$h_src));
    // imej segi empat sama berskala tanpa keratan
    jika ($w_src==$h_src)
    imagecopyresampled($dest, $im, 0, 0, 0, 0, $w, $w, $w_src, $w_src);
    $tarikh=masa(); //kira masa semasa.
    imagejpeg($dest, $path_to_90_directory.$date.".jpg");//simpan imej dalam format jpg ke folder yang dikehendaki, nama akan menjadi masa semasa. Dibuat untuk menghalang avatar daripada mempunyai nama yang sama.
    //mengapa jpg? Ia mengambil sedikit ruang + animasi imej GIF, yang mengalih perhatian pengguna, dimusnahkan. Ia tidak begitu menyenangkan untuk membaca ulasannya apabila anda melihat beberapa pergerakan dari sudut mata anda.
    $avatar = $path_to_90_directory.$date.".jpg";//letakkan laluan ke avatar ke dalam pembolehubah.
    $delfull = $path_to_90_directory.$nama fail;
    nyahpaut ($delfull);//padamkan imej asal yang dimuat naik, kami tidak memerlukannya lagi. Tugasnya adalah untuk mendapatkan miniatur.
    }
    lain
    {
    //sekiranya format tidak sepadan, keluarkan mesej yang sepadan
    exit("Avatar mestilah dalam format JPG, GIF atau PNG");
    }
    //akhir proses pemuatan dan berikan pembolehubah $avatar alamat ava yang dimuatkan
    }



    // menambah ********************************************** baharu **
    // Seterusnya datang segala-galanya dari bahagian pertama artikel, tetapi anda perlu menambah perubahan pada pertanyaan kepada pangkalan data.
    //sambung ke pangkalan data
    // semak kewujudan pengguna dengan log masuk yang sama
    $result = mysql_query("SELECT id FROM users WHERE login="$login"",$db);
    jika (!kosong ($myrow["id"])) (
    exit("Maaf, log masuk yang anda masukkan sudah didaftarkan. Sila masukkan log masuk lain.");
    }
    // jika ini tidak berlaku, maka simpan data
    $result2 = mysql_query("INSERT INTO users (login,password,avatar) VALUES("$login","$password","$avatar")");
    // Semak jika terdapat ralat
    jika ($result2=="TRUE")
    {
    echo "Anda telah berjaya mendaftar! Kini anda boleh memasuki tapak. Laman Utama";
    }
    lain (
    echo "Ralat! Anda tidak berdaftar.";
    }
    ?>

    4. Anda perlu menambah satu jadual ke pangkalan data yang sama. Ia akan menyimpan alamat IP yang membuat ralat semasa log masuk. Dengan cara ini kita boleh mengehadkan akses kepada mereka yang melakukan kesilapan lebih daripada tiga kali berturut-turut selama kira-kira 15 minit. Saya rasa program yang memilih kata laluan perlu bermain-main untuk masa yang lama.
    Mari pergi ke phpmyadmin dan buat jadual baharu dengan 3 medan:


    ip - alamat IP.
    tarikh - tarikh log masuk yang tidak berjaya selama 15 minit terakhir untuk pengguna dengan ip ini. col - bilangan ralat sepanjang 15 minit terakhir untuk pengguna dengan ip ini.
    Hebat! Selesai, sekarang mari tukar fail pengesahan log masuk dan kata laluan, kerana sekarang kata laluan kami disulitkan. Buka testreg.php dan padamkan segala-galanya selain mengalih keluar ruang daripada log masuk dan kata laluan. Seterusnya kami menambah kod berikut:

    //alih keluar ruang tambahan
    $log masuk = trim($log masuk);
    $kata laluan = trim($kata laluan);

    // ganti dengan yang baru********************************************** *******
    // sambung ke pangkalan data
    include("bd.php");// fail bd.php mesti berada dalam folder yang sama dengan semua yang lain, jika tidak, ubah sahaja laluan
    // semak mini untuk pemilihan kata laluan
    $ip=getenv("HTTP_X_FORWARDED_FOR");
    jika (kosong($ip) || $ip=="tidak diketahui") ( $ip=getenv("REMOTE_ADDR"); )//ekstrak ip
    mysql_query ("DELETE FROM oshibka WHERE UNIX_TIMESTAMP() - UNIX_TIMESTAMP(date) > 900");//delete alamat IP pengguna yang membuat kesilapan semasa log masuk selepas 15 minit.
    $result = mysql_query("SELECT col FROM oshibka WHERE ip="$ip"",$db); // dapatkan daripada pangkalan data bilangan percubaan log masuk yang tidak berjaya sepanjang 15 terakhir untuk pengguna dengan ip tertentu
    $myrow = mysql_fetch_array($result);
    jika ($myrow["col"] > 2) (
    //jika terdapat lebih daripada dua ralat, iaitu tiga, maka kami mengeluarkan mesej.
    exit("Anda memasukkan nama pengguna atau kata laluan anda dengan salah sebanyak 3 kali. Sila tunggu 15 minit sebelum mencuba lagi.");
    }
    $password = md5($password);//encrypt kata laluan
    $password = strrev($password);// untuk kebolehpercayaan, tambahkan terbalik
    $kata laluan = $kata laluan."b3p6f";
    //anda boleh menambah beberapa aksara anda sendiri mengikut citarasa anda, contohnya, dengan memasukkan "b3p6f". Jika kata laluan ini digodam dengan kekerasan pada pelayan md5 yang sama, maka jelas tidak ada kebaikan yang akan datang daripadanya. Tetapi saya menasihati anda untuk meletakkan watak lain, mungkin di awal baris atau di tengah.
    //Dalam kes ini, adalah perlu untuk menambah panjang medan kata laluan dalam pangkalan data. Kata laluan yang disulitkan mungkin lebih besar.

    $result = mysql_query("SELECT * FROM users WHERE login="$login" AND password="$password"",$db); //ambil daripada pangkalan data semua data tentang pengguna dengan log masuk dan kata laluan yang dimasukkan
    $myrow = mysql_fetch_array($result);
    jika (kosong ($myrow["id"))
    {
    //jika pengguna dengan log masuk dan kata laluan yang dimasukkan tidak wujud
    //Kami membuat rekod bahawa ip ini tidak dapat log masuk.
    $select = mysql_query("SELECT ip FROM oshibka WHERE ip="$ip"");
    $tmp = mysql_fetch_row($select);
    if ($ip == $tmp) (//semak jika pengguna berada dalam jadual "oshibka".
    $result52 = mysql_query("SELECT col FROM oshibka WHERE ip="$ip"",$db);
    $myrow52 = mysql_fetch_array($result52);
    $col = $myrow52 + 1;//tambah satu lagi percubaan log masuk yang tidak berjaya
    mysql_query("KEMASKINI SET ralat col=$col,date=NOW() WHERE ip="$ip"");
    }
    lain (
    mysql_query("INSERT INTO oshibka (ip,date,col) NILAI ("$ip",NOW(),"1")");
    //jika tiada ralat dalam 15 minit yang lalu, kemudian masukkan entri baharu ke dalam jadual "oshibka"
    }

    exit("Maaf, nama pengguna atau kata laluan yang anda masukkan salah.");
    }
    lain (
    nbsp; //jika kata laluan sepadan, maka kami melancarkan sesi untuk pengguna! Anda boleh mengucapkan tahniah kepadanya, dia masuk!
    $_SESSION["kata laluan"]=$myrow["kata laluan"];
    $_SESSION["log masuk"]=$myrow["log masuk"];
    $_SESSION["id"]=$myrow["id"];//data ini digunakan dengan kerap, jadi pengguna yang log masuk akan "membawanya bersamanya"

    //Seterusnya kami menyimpan data dalam kuki untuk log masuk seterusnya.
    //PERHATIAN!!! LAKUKAN INI MENGIKUT KEBIJAKAN ANDA KERANA DATA DISIMPAN DALAM COOKIES TANPA PENELITIAN
    jika ($_POST["simpan"] == 1) (
    //Jika pengguna mahu datanya disimpan untuk log masuk berikutnya, maka kami menyimpannya dalam kuki penyemak imbasnya
    setcookie("log masuk", $_POST["log masuk"], masa()+9999999);
    setcookie("kata laluan", $_POST["kata laluan"], masa()+9999999);
    }}
    bergema" ";//kami mengubah hala pengguna ke halaman utama, di mana kami akan memberitahunya tentang log masuk yang berjaya
    ?>

    5. Kami akan menukar sepenuhnya halaman utama. Ia adalah perlu untuk memaparkan avatar pengguna padanya, memaparkan pautan untuk log keluar daripada akaun dan menambah kotak pilihan untuk mengingati kata laluan semasa log masuk.
    Index.php

    // keseluruhan prosedur berfungsi dalam sesi. Ia adalah tempat data pengguna disimpan semasa dia berada di tapak. Ia adalah sangat penting untuk melancarkannya pada awal halaman!!!
    session_start();
    include("bd.php");// fail bd.php mesti berada dalam folder yang sama dengan semua yang lain, jika tidak, ubah sahaja laluan
    jika (!kosong($_SESSION["log masuk"]) dan !kosong($_SESSION["kata laluan"]))
    {
    //jika terdapat log masuk dan kata laluan dalam sesi, kemudian semak mereka dan dapatkan avatar
    $log masuk = $_SESSION["log masuk"];
    $kata laluan = $_SESSION["kata laluan"];
    $result = mysql_query("SELECT id,avatar FROM users WHERE login="$login" AND password="$password"",$db);
    $myrow = mysql_fetch_array($result);
    //ekstrak data pengguna yang diperlukan
    }
    ?>


    Laman utama


    Laman utama

    jika (!isset($myrow["avatar"]) atau $myrow["avatar"]=="") (
    //semak sama ada data pengguna telah diekstrak daripada pangkalan data. Jika tidak, maka dia tidak log masuk, atau kata laluan dalam sesi itu tidak betul. Kami memaparkan tetingkap log masuk. Tetapi kami tidak akan memaparkannya kepada mereka yang masuk, mereka tidak lagi memerlukannya.
    cetak<<


    DI SINI;

    Jika (isset($_COOKIE["log masuk"])) //adakah terdapat pembolehubah dengan log masuk dalam COOKIE. Ia sepatutnya jika pengguna mengklik pada kotak semak "Ingat saya" semasa log masuk sebelumnya
    {
    //jika ya, kemudian masukkan nilainya ke dalam borang. Dalam kes ini, pengguna ditunjukkan bahawa log masuknya telah dimasukkan ke dalam lajur yang diperlukan
    echo " value="".$_COOKIE["log masuk"]."">";
    }

    cetak<<




    DI SINI;

    Jika (isset($_COOKIE["kata laluan"]))//sama ada terdapat pembolehubah dengan kata laluan dalam COOKIE. Ia sepatutnya jika pengguna mengklik pada kotak semak "Ingat saya" semasa log masuk sebelumnya
    {
    //jika ya, kemudian masukkan nilainya ke dalam borang. Dalam kes ini, pengguna ditunjukkan bahawa kata laluannya telah dimasukkan ke dalam lajur yang diperlukan
    echo " value="".$_COOKIE["kata laluan"]."">";
    }

    Cetak<<



    Ingat saya.






    Daftar



    Anda telah log masuk sebagai tetamu

    DI SINI;
    }
    lain
    {
    //jika log masuk berjaya, pengguna diberikan segala-galanya di bawah antara asterisk.

    cetak<<
    Anda log masuk ke tapak sebagai $_SESSION (keluar)


    Pautan ini hanya tersedia untuk pengguna berdaftar

    Avatar anda:




    DI SINI;

    //************************************************************************************
    //jika log masuk berjaya, pengguna diberikan semua yang terletak DI ATAS antara asterisk.
    }
    ?>



    6. Ia adalah perlu untuk membolehkan pengguna log masuk log keluar. Sudah ada pautan untuk keluar pada halaman utama. Tetapi fail ini belum wujud lagi. Jadi mari kita buat fail baharu exit.php dengan kod:

    session_start();
    jika (kosong($_SESSION["log masuk"]) atau kosong($_SESSION["kata laluan"]))
    {
    //jika tiada sesi dengan log masuk dan kata laluan, maka fail ini telah diakses oleh pengguna yang tidak log masuk. Dia bukan milik di sini. Kami mengeluarkan mesej ralat dan menghentikan skrip
    exit ("Akses ke halaman ini hanya dibenarkan kepada pengguna berdaftar. Jika anda berdaftar, kemudian log masuk ke tapak menggunakan nama pengguna dan kata laluan anda
    Halaman utama");
    }

    unset($_SESSION["kata laluan"]);
    unset($_SESSION["log masuk"]);
    unset($_SESSION["id"]);// musnahkan pembolehubah dalam sesi
    keluar (" ");
    // menghantar pengguna ke halaman utama.
    ?>

    OK semuanya sudah berakhir Sekarang! Nikmati untuk kesihatan anda! Semoga berjaya!

    • Terjemahan
    • Tutorial

    Salah satu inovasi paling hebat dalam PHP 5.4 ialah pelayan terbina dalam, dicipta khusus untuk pembangunan dan ujian. Kini anda boleh menulis dan menguji kod anda tanpa mempunyai pelayan web penuh - cuma mulakan pelayan terbina dalam, uji kod anda dan tutupnya apabila anda selesai.
    Pelayan juga menyediakan peluang untuk penggunaan kreatif. Sebagai contoh, anda boleh mengedarkan aplikasi web mudah alih pada CD atau USB, atau malah sebagai aplikasi desktop yang dibina dalam PHP tanpa menggunakan GTK atau perpustakaan grafik lain.

    Manual PHP menekankan bahawa pelayan terbina dalam bertujuan untuk pembangunan dan disyorkan untuk tidak menggunakannya pada pelayan pengeluaran. Tiada arahan INI yang bertanggungjawab untuk pelayan (kecuali untuk mewarnakan output dalam konsol), dan nampaknya idea utama dokumentasi ialah: "kami kini juga mempunyai pelayan Web, tinggalkan kami sendiri."
    Walaupun begitu, saya percaya bahawa pelayan terbenam boleh menjadi alat yang berharga untuk pembangunan dan ujian. Sebagai contoh, pada mesin saya, saya menggunakan Apache yang diprapasang dengan konfigurasi tersuai yang sesuai dengan saya, tetapi kadangkala saya ingin mencuba beberapa aplikasi Web baharu. Dengan pelayan web terbina dalam, saya boleh menguji aplikasi terus dari folder muat turun atau folder sementara dan mengalihkannya ke persekitaran biasa hanya apabila perlu.
    Tetapi sebagai permulaan, ia tidak begitu mudah, kerana banyak aplikasi bertulis menggunakan .htaccess dan mod_rewrite. Tetapi saya pasti seseorang (mungkin salah seorang daripada anda, mengapa tidak?) akan menulis penyesuai untuk ini, dan saya ingin menjadi yang pertama untuk mengujinya.
    Dalam artikel ini, saya akan menerangkan beberapa kegunaan asas pelayan terbenam dan menunjukkan kepada anda cara menjadikannya berguna untuk pembangunan dan ujian.

    Kami menggunakan pelayan terbina dalam

    Jadi, untuk menggunakan pelayan kita memerlukan php 5.4 atau lebih tinggi. Untuk menyemak versi PHP, jalankan:
    php -v
    Anda juga boleh menentukan sama ada pelayan tersedia dalam binaan anda dengan menjalankan:
    php -h
    dan cari di sana penerangan tentang parameter "-S" dan "-t", yang digunakan hanya untuk pelayan.
    Untuk menguji pelayan, anda boleh mencipta fail index.php dalam direktori semasa, yang akan mengandungi panggilan ke fungsi phpinfo() dan kemudian mulakan pelayan:
    $ php -S 127.0.0.1:8080 PHP 5.4.0RC7 Pelayan Pembangunan bermula pada Jum Feb 26 18:49:29 2012 Mendengar pada 127.0.0.1:8080 Pukar dokumen ialah /home/ec2-user Tekan Ctrl-C untuk berhenti.
    Dan kini anda boleh melihat kandungan yang dihantar oleh pelayan web terbina dalam:

    Setiap permintaan pelanggan akan ditulis ke konsol:
    80.180.55.37:36318 : / 80.180.55.37:36584 : /
    Kembali, mari kita lihat parameter baris arahan "-S", yang digunakan untuk menentukan alamat dari mana pelayan akan boleh diakses. Nilai yang mungkin:
    localhost- pelayan hanya boleh diakses dari mesin tempatan,
    0.0.0.0 - pada mana-mana antara muka mesin,
    Mana-mana IP luaran atau kelabu- hanya pada IP yang ditentukan
    Pilihan "-t" menetapkan direktori yang ditentukan kepada "akar direktori". Sebagai contoh:
    $php -S :8090 -t /home/ec2-user/public
    Selain itu,. anda boleh menentukan nama fail penghala tertentu. Sebagai contoh:
    $ php -S >localhost atau IP awam anda>:8080 -t /home/ec2-user/public public/index.php
    Output penghala ini akan dihuraikan dan dilaksanakan oleh pelayan. Contoh mudah:
    Selamat datang ke PHP

    ";
    Jika skrip mengembalikan FALSE, maka URI yang diminta akan diproses oleh pelayan, yang sama ada akan mengembalikan sumber yang diminta atau mengembalikan ralat 404. Jika skrip mengembalikan apa-apa lagi, output skrip akan dihantar kepada klien.
    Walaupun pendekatan ini memberi kami lebih kawalan, terdapat beberapa perkara yang perlu anda ketahui. Pertama, pelayan PHP hanya menyediakan set pengepala HTTP minimum:
    Sambungan: ditutup Jenis Kandungan: text/html Hos: aws-dev-01.vtardia.com X-Powered-By: PHP/5.4.0RC7 D
    Mari kita bandingkan ini dengan pengepala yang dikembalikan oleh pelayan Apache:
    Julat Terima: bait Sambungan: Keep-Alive Content-Length: 631 Content-Type: text/html Tarikh: Sab, 04 Feb 2012 18:24:42 GMT Etag: "bbb99-277-4ace8c5470a40" Keep-Alive: tamat masa= 15, maks=100 Terakhir Diubah Suai: Rab, 14 Sep 2011 15:54:09 GMT Pelayan: Apache/2.2.21 (Unix) DAV/2
    Jika aplikasi anda menggunakan pengepala, maka ia mesti mengambil kira perbezaan dalam persekitaran pembangunan dan dalam pengeluaran.
    Kedua, pelayan terbina dalam mempunyai SAPI (Server API) yang berbeza. Oleh itu, dengan melakukan penghalaan dalam indeks, php, anda boleh menentukan sama ada skrip sedang diakses pada pelayan ujian atau pengeluaran. php_sapi_name() akan mengembalikan "cli-server" pada pelayan terbina dalam:
    Terdapat satu arahan INI khas - "cli_server.color". Arahan ini mengembalikan output berwarna ke konsol. Buat fail kosong bernama cli-server.ini dan tampal baris ini:
    cli_server.color = on
    Anda boleh mencipta konfigurasi persekitaran yang unik untuk pelayan anda dengan menyatakan arahan yang diperlukan dalam fail INI anda. Arahan yang tidak diisytiharkan akan menggunakan nilai lalainya. Kini kami telah mengisytiharkan hanya satu arahan - cli_server.color.
    Mulakan pelayan dengan parameter "-c" yang menentukan fail INI:
    $ php -S localhost -c cli-server.ini
    Jika terminal anda menyokong warna, anda akan dapat melihat output "warna" dalam konsol. Status 200 akan diserlahkan dalam warna hijau, status 404 akan diserlahkan dalam oren, dan ralat skrip akan diserlahkan dengan warna merah.

    Mencipta pelayan peribadi

    Sekarang setelah anda mengetahui semua yang perlu diketahui tentang pelayan terbenam, mari lakukan sesuatu yang menarik. Mari buat pelayan mudah alih kita sendiri!
    Saya akan mulakan dengan struktur berikut untuk aplikasi kami:

    Folder "perpustakaan" mengandungi kod aplikasi, "awam" ialah direktori akar, mengandungi index.php dan beberapa fail statik. Perhatian khusus dalam tutorial ini akan diberikan kepada folder "pelayan", dan oleh itu aplikasi kami akan terdiri daripada "Hello Word!" dan beberapa imej dan css.
    Matlamat kami adalah untuk dapat memulakan pelayan dari direktori aplikasi dengan satu arahan, dan pelayan kami akan menjaga penghalaan, pengepala HTTP dan ralat.
    $./start.sh
    Mari lihat skrip permulaan:
    #! /bin/bash INIFILE="$(pwd)/server/server.ini" DOCROOT="$(pwd)/public" ROUTER="$(pwd)/server/router.php" HOST=0.0.0.0 PORT=8080 PHP=$(php yang mana) jika [ $? != 0 ] ; kemudian echo "Tidak dapat mencari PHP" keluar 1 fi $PHP -S $HOST:$PORT -c $INIFILE -t $DOCROOT $ROUTER
    Saya mengandaikan skrip dijalankan dari direktori aplikasi, jadi INIFILE, DOCROOT, ROUTER ditakrifkan menggunakan pwd. Laluan ke php ditentukan menggunakan arahan which. Jika php tidak ditemui dalam $PATH pengguna, skrip akan gagal.
    Ini berfungsi dengan baik, tetapi mari berikan pengguna keupayaan untuk menukar mana-mana parameter yang diberikan daripada baris arahan, sebagai contoh:
    jika [! -z $INIFIL ]; kemudian INIFILE="$(pwd)/server/server.ini" fi
    Mari teruskan, folder "ralat" mengandungi fail untuk mesej ralat HTTP. Berikut ialah contoh tentang ralat 403: walaupun saya hanya menggunakan HTML, skrip akan disambungkan, saya gunakan termasuk jadi anda boleh menggunakan mana-mana kod php:
    403

    403 Terlarang

    Maaf, sumber yang diminta tidak boleh diakses.



    Sekarang mari kita lihat router.php. Tujuan fail ini adalah untuk menerima dan mengurus semua permintaan dan menghantarnya ke pelayan hanya jika fail ini wujud. Semua halaman ralat dipaparkan dengan menyambungkan templat.
    Dalam baris pertama saya mentakrifkan beberapa parameter global, seperti DIRECTORY_INDEX, direktori dengan templat ralat. Parameter date_default_timezone_set() mesti sepadan dengan tetapan OS, jika tidak, akan terdapat ketidakkonsistenan antara entri dalam log dan pada pelayan. Saya juga menambah senarai alamat IP yang dibenarkan untuk meningkatkan keselamatan.
    Fungsi logAccess() adalah perlu kerana apabila skrip penghalaan menerima permintaan, log pelayan diabaikan secara lalai. Fungsi ini hanya menerima kod status, dan format output sepadan sepenuhnya dengan format pelayan.
    Tugas pertama kami ialah pemeriksaan keselamatan. Jika IP pelanggan tiada dalam tatasusunan IP yang dibenarkan, kami memaparkan mesej ralat dan menamatkan skrip. Kami perlu memberikan kod status selain daripada 200 dan fungsi header() tidak akan berfungsi di sini, jadi kami menggunakan fungsi baharu - http_response_code.
    Jika IP pelanggan berada dalam tatasusunan IP yang dibenarkan, maka langkah seterusnya ialah mendapatkan laluan dan sambungan fail yang diminta. Jika sambungan kosong, kami menganggap bahawa pengguna meminta folder dan membina laluan menggunakan DIRECTORY_INDEX yang ditakrifkan dahulu.
    Akhir sekali, jika fail yang diminta wujud, kami mengembalikan FALSE dan membenarkan pelayan mengakses fail tersebut. Jika tidak, mesej ralat 404 dipaparkan.

    Ringkasan

    Itu sahaja. Seperti yang anda lihat, pelayan php mudah digunakan. Pelayan peribadi kami sangat mudah. Kod ini boleh dioptimumkan dan disertakan dalam kelas yang lebih kompleks dan berfungsi. Selamat mengekod!

    p.s. Saya dengan senang hati akan menerima kritikan dan komen mengenai terjemahan dalam mesej peribadi.

    Tatasusunan superglobal $_SERVER

    Salah satu tatasusunan pratakrif yang paling penting ialah tatasusunan $_SERVER - jurubahasa PHP meletakkan pembolehubah yang diterima daripada pelayan ke dalamnya. Tanpa pembolehubah ini, sukar untuk mengatur sokongan penuh untuk aplikasi Web. Di bawah ialah perihalan elemen terpenting bagi tatasusunan superglobal $_SERVER.

    Komen

    Anda boleh melihat senarai penuh elemen tatasusunan $_SERVER sama ada menggunakan fungsi print_r(), yang mencetak longgokan tatasusunan, atau menggunakan fungsi phpinfo(), yang memaparkan maklumat tentang penterjemah PHP.

    Elemen $_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".

    elemen $_SERVER["HTTP_ACCEPT"].

    Elemen $_SERVER["HTTP_ACCEPT"] menerangkan pilihan jenis dokumen pelanggan. Kandungan elemen ini diambil daripada pengepala Terima HTTP yang dihantar oleh klien ke pelayan. Kandungan pengepala ini mungkin kelihatan seperti ini

    imej/gif, imej/x-xbitmap, imej/jpeg, imej/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/msword, */*

    Pengepala Terima membolehkan anda menentukan jenis media yang pelanggan suka terima sebagai tindak balas kepada permintaannya. Pengepala ini membolehkan pelayan mengetahui bahawa respons terhad kepada set kecil jenis pilihan.

    Simbol * digunakan untuk mengumpulkan jenis dalam siri media. Sebagai contoh, simbol */* menentukan penggunaan semua jenis, dan jenis tatatanda/* menentukan penggunaan semua subjenis jenis jenis yang dipilih.

    Komen

    Jenis media dipisahkan dengan koma.

    Setiap siri media juga dicirikan oleh set parameter tambahan. Salah satunya ialah apa yang dipanggil pekali keutamaan relatif q, yang mengambil nilai dari 0 hingga 1, masing-masing, daripada jenis yang kurang diutamakan kepada yang lebih disukai. Menggunakan berbilang parameter q membolehkan pelanggan memberitahu pelayan keutamaan relatifnya untuk jenis media tertentu.

    Komen

    Secara lalai, parameter q ialah 1. Ia juga dipisahkan daripada jenis media oleh koma bertitik.

    Contoh pengepala Terima:

    Terima: audio/*; q=0.2, audio/asas

    Dalam pengepala ini, jenis pertama ialah audio/*, yang merangkumi semua dokumen muzik dan dicirikan oleh pekali keutamaan 0.2. Dipisahkan dengan koma, jenis audio/asas ditunjukkan, yang mana pekali keutamaan tidak ditentukan dan mengambil nilai lalai satu. Memetik RFC2616, tajuk ini boleh ditafsirkan seperti berikut: "Saya lebih suka jenis audio/asas, tetapi saya juga boleh menghantar dokumen dari mana-mana jenis audio lain, jika ada, selepas mengurangkan faktor keutamaan lebih daripada 80%."

    Contoh mungkin lebih kompleks.

    Terima: teks / biasa; q=0.5, teks/html,
    teks/x-dvi; q=0.8, teks/x-c

    Komen

    Ambil perhatian bahawa elemen $_SERVER["HTTP_ACCEPT"] mengandungi maklumat yang sama, tetapi tanpa pengepala Accept awal.

    Pengepala ini ditafsirkan seperti berikut: Jenis dokumen teks/html dan teks/x-c lebih disukai, tetapi jika ini tidak tersedia, maka pelanggan yang membuat permintaan ini akan memilih teks/x-dvi, dan, jika tidak tersedia, ia mungkin menerima jenis teks/ biasa.

    Elemen $_SERVER["HTTP_ACCEPT_LANGUAGE"]

    Elemen $_SERVER["HTTP_ACCEPT_LANGUAGE"] menerangkan pilihan bahasa klien. Maklumat ini diekstrak daripada pengepala HTTP Accept-Language yang dihantar oleh klien ke pelayan. Contoh berikut boleh diberikan:

    Terima-Bahasa: ru, en; q=0.7

    Yang boleh ditafsirkan seperti berikut: pelanggan lebih suka bahasa Rusia, tetapi jika ia tidak tersedia, dia bersetuju untuk menerima dokumen dalam bahasa Inggeris. Elemen $_SERVER["HTTP_ACCEPT_LANGUAGE"] akan mengandungi maklumat yang sama, tetapi tanpa pengepala Accept-Language:

    ru, en; q=0.7

    Kandungan elemen $_SERVER["HTTP_ACCEPT_LANGUAGE"] boleh digunakan untuk menentukan kewarganegaraan pelawat. Walau bagaimanapun, hasilnya akan menjadi anggaran, kerana ramai pengguna menggunakan versi bahasa Inggeris pelayar, yang akan memberitahu pelayan bahawa pelawat memilih hanya satu bahasa - Bahasa Inggeris.

    Elemen $_SERVER["HTTP_HOST"]

    Elemen $_SERVER["HTTP_HOST"] mengandungi nama pelayan, yang biasanya sepadan dengan nama domain tapak yang terletak pada pelayan. Biasanya, nama yang dinyatakan dalam parameter ini adalah sama dengan nama $_SERVER["SERVER_NAME"]. Parameter mengandungi hanya nama domain tanpa nama protokol (http://), i.e.

    www.sofftime.ru

    Elemen $_SERVER["HTTP_REFERER"]

    Elemen $_SERVER["HTTP_REFERER"] mengandungi alamat halaman dari mana pelawat datang ke halaman ini. Peralihan mesti dilakukan melalui pautan. Mari buat dua halaman index.php dan page.php.

    halaman index.php

    bergema "Pautan ke halaman PHP
    "
    ;
    gema .
    $_SERVER["HTTP_REFERER"]
    ?>

    Halaman page.php akan mempunyai kandungan yang serupa, tetapi pautan akan menghala ke halaman index.php.

    Halaman halaman.php

    bergema "Pautan ke halaman PHP
    "
    ;
    bergema "Kandungan $_SERVER["HTTP_REFERER"] - ".
    $_SERVER["HTTP_REFERER"]
    ?>

    Apabila berpindah dari satu halaman ke halaman lain, alamat halaman dari mana peralihan dibuat akan dipaparkan di bawah pautan.

    Elemen $_SERVER["HTTP_USER_AGENT"]

    Elemen $_SERVER["HTTP_USER_AGENT"] mengandungi maklumat tentang jenis dan versi penyemak imbas dan sistem pengendalian pelawat.

    Berikut ialah kandungan biasa baris ini: "Mozilla/4.0 (serasi; MSIE 6.0; Windows NT 5.1)". Kehadiran subrentetan "MSIE 6.0" menunjukkan bahawa pelawat sedang melihat halaman menggunakan Internet Explorer versi 6.0. Baris "Windows NT 5.1" menunjukkan bahawa sistem pengendalian ialah Windows XP.

    Komen

    Untuk Windows 2000, elemen $_SERVER["HTTP_USER_AGENT"] kelihatan seperti ini: "Mozilla/4.0 (serasi; MSIE 5.01; Windows NT 5.0)"), manakala untuk Windows XP ia kelihatan seperti "Mozilla/4.0 (serasi; MSIE 6.0) ;Windows NT 5.1)".

    Jika pelawat menggunakan penyemak imbas Opera, kandungan $_SERVER["HTTP_USER_AGENT"] mungkin kelihatan seperti ini: "Mozilla/4.0 (serasi; MSIE 5.0; Windows 98) Opera 6.04 ". Substring "MSIE 6.0" juga terdapat di sini, menunjukkan bahawa penyemak imbas Opera serasi dengan pelayar Internet Explorer dan menggunakan perpustakaan dinamik Windows yang sama. Oleh itu, apabila menganalisis rentetan yang dikembalikan oleh penyemak imbas, anda harus ingat bahawa Internet Explorer merujuk kepada rentetan yang mengandungi subrentetan "MSIE 6.0" dan tidak mengandungi subrentetan "Opera". Di samping itu, dari baris ini kita boleh membuat kesimpulan bahawa pengguna menggunakan sistem pengendalian Windows 98.

    Komen

    Ejen pengguna pelayar Firefox mungkin kelihatan seperti ini: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8) Gecko/20051111 Firefox/1.5.

    Apabila menggunakan penyemak imbas Netscape, kandungan elemen $_SERVER["HTTP_USER_AGENT"] mungkin kelihatan seperti ini: "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030624 Netscape/7.1" . Kepunyaan pelayar ini boleh ditentukan dengan kehadiran subrentetan "Netscape". Di samping itu, anda boleh mengetahui bahawa pelawat mengakses Internet menggunakan versi operasi Linux, dengan kernel yang dioptimumkan untuk Pentium IV, semasa dalam cangkerang grafik X-Window. Mekanisme ini mudah digunakan untuk mengumpul maklumat statistik, yang membolehkan pereka bentuk mengoptimumkan halaman untuk pelayar yang paling biasa.

    Elemen $_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);
    ?>

    Elemen $_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".

    Elemen $_SERVER["SERVER_NAME"]

    Elemen $_SERVER["SERVER_NAME"] mengandungi nama pelayan, yang biasanya sepadan dengan nama domain tapak yang terletak di atasnya. Sebagai contoh,

    www.softtime.ru

    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 - " . $_SERVER["SERVER_NAME"]. "
    " ;
    bergema "Alamat IP pelayan - ". $_SERVER["SERVER_ADDR"]. "
    " ;
    echo "Port pelayan - " . $_SERVER["SERVER_PORT"]. "
    " ;
    echo "Pelayan web - " . $_SERVER["SERVER_SOFTWARE"]. "
    " ;
    bergema "Versi protokol HTTP - ". $_SERVER["SERVER_PROTOCOL"]. "
    " ;
    ?>

    Elemen $_SERVER["REQUEST_METHOD"]

    Elemen $_SERVER["REQUEST_METHOD"] mengandungi kaedah permintaan yang digunakan untuk memanggil skrip: GET atau POST.