Koja je razlika između HTTP_HOST i SERVER_NAME u PHP -u? PHP globalni niz $ _SERVER Dohvaćanje varijable okruženja HTTP_X_FORWARDED_FOR
$ _SERVER jedan je od najvažnijih unaprijed definiranih nizova u PHP -u. Sadrži varijable primljene od poslužitelja od strane PHP tumača. Svi su koristili ove varijable ili će ih definitivno koristiti jer je bez njih prilično teško organizirati potpunu podršku za web aplikacije.
U svom članku predlažem tablicu s glavnim varijablama $ _SERVER superglobalnog niza. Tablica je slična onoj za PHP string funkcije.
Da biste vidjeli sve elemente niza $ _SERVER, trebate: a) pozvati funkciju print_r () koja će ispisati niz; b) ili pozovite funkciju phpinfo () koja će prikazati informacije o PHP interpreteru.
Ukratko o $ HTTP_SERVER_VARS
Superglobalni niz $ _SERVER zamjenjuje niz $ HTTP_SERVER_VARS u PHP 4.1.0. $ HTTP_SERVER_VARS sada se ne koristi, ali vrijedi znati o tome. Prije svega, stara verzija nije bila autoglobalna. Druga je razlika u tome što neki elementi niza $ _SERVER ne postoje u $ HTTP_SERVER_VARS, iako su u većini slučajeva njihove varijable iste.
Element |
Kratki opis |
Primjer |
$ _SERVER ["DOCUMENT_ROOT"] |
Sadrži put do korijenskog direktorija poslužitelja. |
|
$ _SERVER ["HTTP_HOST"] $ _SERVER ["SERVER_NAME"] |
||
$ _SERVER ["SCRIPT_FILENAME"] |
Sadrži naziv skripte, počevši od korijenskog direktorija virtualnog hosta. |
C: \ mapa \ index.php /www/folder/index.php |
$ _SERVER ["PHP_SELF"] $ _SERVER ["SCRIPT_NAME"] |
Sadrži naziv skripte. |
|
$ _SERVER ["REQUEST_URI"] |
Sadrži naziv skripte, počevši od korijenskog direktorija domaćina tvrtke, kao i parametre proslijeđene GET metodom. |
/www/folder/index.php?page=2&num=5 |
$ _SERVER ["QUERY_STRING"] |
Sadrži parametre proslijeđene skripti metodom GET. |
Za adresu http://site.com/index.php?page=2&num=5 bit će ispisan |
$ _SERVER ["REQUEST_METHOD"] |
Sadrži metodu zahtjeva koja se koristi za dozivanje skripte. |
DOBITI ili POST |
$ _SERVER ["HTTP_REFERER"] |
Sadrži adresu stranice s koje je posjetitelj došao. |
http://yandex.ru/yandsearch |
$ _SERVER ["HTTP_USER_AGENT"] |
Sadrži vrstu i verziju preglednika i operacijskog sustava posjetitelja. Također može otkriti robote za pretraživanje i marku mobitela. Ispod je usporedba marke telefona i njegove šifre u nizu. Nokia - NOKIJA; Sony Ericsson - ERICSSON ili SONYERICSSON; Samsung - SAMSUNG ili SEC-; Motorola - MOT; LG - LG ili LG-; Alcatel - ALCATEL; Panasonic - PANASONIC; Sagem - SAGEM; Pantech - PANTECH; Siemens - SIE; BenQ - BENQ; NEC - NEC; Oštro - OŠTRO. |
Mozilla / 4.0 (kompatibilno; MSIE 6.0; Windows NT 5.1) ( IE 6iWindows XP) Mozilla / 4.0 (kompatibilno; MSIE 7.0; Windows NT 5.0) Opera 9.50 ( Opera 9.5iWindows 2000) |
$ _SERVER ["REMOTE_ADDR"] |
Sadrži IP adresu klijenta. |
|
$ _SERVER ["SERVER_ADDR"] |
Sadrži IP adresu poslužitelja. |
|
$ _SERVER ["HTTP_ACCEPT"] |
Opisuje sklonost klijenta prema vrsti dokumenta. Sadržaj ovog elementa preuzima se iz zaglavlja Prihvati HTTP koje klijent prosljeđuje poslužitelju. Izlazni format: MIME tip [[; q], drugi MIME tip [; q] ...] Može postojati nekoliko željenih MIME vrsta, a zatim su odvojene zarezima. * koristi se za postavljanje predloška, grupiranje. q - koeficijent preferencije, prema zadanim postavkama 1, kreće se od 0 do 1. |
image / jpeg, image / x-xbitmap, aplikacija / x-shockwave-flash image / *; q = 0,5, slika / jpeg (preferira zhpeg od svih ostalih formata) |
$ _SERVER ["HTTP_ACCEPT_LANGUAGE"] |
Slično prethodnom elementu, ali povezano s jezičnim preferencijama. Može se koristiti za utvrđivanje nacionalnosti posjetitelja. No, procjena će biti približna, jer neki ljudi vole koristiti engleske inačice preglednika |
ru, en; q = 0,9 (preferira se ruski, ali ako ga nema - bit će i engleski) |
$ _SERVER ["HTTP_ACCEPT_CHARSET"] |
Slično prethodnim. Sadrži zaglavlje Accept-Charset |
|
$ _SERVER ["HTTP_ACCEPT_ENCODING"] |
Slično prethodnim. Sadrži zaglavlje Accept-Encoding |
|
$ _SERVER ["SERVER_PORT"] |
Sadrži poslušački port poslužitelja. |
|
$ _SERVER ["SERVER_SOFTWARE"] |
Sadrži podatke o web poslužitelju. |
Apache / 2.2.4 (Win32) |
$ _SERVER ["SERVER_PROTOCOL"] |
Sadrži verziju HTTP protokola. |
|
$ _SERVER ["GATEWAY_INTERFACE"] |
Sadrži verziju CGI -a koju koristi web poslužitelj. |
|
$ _SERVER ["REQUEST_TIME"] |
Vrijeme početka zahtjeva web stranice u UNIX formatu. Dostupno od PHP 5.1.0 |
Puna adresa stranice s parametrima:
echo "http: //" .SERVER_NAME. $ _ SERVER ["REQUEST_URI"];
?>
Tablica sa svim funkcijama može se preuzeti s veze u * .doc formatu.
Obratite posebnu pozornost na varijablu $ _SERVER ["REQUEST_URI"] i ne zaboravite je provjeriti! Stvar je u tome da njegova uporaba možda nije osobito sigurna. Na primjer, na vašoj web lokaciji neki se URL -ovi generiraju pomoću ovog parametra. Zatim možete upisati vezu http://site.com/index.php u redak preglednika? ”>... Ovo će otvoriti prozor koji prikazuje sadržaj datoteke kolačića. Ovaj je primjer bezopasan, ali je rupa kroz koju haker može iskoristiti proboj, na primjer, za krađu podataka od drugog korisnika. Stoga - provjerite ima li varijabla nevažećih znakova, osobito> i<.
Za danas, možda, sve. Do sljedećeg puta i sretan vikend!
JavaScript je blokiran u vašem pregledniku. Omogućite JavaScript da web stranica radi!
Superglobalni niz $ _SERVER
U niz $ _SERVER PHP tumač stavlja varijable primljene od poslužitelja. Bez ovih varijabli teško je pružiti potpunu podršku web aplikacijama. Slijedi opis najvažnijih elemenata superglobalnog niza $ _SERVER.
Komentar
Polje (=> uključeno => 200 => uključeno => htmlweb.ru => https => 443 => zatvori => Mozilla /5.0 (kompatibilno; 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 => [zaštićena e -pošta]=>. php => 35242 => /php/funkcija/$_server.php => CGI /1.1 => HTTP /1.0 => DOBIJI => => /php/funkcija/%24_server.php => /index.php => /index.php => 1560059525.711 => 1560059525) 1
$ _SERVER [" DOCUMENT_ROOT"]
Element $ _SERVER ["DOCUMENT_ROOT"] sadrži put do korijenskog direktorija poslužitelja, ako se skripta izvršava na virtualnom hostu, ovaj element sadrži put do korijenskog direktorija virtualnog hosta. Oni. u konfiguracijskoj datoteci httpd.conf virtualni host ima direktivu DocumentRoot, kojoj je dodijeljena vrijednost "D: / main", element $ _SERVER ["DOCUMENT_ROOT"] će sadržavati vrijednost "D: main".
$ _SERVER [" DALJINSKI_ADDR"]
Element $ _SERVER ["REMOTE_ADDR"] sadrži IP adresu klijenta. Prilikom testiranja na lokalnom stroju, ova adresa bit će 127.0.0.1. Međutim, pri testiranju na mreži, varijabla će vratiti IP adresu klijenta ili posljednjeg proxy poslužitelja preko kojeg je klijent došao do poslužitelja. Ako klijent koristi proxy poslužitelj, njegovu IP adresu možete saznati pomoću varijable okruženja HTTP_X_FORWARDED_FOR, čija se vrijednost može dobiti pomoću funkcije getenv ().
Komentar
Proxy poslužitelji su posebni posrednički poslužitelji koji pružaju posebnu vrstu usluge: kompresiju prometa, šifriranje podataka, prilagodbu za mobilne uređaje itd. Među mnogim proxy poslužiteljima razlikuju se takozvani anonimni proxy poslužitelji koji vam omogućuju skrivanje prave IP adrese klijenta; takvi poslužitelji ne vraćaju varijablu okruženja HTTP_X_FORWARDED_FOR.
Izdvajanje varijable okoline HTTP_X_FORWARDED_FOR
echo @getenv (HTTP_X_FORWARDED_FOR);
$ _SERVER [" SCRIPT_FILENAME"]
Element $ _SERVER ["SCRIPT_FILENAME"] sadrži apsolutni put do datoteke iz korijena diska. Dakle, ako poslužitelj ima operacijski sustav Windows, onda bi ova staza mogla izgledati ovako "d: main estindex.php", tj. put je naveden s diska, u operacijskom sustavu sličnom UNIX-u put je naveden iz korijenskog direktorija/, na primjer, "/var/share/www/test/index.php".
/var/www/htmlweb/data/www/site/index.php
$ _SERVER [" SERVER_NAME"]
Element $ _SERVER ["SERVER_NAME"] sadrži naziv poslužitelja, u pravilu isti kao i naziv domene web stranice koja se na njemu nalazi. Na primjer,
Sadržaj elementa $ _SERVER ["SERVER_NAME"] često je isti kao sadržaj elementa $ _SERVER ["HTTP_HOST"]. Osim naziva poslužitelja, superglobalni niz $ _SERVER omogućuje vam da saznate brojne parametre poslužitelja, na primjer, IP adresu poslužitelja, port za slušanje, koji je web poslužitelj instaliran i verziju HTTP protokola . Ti se podaci nalaze u $ _SERVER ["SERVER_ADDR"], $ _SERVER ["SERVER_PORT"], $ _SERVER ["SERVER_SOFTWARE"] i $ _SERVER ["SERVER_PROTOCOL"], respektivno. Ispod je primjer korištenja ovih stavki.
Korištenje elemenata niza $ _SERVER
echo "Naziv poslužitelja je". $ _ SERVER ["SERVER_NAME"]. ""; echo" IP poslužitelja je ". $ _ SERVER [" SERVER_ADDR "]."
"; echo" Ulaz poslužitelja je ". $ _ SERVER [" SERVER_PORT "]."
"; echo" Web poslužitelj - ". $ _ SERVER [" SERVER_SOFTWARE "]."
"; echo" Verzija HTTP protokola - ". $ _ SERVER [" SERVER_PROTOCOL "]."
";
Naziv poslužitelja - web mjesto
IP poslužitelja - 185.12.92.137
Ulaz poslužitelja - 80
Web poslužitelj-Apache / 2.4.25 (Debian) mpm-itk / 2.4.7-04 OpenSSL / 1.0.2l
Verzija HTTP protokola - HTTP / 1.0
$ _SERVER [" REQUEST_METODA"]
Element $ _SERVER ["REQUEST_METHOD"] sadrži metodu zahtjeva koja se koristi za pozivanje skripte: GET ili POST.
Ponovite odjeljak $ _SERVER ["REQUEST_METHOD"];
$ _SERVER [" QUERY_STRING"]
Element $ _SERVER ["QUERY_STRING"] sadrži parametre proslijeđene skripti ako je niz upita adresa
Na primjer, kada se misli na:
element $ _SERVER ["QUERY_STRING"] sadržavat će sav tekst iza znaka "?":
Ponovite odjeljak $ _SERVER ["QUERY_STRING"];
id = 1 & test = mokro & id_theme = 512
$ _SERVER [" PHP_SELF"]
Element $ _SERVER ["PHP_SELF"] sadrži naziv skripte, počevši od korijenskog direktorija virtualnog hosta, tj. ako je niz upita adresa http://www.mysite.ru/test/index.php?id=1&test=wet&id_theme=512 tada će element $ _SERVER ["PHP_SELF"] sadržavati isječak "/test/index.php"... Obično se isti fragment postavlja u element $ _SERVER ["SCRIPT_NAME"].
$ _SERVER [" REQUEST_URI"]
Element $ _SERVER ["REQUEST_URI"] sadrži naziv skripte, počevši od korijenskog direktorija virtualnog hosta i parametre, tj. ako je niz upita adresa: http://www.mysite.ru/test/index.php?id=1&test=wet&id_theme=512 tada će element $ _SERVER ["REQUEST_URI"] sadržavati isječak "/test/index.php?id=1&test=wet&id_theme=512"... Da biste vratili punu adresu u skripti, koja se nalazi u retku upita, dovoljno je koristiti kombinaciju elemenata niza $ _SERVER, dolje prikazanih
Puna adresa scenarija
echo "http: //". $ _ SERVER ["SERVER_NAME"]. $ _ SERVER ["REQUEST_URI"];- Prijevod
- Vodič
Jedna od najhladnijih novih značajki u php 5.4 je ugrađeni poslužitelj izgrađen posebno za razvoj i testiranje. Sada možete pisati i testirati svoj kôd bez potpunog web poslužitelja - samo pokrenite ugrađeni poslužitelj, testirajte svoj kôd i isključite ga kad završite.
Poslužitelj također pruža mogućnost kreativne uporabe. Na primjer, možete distribuirati prijenosnu web aplikaciju na CD -u ili USB -u ili čak kao stolnu aplikaciju ugrađenu u PHP bez upotrebe GTK -a ili drugih grafičkih biblioteka.
PHP priručnik naglašava da je ugrađeni poslužitelj namijenjen razvoju i da se preporučuje da se ne koristi na proizvodnom poslužitelju. Ne postoje INI direktive odgovorne za poslužitelj (osim obojenja izlaza u konzoli), a čini se da je glavna ideja dokumentacije: "Sada imamo i web poslužitelj, ostavite nas na miru."
Bez obzira na to, vjerujem da ugrađeni poslužitelj može biti vrijedan alat za razvoj i testiranje. Na primjer, na svom računalu koristim unaprijed instalirani Apache s prilagođenom konfiguracijom koja mi odgovara, ali ponekad želim isprobati neke nove web aplikacije. Pomoću ugrađenog web poslužitelja mogu testirati aplikaciju izravno iz mape za preuzimanje ili privremene mape i premjestiti je u normalno okruženje samo po potrebi.
No za početak, to nije tako jednostavno jer mnoge pisane aplikacije koriste .htaccess i mod_rewrite. Ali siguran sam da će netko (možda netko od vas, zašto ne?) Napisati adapter za ovo, a ja bih želio biti prvi koji će ga testirati.
U ovom ću članku objasniti neke osnovne primjere korištenja ugrađenog poslužitelja i pokazati vam kako ga učiniti korisnim za razvoj i testiranje.
Koristimo ugrađeni poslužitelj
Dakle, za korištenje poslužitelja potreban nam je php 5.4 ili noviji. Da biste provjerili verziju PHP -a, pokrenite:php -v
Također možete utvrditi je li poslužitelj dostupan u vašem sklopu tako što ćete pokrenuti:
php -h
i tamo potražite opis opcija "-S" i "-t", koje se koriste samo za poslužitelj.
Da biste provjerili poslužitelj, možete stvoriti datoteku index.php u trenutnom direktoriju, koja će sadržavati poziv na funkciju phpinfo (), a zatim pokrenuti poslužitelj:
$ php -S 127.0.0.1:8080 PHP 5.4.0RC7 Razvojni poslužitelj počeo je u pet, 26. veljače 18:49:29 2012 Slušanje na 127.0.0.1:8080 Korijen dokumenta je / home / ec2-user Pritisnite Ctrl-C za izlaz.
Sada možete vidjeti sadržaj koji poslužuje ugrađeni web poslužitelj:
Svaki zahtjev klijenta bit će napisan na konzolu:
80.180.55.37:36318 : /
80.180.55.37:36584 : /
Vraćajući se, pogledajmo parametar naredbenog retka "-S", koji se koristi za navođenje adrese s koje će poslužitelj biti dostupan. Moguće vrijednosti:
localhost- poslužitelju će biti dostupan samo s lokalnog računala,
0.0.0.0
- na bilo kojem sučelju stroja,
Bilo koji vanjski ili sivi IP- samo na navedenom IP -u
Opcija -t postavlja navedeni korijen direktorija. Na primjer:
$ php -S
Osim,. možete odrediti naziv određene datoteke usmjerivača. Na primjer:
$ php -S> localhost ili vaš javni IP>: 8080 -t / home / ec2 -user / public public / index.php
Poslužitelj će raščlaniti i izvršiti izlaz ovog usmjerivača. Jednostavan primjer:
Dobro došli u PHP
Ako skripta vrati FALSE, poslužitelj će obraditi traženi URI, koji će izdati traženi resurs ili će vratiti grešku 404. Ako skripta vrati bilo što drugo, izlaz skripte bit će proslijeđen klijentu.
Iako nam ovaj pristup daje veću kontrolu, morate znati nekoliko stvari. Prvo, PHP poslužitelj šalje samo minimalni skup HTTP zaglavlja:
Veza: zatvorena-Content-Type: text / html Domaćin: aws-dev-01.vtardia.com X-Powered-By: PHP / 5.4.0RC7 D
Usporedite ovo sa zaglavljima koja vraća Apache poslužitelj:
Prihvatljivi rasponi: bajtovi Veza: Keep-Alive Sadržaj-Trajanje: 631-Content-Type: text / html Datum: Sat, 04 Feb 2012 18:24:42 GMT Etag: "bbb99-277-4ace8c5470a40" Keep-Alive: timeout = 15, max = 100 Zadnja izmjena: sri, 14. rujna 2011. 15:54:09 GMT Poslužitelj: Apache / 2.2.21 (Unix) DAV / 2
Ako vaša aplikacija koristi zaglavlja, tada mora uzeti u obzir razliku u razvojnom i proizvodnom okruženju.
Drugo, ugrađeni poslužitelj ima drugačiji SAPI (API poslužitelja). Dakle, izvođenjem usmjeravanja u index, php možete definirati poziv skripti na testnom ili proizvodnom poslužitelju. php_sapi_name () vratit će "cli-server" na ugrađenom poslužitelju:
Postoji jedna posebna INI direktiva koja se zove "cli_server.color". Ova direktiva vraća obojeni izlaz na konzolu. Napravite praznu datoteku s imenom cli-server.ini i umetnite ovaj redak:
cli_server.color = uključeno
Možete stvoriti jedinstvenu konfiguraciju okruženja za svoj poslužitelj navođenjem potrebnih direktiva u vašoj INI datoteci. Neprijavljene direktive prihvatit će svoje zadane vrijednosti. Sada smo proglasili samo jednu direktivu - cli_server.boja.
Pokrenite poslužitelj s parametrom "-c" koji navodi INI datoteku:
$ php -S localhost -c cli -server.ini
Ako vaš terminal podržava boje, tada biste trebali moći vidjeti "obojeni" izlaz na konzoli. Status 200 bit će označen zelenom bojom, 404 narančastom bojom, a pogreške skripte bit će označene crvenom bojom.
Izrađujemo osobni poslužitelj
Sada kada znate sve što trebate znati o ugrađenom poslužitelju, učinimo nešto super. Kreirajmo vlastiti prijenosni poslužitelj!Počet ću sa sljedećom strukturom naše aplikacije:
![](https://i1.wp.com/habrastorage.org/storage2/7c8/481/6a7/7c84816a7c395af5b240fcc4708c8209.jpg)
Mapa knjižnice sadrži kôd aplikacije, public je korijenski direktorij, sadrži index.php i neke statičke datoteke. Ovaj vodič će se usredotočiti na mapu "poslužitelj", pa će se naša aplikacija sastojati od jednostavnog "Hello Word!" i nekoliko slika i css.
Naš je cilj moći pokrenuti poslužitelj iz direktorija aplikacija s jednom naredbom, a naš će se poslužitelj pobrinuti za usmjeravanje, HTTP zaglavlja i pogreške.
$ ./start.sh
Pogledajmo početnu skriptu:
#! /bin /bash INIFILE = "$ (pwd) /server/server.ini" DOCROOT = "$ (pwd) /public" ROUTER = "$ (pwd) /server/router.php" HOST = 0.0.0.0 PORT = 8080 PHP = $ (koji php) ako [$? ! = 0]; zatim odjekni "Nije moguće pronaći PHP" izlaz 1 fi $ PHP -S $ HOST: $ PORT -c $ INIFILE -t $ DOCROOT $ ROUTER
Pretpostavljam da se skripta pokreće iz direktorija aplikacije, pa su INIFILE, DOCROOT, ROUTER definirani pomoću pwd -a. Put do php -a određuje se pomoću naredbe which. Ako php nije pronađen u korisnikovom $ PATH, skripta neće uspjeti s pogreškom.
Ovo radi dovoljno dobro, ali dajmo korisniku mogućnost da promijeni bilo koji od zadanih parametara iz naredbenog retka, na primjer:
ako [! -z $ INIFILE]; tada INIFILE = "$ (pwd) /server/server.ini" fi
Nadalje, mapa "pogreške" sadrži datoteke za HTTP poruke o pogreškama. Evo primjera greške 403: iako sam koristio samo HTML, skripta će biti uključena, ja je koristim uključuju pa možete koristiti bilo koji php kod:
403 Zabranjeno
Nažalost, traženi resurs nije dostupan.
Pogledajmo sada router.php. Zadatak ove datoteke je primiti i upravljati svim zahtjevima te ih prenijeti na poslužitelj samo ako ta datoteka postoji. Spajanjem predloška prikazuju se sve stranice s pogreškama.
U prvim retcima definiram neke globalne parametre kao što je DIRECTORY_INDEX, direktorij s predlošcima pogrešaka. Parametar date_default_timezone_set () mora odgovarati postavkama OS -a, u protivnom će doći do nedosljednosti između unosa u zapisniku i na poslužitelju. Dodao sam i popis dopuštenih IP adresa radi poboljšanja sigurnosti.
Funkcija logAccess () neophodna je jer kada skripta usmjeravanja prihvati zahtjev, dnevnik poslužitelja se prema zadanim postavkama zanemaruje. Funkcija prihvaća samo statusni kôd, a izlazni format u potpunosti je u skladu s formatom poslužitelja.
Naš prvi zadatak je provjera sigurnosti. Ako IP klijenta nije u nizu dopuštenih IP adresa, prikažite poruku o pogrešci i izađite iz skripte. Moramo dati statusni kod osim 200 i funkcija header () ovdje neće raditi, pa koristimo novu funkciju - http_response_code.
Ako je IP klijenta u nizu dopuštenih IP adresa, naš sljedeći korak je dobiti traženu putanju i datotečni nastavak. Ako je proširenje prazno, pretpostavljamo da korisnik traži mapu i gradi put pomoću DIRECTORY_INDEX -a koji je prvo definiran.
Konačno, ako tražena datoteka postoji, vratite FALSE i dopustite poslužitelju da pogleda datoteku. Ako nije, prikazuje se poruka o pogrešci 404.
Sažetak
To je sve. Kao što vidite, php poslužitelj je jednostavan za korištenje. Naš osobni poslužitelj je vrlo jednostavan. Kôd se može optimizirati i ugraditi u složenije i funkcionalnije klase. Sretno kodiranje!p.s. Rado ću prihvatiti kritike i komentare na prijevod u osobno.
I to je ono što je klijent zapravo koristio kao "ciljno domaćinstvo" zahtjeva. SERVER_NAME je definiran u konfiguraciji poslužitelja. Koja ovisi o tome što vam treba. Sada biste trebali shvatiti da je to vrijednost koju kontrolira klijent, pa stoga ne može biti pouzdana za upotrebu u poslovnoj logici, a druga je vrijednost koju kontrolira poslužitelj, koja je pouzdanija. Međutim, morate biti sigurni da web poslužitelj ima ispravnu konfiguraciju SERVER_NAME. Uzimajući za primjer Apache HTTPD, evo izvatka iz njegove dokumentacije:
Ako ServerName nije navedeno, tada poslužitelj pokušava zaključiti ime hosta izvršavanjem obrnutog pretraživanja IP adrese. Ako nijedan port nije naveden u ServerName, poslužitelj će koristiti port iz dolaznog zahtjeva. Za optimalnu pouzdanost i predvidljivost morate navesti izričit naziv hosta i port pomoću smjernice ServerName.
Osvježiti: nakon provjere Pekkinog odgovora na vaše pitanje koje sadrži vezu na bobinčev odgovor da će PHP uvijek vratiti vrijednost HTTP_HOST za SERVER_NAME, što je u suprotnosti s mojim vlastitim iskustvom s PHP 4.x + Apache HTTPD 1.2.x od prije nekoliko godina, Otpuhnuo sam prašinu sa svog trenutnog XAMPP -a u sustavu Windows XP (Apache HTTPD 2.2.1 s PHP 5.2.8), pokrenuo ga, stvorio PHP stranicu koja ispisuje obje vrijednosti, stvorio Java testnu aplikaciju koristeći URLConnection za promjenu zaglavlja hosta, a testovi su me naučili da je to doista (netočno) slučaj.
Nakon što smo prvo posumnjali na PHP i ukopali se u neke Prijavljivanje PHP grešakašto se tiče teme, otkrio sam da je korijen problema na web poslužitelju u upotrebi, da nije ispravno vratio zaglavlje HTTP hosta kada je zatražen SERVER_NAME. Pa sam se ukopao Apache HTTPD prijavljivanje pogrešaka koristeći razne ključne riječi u vezi s temom i konačno sam pronašao srodnu pogrešku. Ovo ponašanje uvedeno je otprilike oko Apache HTTPD 1.3. Morate uključiti direktivu UseCanonicalName u unosu
Ovo mi je upalilo.
Općenito, SERVER_NAME je pouzdaniji, ali vi ovisna u konfiguraciji poslužitelja!
HTTP_HOST ciljni je host poslan od strane klijenta. Korisnik može slobodno manipulirati korisnikom. Nije potrebno slati zahtjev na vaše web mjesto sa zahtjevom HTTP_HOST za vrijednost www.stackoverflow.com.
SERVER_NAME dolazi iz definicije poslužitelja VirtualHost i stoga se smatra pouzdanijim. Također se njime može izvana manipulirati pod određenim uvjetima koji se odnose na postavljanje vašeg web poslužitelja. Pogledaj ovo Ovo SO pitanje koji se bavi sigurnosnim aspektima obje opcije.
Ne morate se oslanjati da biste bili sigurni. Međutim, koji ćete koristiti doista ovisi o tome što želite učiniti. Ako želite odrediti na kojoj domeni vaša skripta radi, možete sigurno koristiti HTTP_HOST sve dok nevažeće vrijednosti koje dolaze od napadača ne mogu ništa slomiti.
Imajte na umu da ako želite koristiti IPv6, vjerojatno želite koristiti HTTP_HOST, a ne SERVER_NAME. Ako unesete http: // [:: 1] /, varijable okruženja su sljedeće:
HTTP_HOST = [:: 1] SERVER_NAME = :: 1
To znači da ako, na primjer, učinite mod_rewrite, mogli biste dobiti neugodan rezultat. Primjer SSL preusmjeravanja:
# SERVER_NAME NEĆE raditi - Preusmjeravanje na https: // :: 1 / RewriteRule. * Https: //% (SERVER_NAME) / # HTTP_HOST će raditi - Preusmjeravanje na https: // [:: 1] / RewriteRule. * Https: //% (HTTP_HOST) /
Ovo se SAMO primjenjuje ako poslužitelju pristupate bez imena hosta.
ako želite provjeriti putem server.php ili onoga što želite nazvati sa sljedećim:
Zatim pristupite svim važećim URL -ovima za svoju web lokaciju i provjerite razliku.
Trebalo mi je neko vrijeme da shvatim što ljudi misle pod "SERVER_NAME pouzdaniji". Koristim zajednički poslužitelj i nemam pristup direktivama o virtualnom hostu. Dakle, koristim mod_rewrite u .htaccessu za mapiranje različitih HTTP_HOST -ova u različitim direktorijima. U ovom slučaju ova vrijednost HTTP_HOST ima smisla.
Slična je situacija ako koristite virtualne hostove zasnovane na imenima: smjernica ServerName unutar virtualnog domaćina jednostavno kaže koje će ime hosta biti mapirano na taj virtualni host. Zaključak je da se u oba slučaja ime hosta koje klijent navede tijekom zahtjeva (HTTP_HOST) mora podudarati s imenom na poslužitelju koji se sam preslikava u direktorij. Je li mapiranje izvedeno pomoću direktiva virtualnog hosta ili s pravilima htaccess mod_rewrite ovdje je sporedno. U tim će slučajevima HTTP_HOST biti isti kao SERVER_NAME. Drago mi je da je Apache ovako konfiguriran.
Međutim, situacija se razlikuje od virtualnih hostova zasnovanih na IP-u. U ovom slučaju, i samo u ovom slučaju, SERVER_NAME i HTTP_HOST mogu biti različiti, jer sada klijent odabire poslužitelj prema IP -u, a ne prema imenu. Doista, mogu postojati posebne konfiguracije gdje je to važno.
Stoga ću od sada koristiti SERVER_NAME u slučaju da se moj kôd ugura u ove posebne konfiguracije.
Pod pretpostavkom da imate jednostavno postavljanje (CentOS 7, Apache 2.4.x i PHP 5.6.20) i samo jednu web stranicu (bez zajedničkog hostinga) ...
U PHP smislu, $ _SERVER ["SERVER_NAME"] je PHP element registriran u superklasi $ _SERVER na temelju vaše Apache konfiguracije (** ImeNoza ** s direktivom s UseCanonicalName Uključeno) u httpd.conf (bilo iz omogućene konfiguracije virtualnog hosta) datoteka, bilo što itd.). HTTP_HOST zaključuje se iz zaglavlja HTTP hosta. Tretirajte to kao korisnički unos. Filtrirajte i provjerite prije upotrebe.
Evo primjera gdje koristim $ _SERVER ["SERVER_NAME"] kao osnovu za svoju usporedbu. Sljedeća metoda je za određenu podređenu klasu, koju sam nazvao ServerValidator (dijete Validatora). ServerValidator provjerava šest ili sedam stavki u $ _SERVER -u prije njihove upotrebe.
Prilikom utvrđivanja je li HTTP zahtjev POST, koristim ovu metodu.
Javna funkcija jePOST () (return (($ this-> requestMethod === "POST") && // Zanemari $ this-> hasTokenTimeLeft () && // Zanemari $ this-> hasSameGETandPOSTIdentities () && // Ingore ($ this -> httpHost === filter_input (INPUT_SERVER, "SERVER_NAME"))));)
Do trenutka kada se ova metoda pozove, bit će obavljeno sve filtriranje i provjera valjanosti odgovarajućih elemenata $ _SERVER (i njihovih odgovarajućih skupova svojstava).
($ this-> httpHost === filter_input (INPUT_SERVER, "SERVER_NAME")
Provjerava da li se vrijednost $ _SERVER ["HTTP_HOST"] (u konačnici izvedena iz zatraženog zaglavlja HTTP hosta) podudara s $ _SERVER ["SERVER_NAME"].
Sada koristim superglobalni razgovor da objasnim svoj primjer, ali to je zato što neki ljudi nisu upoznati s INPUT_GET, INPUT_POST i INPUT_SERVER u odnosu na filter_input_array ().
Zaključak je da ne obrađujem POST zahtjeve na svom poslužitelju ako nisu ispunjena sva četiri uvjeta. Stoga, u smislu POST zahtjeva, odbijanje davanja zaglavlja HTTP hosta (prisutnost provjerena za ranije) doom uroke za stroge preglednike HTTP 1.0... Osim toga, traženi host mora odgovarati vrijednosti Ime poslužitelja u httpd.conf, a prema proširenju - vrijednost $ _SERVER ("SERVER_NAME") u nadmaklu $ _SERVER. Opet, koristio bih INPUT_SERVER s funkcijama PHP filtra, ali vi ste mi razbili drift.
Kao što je naglasio balusC, SERVER_NAME nije pouzdan i može se promijeniti u apache konfiguraciji, konfiguraciji poslužitelja i vatrozidu koji se možda nalazi između vas i poslužitelja.
Sljedeća funkcija uvijek vraća stvarni host (host upisan od strane korisnika) bez porta, a to je gotovo pouzdano:
Funkcija getRealHost () (list ($ realHost,) = explode (":", $ _ SERVER ["HTTP_HOST"]); return $ realHost;)
dijelitiZa početak ćemo poboljšati stranicu za registraciju dodavanjem mogućnosti učitavanja avatara. Originalna slika mora biti u jpg, gif ili png formatu. Također, ne smije biti veće od 2 MB. Ne brinite, nakon komprimiranja sa skriptom, avatar će biti veličine oko 3 kb i u jpg formatu. Otvorite stranicu reg.php i dodajte oznaku < oblik> crta enctype = "multipart / form-data" kao u primjeru: