Kakšna je razlika med HTTP_HOST in SERVER_NAME v PHP? PHP $ _SERVER Spremenljivka okolja za globalno pridobivanje matrike HTTP_X_FORWARDED_FOR
$ _SERVER je eden najpomembnejših vnaprej določenih nizov v PHP. Vsebuje spremenljivke, ki jih je od strežnika prejel tolmač PHP. Te spremenljivke so uporabljali vsi ali jih bodo zagotovo uporabili, saj je brez njih precej težko organizirati popolno podporo za spletne aplikacije.
V svojem članku predlagam tabelo z glavnimi spremenljivkami superglobalnega niza $ _SERVER. Tabela je podobna tisti, ki je narejena za funkcije niza PHP.
Če si želite ogledati vse elemente matrike $ _SERVER, morate: a) poklicati funkcijo print_r (), ki bo matriko natisnila; b) bodisi pokličite funkcijo phpinfo (), ki bo prikazala podatke o tolmaču PHP.
Na kratko o $ HTTP_SERVER_VARS
Superglobalni niz $ _SERVER nadomešča matriko $ HTTP_SERVER_VARS v PHP 4.1.0. $ HTTP_SERVER_VARS zdaj se ne uporablja, vendar je vredno vedeti o tem. Prvič, stara različica ni bila avtoglobalna. Druga razlika je v tem, da nekateri elementi niza $ _SERVER ne obstajajo v $ HTTP_SERVER_VARS, čeprav so v večini primerov njihove spremenljivke enake.
Element |
Kratek opis |
Primer |
$ _SERVER ["DOCUMENT_ROOT"] |
Vsebuje pot do korenskega imenika strežnika. |
|
$ _SERVER ["HTTP_HOST"] $ _SERVER ["SERVER_NAME"] |
||
$ _SERVER ["SCRIPT_FILENAME"] |
Vsebuje ime skripta, začenši od korenskega imenika navideznega gostitelja. |
C: \ mapa \ index.php /www/folder/index.php |
$ _SERVER ["PHP_SELF"] $ _SERVER ["SCRIPT_NAME"] |
Vsebuje ime skripta. |
|
$ _SERVER ["REQUEST_URI"] |
Vsebuje ime skripta, ki se začne od korenskega imenika gostitelja podjetja, in parametre, ki so mu posredovani z metodo GET. |
/www/folder/index.php?page=2&num=5 |
$ _SERVER ["QUERY_STRING"] |
Vsebuje parametre, posredovane skriptu z metodo GET. |
Za naslov http://site.com/index.php?page=2&num=5 bo izpisan |
$ _SERVER ["REQUEST_METHOD"] |
Vsebuje metodo zahteve, ki se uporablja za priklic skripta. |
DOBI ali POST |
$ _SERVER ["HTTP_REFERER"] |
Vsebuje naslov strani, s katere je prišel obiskovalec. |
http://yandex.ru/yandsearch |
$ _SERVER ["HTTP_USER_AGENT"] |
Vsebuje vrsto in različico brskalnika in operacijskega sistema obiskovalca. Prav tako lahko zazna iskalne robote in blagovno znamko mobilnega telefona. Spodaj je primerjava blagovne znamke telefona in njegove šifre v nizu. Nokia - NOKIJA; Sony Ericsson - ERICSSON ali SONYERICSSON; Samsung - SAMSUNG ali SEC-; Motorola - MOT; LG - LG ali LG-; Alcatel - ALCATEL; Panasonic - PANASONIC; Sagem - SAGEM; Pantech - PANTECH; Siemens - SIE; BenQ - BENQ; NEC - NEC; Sharp - SHARP. |
Mozilla / 4.0 (združljivo; MSIE 6.0; Windows NT 5.1) ( IE 6inWindows XP) Mozilla / 4.0 (združljivo; MSIE 7.0; Windows NT 5.0) Opera 9.50 ( Opera 9.5inWindows 2000) |
$ _SERVER ["REMOTE_ADDR"] |
Vsebuje odjemalčev naslov IP. |
|
$ _SERVER ["SERVER_ADDR"] |
Vsebuje naslov IP strežnika. |
|
$ _SERVER ["HTTP_ACCEPT"] |
Opisuje strankine želje glede vrste dokumenta. Vsebina tega elementa je pridobljena iz glave Accept HTTP, ki jo odjemalec posreduje strežniku. Izhodni format: MIME-tip [[; q], druga vrsta MIME [; q] ...] Prednostnih vrst MIME je lahko več, nato pa so ločene z vejicami. * se uporablja za nastavitev predloge, združevanja. q - prednostni koeficient, privzeto 1, se giblje od 0 do 1. |
image / jpeg, image / x-xbitmap, aplikacija / x-shockwave-flash image / *; q = 0,5, slika / jpeg (raje zpeg pred vsemi drugimi oblikami) |
$ _SERVER ["HTTP_ACCEPT_LANGUAGE"] |
Podobno kot prejšnji element, vendar povezano z jezikovnimi nastavitvami. Uporablja se lahko za določanje narodnosti obiskovalcev. Ocena pa bo približna, saj nekateri radi uporabljajo angleške različice brskalnikov |
ru, en; q = 0,9 (prednost za ruščino, če pa je ni - in bo ustrezala angleščina) |
$ _SERVER ["HTTP_ACCEPT_CHARSET"] |
Podobno kot pri prejšnjih. Vsebuje glavo Accept-Charset |
|
$ _SERVER ["HTTP_ACCEPT_ENCODING"] |
Podobno kot pri prejšnjih. Vsebuje glavo Accept-Encoding |
|
$ _SERVER ["SERVER_PORT"] |
Vsebuje vrata za poslušanje strežnika. |
|
$ _SERVER ["SERVER_SOFTWARE"] |
Vsebuje podatke o spletnem strežniku. |
Apache / 2.2.4 (Win32) |
$ _SERVER ["SERVER_PROTOCOL"] |
Vsebuje različico protokola HTTP. |
|
$ _SERVER ["GATEWAY_INTERFACE"] |
Vsebuje različico CGI, ki jo uporablja spletni strežnik. |
|
$ _SERVER ["REQUEST_TIME"] |
Začetni čas zahteve spletne strani v formatu UNIX. Na voljo od PHP 5.1.0 |
Celoten naslov strani s parametri:
echo "http: //" .SERVER_NAME. $ _ SERVER ["REQUEST_URI"];
?>
Tabelo z vsemi funkcijami lahko prenesete s povezave v formatu * .doc.
Bodite posebno pozorni na spremenljivko $ _SERVER ["REQUEST_URI"] in je ne pozabite preveriti! Bistvo je, da njegova uporaba morda ni posebej varna. Na primer, na vašem spletnem mestu se s tem parametrom ustvarijo nekateri URL -ji. Nato lahko v vrstico brskalnika napišete povezavo http://site.com/index.php? ”>... To bo odprlo okno, ki prikazuje vsebino datoteke piškotka. Ta primer je neškodljiv, vendar je luknja, skozi katero lahko heker izkoristi kršitev, na primer za krajo podatkov od drugega uporabnika. Zato preverite, ali ima spremenljivka neveljavne znake, zlasti> in<.
Za danes morda vse. Do naslednjič in lep vikend!
JavaScript je v vašem brskalniku blokiran. Če želite, da spletno mesto deluje, omogočite JavaScript!
Superglobalni niz $ _SERVER
V niz $ _SERVER Tolmač PHP vstavi spremenljivke, prejete od strežnika. Brez teh spremenljivk je težko zagotoviti popolno podporo za spletne aplikacije. Sledi opis najpomembnejših elementov superglobalnega niza $ _SERVER.
Komentiraj
Polje (=> vklopljeno => 200 => vklopljeno => htmlweb.ru => https => 443 => blizu => Mozilla /5.0 (združljivo; 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ščiteno po e -pošti]=>. 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"]
Element $ _SERVER ["DOCUMENT_ROOT"] vsebuje pot do korenskega imenika strežnika. Če se skript izvede v navideznem gostitelju, ta element vsebuje pot do korenskega imenika navideznega gostitelja. Tisti. v konfiguracijski datoteki httpd.conf ima navidezni gostitelj direktivo DocumentRoot, ki ji je dodeljena vrednost "D: / main", element $ _SERVER ["DOCUMENT_ROOT"] bo vseboval vrednost "D: main".
$ _SERVER [" REMOTE_ADDR"]
Element $ _SERVER ["REMOTE_ADDR"] vsebuje naslov IP odjemalca. Pri testiranju na lokalnem računalniku bo ta naslov 127.0.0.1. Pri preskušanju v omrežju pa bo spremenljivka vrnila naslov IP odjemalca ali zadnji strežnik proxy, prek katerega je odjemalec prišel do strežnika. Če odjemalec uporablja proxy strežnik, lahko njegov IP naslov ugotovite s spremenljivko okolja HTTP_X_FORWARDED_FOR, katere vrednost lahko dobite s funkcijo getenv ().
Komentiraj
Proxy strežniki so posebni vmesni strežniki, ki ponujajo posebno vrsto storitev: stiskanje prometa, šifriranje podatkov, prilagoditev za mobilne naprave itd. Med številnimi proxy strežniki se razlikujejo tako imenovani anonimni proxy strežniki, ki vam omogočajo, da skrijete pravi IP naslov odjemalca; takšni strežniki ne vrnejo spremenljivke okolja HTTP_X_FORWARDED_FOR.
Izvlečenje spremenljivke okolja HTTP_X_FORWARDED_FOR
echo @getenv (HTTP_X_FORWARDED_FOR);
$ _SERVER [" SCRIPT_FILENAME"]
Element $ _SERVER ["SCRIPT_FILENAME"] vsebuje absolutno pot do datoteke iz korena diska. Torej, če strežnik deluje pod operacijskim sistemom Windows, potem lahko ta pot izgleda tako "d: main estindex.php", tj. pot je podana z diska, v operacijskem sistemu, podobnem UNIX-u, je pot podana iz korenskega imenika/, na primer, "/var/share/www/test/index.php".
/var/www/htmlweb/data/www/site/index.php
$ _SERVER [" SERVER_NAME"]
Element $ _SERVER ["SERVER_NAME"] vsebuje ime strežnika, praviloma enako imenu domene spletnega mesta, ki se nahaja na njem. Na primer,
Vsebina elementa $ _SERVER ["SERVER_NAME"] je pogosto enaka vsebini elementa $ _SERVER ["HTTP_HOST"]. Poleg imena strežnika vam superglobalna matrika $ _SERVER omogoča, da ugotovite številne parametre strežnika, na primer naslov IP strežnika, vrata za poslušanje, kateri spletni strežnik je nameščen in različico protokola HTTP . Ti podatki so shranjeni v $ _SERVER ["SERVER_ADDR"], $ _SERVER ["SERVER_PORT"], $ _SERVER ["SERVER_SOFTWARE"] in $ _SERVER ["SERVER_PROTOCOL"]). Spodaj je primer uporabe teh elementov.
Uporaba elementov matrike $ _SERVER
echo "Ime strežnika je". $ _ SERVER ["SERVER_NAME"]. ""; echo" IP strežnika je ". $ _ SERVER [" SERVER_ADDR "]."
"; echo" Strežniška vrata so ". $ _ SERVER [" SERVER_PORT "]."
"; echo" Spletni strežnik - ". $ _ SERVER [" SERVER_SOFTWARE "]."
"; echo" Različica protokola HTTP - ". $ _ SERVER [" SERVER_PROTOCOL "]."
";
Ime strežnika - spletno mesto
IP strežnika - 185.12.92.137
Strežniška vrata - 80
Spletni strežnik-Apache / 2.4.25 (Debian) mpm-itk / 2.4.7-04 OpenSSL / 1.0.2l
Različica protokola HTTP - HTTP / 1.0
$ _SERVER [" REQUEST_METHOD"]
Element $ _SERVER ["REQUEST_METHOD"] vsebuje metodo zahteve, ki se uporablja za klicanje skripta: GET ali POST.
Odmev $ _SERVER ["REQUEST_METHOD"];
$ _SERVER [" QUERY_STRING"]
Element $ _SERVER ["QUERY_STRING"] vsebuje parametre, posredovane skriptu, če je niz poizvedbe naslov
Ko se na primer nanašate na:
element $ _SERVER ["QUERY_STRING"] bo vseboval vse besedilo za znakom "?":
Odmev $ _SERVER ["QUERY_STRING"];
id = 1 & test = mokro & id_theme = 512
$ _SERVER [" PHP_SELF"]
Element $ _SERVER ["PHP_SELF"] vsebuje ime skripta, začenši od korenskega imenika navideznega gostitelja, tj. če je niz poizvedbe naslov http://www.mysite.ru/test/index.php?id=1&test=wet&id_theme=512 potem bo element $ _SERVER ["PHP_SELF"] vseboval delček "/test/index.php"... Običajno je isti fragment postavljen v element $ _SERVER ["SCRIPT_NAME"].
$ _SERVER [" REQUEST_URI"]
Element $ _SERVER ["REQUEST_URI"] vsebuje ime skripta, ki se začne od korenskega imenika navideznega gostitelja in parametre, tj. če je niz poizvedbe naslov: http://www.mysite.ru/test/index.php?id=1&test=wet&id_theme=512 potem bo element $ _SERVER ["REQUEST_URI"] vseboval delček "/test/index.php?id=1&test=wet&id_theme=512"... Za obnovitev celotnega naslova v skriptu, ki je postavljen v vrstico poizvedbe, je dovolj, da uporabite kombinacijo elementov matrike $ _SERVER, predstavljeno spodaj
Celoten naslov skripta
echo "http: //". $ _ SERVER ["SERVER_NAME"]. $ _ SERVER ["REQUEST_URI"];- Prevajanje
- Vadnica
Ena najbolj kul novih funkcij v php 5.4 je vgrajen strežnik, zgrajen posebej za razvoj in testiranje. Zdaj lahko kodo napišete in preizkusite brez polnega spletnega strežnika - samo zaženite vdelani strežnik, preizkusite svojo kodo in jo končajte, ko končate.
Strežnik ponuja tudi priložnost za ustvarjalno uporabo. Na primer, prenosno spletno aplikacijo lahko distribuirate na CD -ju ali USB -ju ali celo kot namizno aplikacijo, vgrajeno v PHP, brez uporabe GTK -ja ali drugih grafičnih knjižnic.
Priročnik PHP poudarja, da je vgrajen strežnik namenjen razvoju in ga priporočamo, da ga ne uporabljate na strežniku za proizvodnjo. Za strežnik niso odgovorne direktive INI (razen obarvanja izhoda v konzoli) in zdi se, da je glavna ideja dokumentacije: "zdaj imamo tudi spletni strežnik, pustite nas pri miru."
Ne glede na to menim, da je vgrajen strežnik lahko dragoceno orodje za razvoj in testiranje. Na svojem računalniku na primer uporabljam vnaprej nameščen Apache s konfiguracijo po meri, ki mi ustreza, včasih pa želim preizkusiti nekaj novih spletnih aplikacij. Z vgrajenim spletnim strežnikom lahko aplikacijo preizkusim neposredno iz mape za prenos ali začasne mape in jo premaknem v običajno okolje le po potrebi.
Za začetek pa to ni tako enostavno, saj številne pisne aplikacije uporabljajo .htaccess in mod_rewrite. Prepričan pa sem, da bo nekdo (morda eden od vas, zakaj ne?) Za to napisal adapter, jaz pa bi ga rad prvi preizkusil.
V tem članku bom razložil nekaj osnovnih primerov uporabe vdelanega strežnika in vam pokazal, kako ga narediti uporabnega za razvoj in testiranje.
Uporabljamo vgrajen strežnik
Za uporabo strežnika potrebujemo php 5.4 ali novejši. Če želite preveriti različico PHP, zaženite:php -v
Ali je strežnik na voljo v sestavi, lahko ugotovite tudi tako, da zaženete:
php -h
in tam poiščite opis možnosti "-S" in "-t", ki se uporabljajo samo za strežnik.
Če želite preveriti strežnik, lahko v trenutnem imeniku ustvarite datoteko index.php, ki bo vsebovala klic funkcije phpinfo () in nato zagnala strežnik:
$ php -S 127.0.0.1:8080 Razvojni strežnik PHP 5.4.0RC7 se je začel v pet, 26. februar 18:49:29 2012 Poslušanje na 127.0.0.1:8080 Koren dokumenta je / home / ec2-user Pritisnite Ctrl-C za izhod.
Zdaj lahko vidite vsebino, ki jo ponuja vgrajeni spletni strežnik:
Vsaka zahteva odjemalca bo zapisana v konzolo:
80.180.55.37:36318 : /
80.180.55.37:36584 : /
Če se vrnemo, poglejmo parameter ukazne vrstice "-S", s katerim določimo naslov, s katerega bo strežnik dostopen. Možne vrednosti:
lokalni gostitelj- do strežnika bo dostopen samo z lokalnega računalnika,
0.0.0.0
- na katerem koli vmesniku stroja,
Vsak zunanji ali siv IP- samo na določenem IP -ju
Možnost -t nastavi podani koren imenika. Na primer:
$ php -S
Poleg tega ,. lahko določite ime določene datoteke usmerjevalnika. Na primer:
$ php -S> localhost ali vaš javni IP>: 8080 -t / home / ec2 -user / public public / index.php
Izhod tega usmerjevalnika bo razčlenil in izvedel strežnik. Preprost primer:
Dobrodošli v PHP
Če skript vrne vrednost FALSE, bo strežnik obdelal zahtevani URI, ki bo izdal zahtevani vir, ali pa bo vrnil napako 404. Če skript vrne karkoli drugega, se izhod skripta posreduje odjemalcu.
Čeprav nam ta pristop daje večji nadzor, morate vedeti nekaj stvari. Prvič, strežnik PHP pošlje le minimalen nabor naslovov HTTP:
Povezava: zaprta Vrsta vsebine: besedilo / html Gostitelj: aws-dev-01.vtardia.com X-Powered-By: PHP / 5.4.0RC7 D
Primerjajte to z glavami, ki jih vrne strežnik Apache:
Sprejemljivi obsegi: bajti Povezava: Keep-Alive Dolžina vsebine: 631 Vrsta vsebine: besedilo / html Datum: Sat, 04. februar 2012 18:24:42 GMT Etag: "bbb99-277-4ace8c5470a40" Keep-Alive: timeout = 15, max = 100 Zadnja sprememba: sreda, 14. september 2011 15:54:09 GMT Strežnik: Apache / 2.2.21 (Unix) DAV / 2
Če vaša aplikacija uporablja glave, mora upoštevati razlike v razvojnem in proizvodnem okolju.
Drugič, vgrajeni strežnik ima drugačen SAPI (API strežnika). Tako lahko z usmerjanjem v indeksu, php določite klic skripta na preskusnem ali produkcijskem strežniku. php_sapi_name () bo vrnil "cli-server" na vdelanem strežniku:
Obstaja ena posebna direktiva INI, imenovana "cli_server.color". Ta direktiva vrne barvni izhod na konzolo. Ustvarite prazno datoteko z imenom cli-server.ini in vstavi to vrstico:
cli_server.color = vklopljeno
Za strežnik lahko ustvarite edinstveno konfiguracijo okolja, tako da v datoteki INI podate potrebne direktive. Neprijavljene direktive bodo sprejele privzete vrednosti. Zdaj smo razglasili samo eno direktivo - cli_server.color.
Zaženite strežnik s parametrom "-c", ki določa datoteko INI:
$ php -S localhost -c cli -server.ini
Če vaš terminal podpira barve, bi morali videti "barvni" izhod v konzoli. Status 200 bo označen z zeleno, 404 z oranžno, napake v skriptu pa z rdečo.
Ustvarjamo osebni strežnik
Zdaj, ko veste vse, kar morate vedeti o vgrajenem strežniku, naredimo nekaj kul. Ustvarimo svoj prenosni strežnik!Začel bom z naslednjo strukturo naše aplikacije:
![](https://i1.wp.com/habrastorage.org/storage2/7c8/481/6a7/7c84816a7c395af5b240fcc4708c8209.jpg)
Mapa knjižnice vsebuje kodo aplikacije, javna je korenski imenik, vsebuje index.php in nekaj statičnih datotek. Ta vadnica se bo osredotočila na mapo "strežnik", zato bo naša aplikacija sestavljena iz preprostega "Hello Word!" in nekaj slik in css.
Naš cilj je, da lahko z enim ukazom zaženemo strežnik iz imenika aplikacij, naš strežnik pa bo poskrbel za usmerjanje, glave HTTP in napake.
$ ./start.sh
Oglejmo si zagonski skript:
#! /bin /bash INIFILE = "$ (pwd) /server/server.ini" DOCROOT = "$ (pwd) /public" ROUTER = "$ (pwd) /server/router.php" HOST = 0.0.0.0 PORT = 8080 PHP = $ (kateri php), če [$? ! = 0]; nato odmev "Ni mogoče najti PHP" izhod 1 fi $ PHP -S $ HOST: $ PORT -c $ INIFILE -t $ DOCROOT $ ROUTER
Predvidevam, da se skript izvaja iz imenika aplikacij, zato so INIFILE, DOCROOT, ROUTER definirani z uporabo pwd. Pot do php je določena z ukazom kateri. Če php ni bil najden v uporabnikovem $ PATH, potem skript ne uspe z napako.
To deluje dovolj dobro, vendar uporabniku dajmo možnost, da spremeni kateri koli od danih parametrov iz ukazne vrstice, na primer:
če [! -z $ INIFILE]; potem INIFILE = "$ (pwd) /server/server.ini" fi
Nadaljevanje mape "napake" vsebuje datoteke za sporočila o napakah HTTP. Tu je primer napake 403: čeprav sem uporabljal samo HTML, bo skript vključen, jaz pa ga uporabljam vključujejo zato lahko uporabite katero koli kodo php:
403 Prepovedano
Žal zahtevani vir ni dostopen.
Zdaj pa poglejmo router.php. Naloga te datoteke je sprejemati in upravljati vse zahteve ter jih prenesti na strežnik le, če ta datoteka obstaja. Vse strani z napakami se prikažejo s povezavo predloge.
V prvih vrsticah definiram nekatere globalne parametre, na primer DIRECTORY_INDEX, imenik s predlogami napak. Parameter date_default_timezone_set () se mora ujemati z nastavitvami OS, sicer bodo prišlo do nedoslednosti med vnosi v dnevnik in na strežnik. Dodal sem tudi seznam dovoljenih naslovov IP za izboljšanje varnosti.
Funkcija logAccess () je potrebna, ker ko usmerjevalni skript sprejme zahtevo, se dnevnik strežnika privzeto prezre. Funkcija sprejema le kodo stanja, izhodna oblika pa je popolnoma skladna s strežniško obliko.
Naša prva naloga je preveriti varnost. Če odjemalčev IP ni v polju dovoljenih IP -jev, prikažite sporočilo o napaki in zapustite skript. Vnesti moramo kodo stanja, ki ni 200 in funkcija header () tukaj ne bo delovala, zato uporabljamo novo funkcijo - http_response_code.
Če je IP odjemalca v nizu dovoljenih IP -jev, je naslednji korak, da dobimo zahtevano pot in pripono datoteke. Če je razširitev prazna, predpostavljamo, da uporabnik zahteva mapo in sestavi pot z uporabo DIRECTORY_INDEX, ki je najprej definirana.
Nazadnje, če zahtevana datoteka obstaja, vrnite FALSE in dovolite strežniku dostop do datoteke. Če ne, se prikaže sporočilo o napaki 404.
Povzetek
To je vse. Kot lahko vidite, je strežnik php enostaven za uporabo. Naš osebni strežnik je zelo preprost. Kodo je mogoče optimizirati in vključiti v bolj zapletene in funkcionalne razrede. Veselo kodiranje!p.s. Z veseljem bom sprejel kritike in komentarje na prevod v osebno.
To je odjemalec pravzaprav uporabil kot "ciljnega gostitelja" zahteve. SERVER_NAME je definiran v konfiguraciji strežnika. Kateri je odvisen od tega, za kaj ga potrebujete. Zdaj bi morali razumeti, da je to vrednost, ki jo nadzoruje odjemalec, zato ne more biti zanesljiva za uporabo v poslovni logiki, druga pa je vrednost, ki jo upravlja strežnik, ki je bolj zanesljiva. Vendar se morate prepričati, da ima spletni strežnik pravilno konfiguracijo SERVER_NAME. Če vzamemo za primer Apache HTTPD, je tukaj odlomek iz njegove dokumentacije:
Če ime strežnika ni podano, strežnik poskuša ugotoviti ime gostitelja z obratno iskanje naslova IP. Če v imenu strežnika niso podana nobena vrata, bo strežnik uporabil vrata iz dohodne zahteve. Za optimalno zanesljivost in predvidljivost morate s pomočjo direktive ServerName podati izrecno ime gostitelja in vrata.
Osveži: po preverjanju Pekkinega odgovora na vaše vprašanje, ki vsebuje povezavo do bobincevega odgovora, da bo PHP vedno vrnil vrednost HTTP_HOST za SERVER_NAME, kar je v nasprotju z mojimi lastnimi izkušnjami PHP 4.x + Apache HTTPD 1.2.x izpred nekaj let, Odpihnil sem prah s svojega trenutnega XAMPP v operacijskem sistemu Windows XP (Apache HTTPD 2.2.1 s PHP 5.2.8), ga zagnal, ustvaril stran PHP, ki natisne obe vrednosti, ustvaril testno aplikacijo Java z uporabo URLConnection za spremembo glave gostitelja, in testi so me naučili, da je res (napačno) tako.
Po prvem sumu na PHP in kopanju v nekatere Poročanje o napakah PHP na to temo sem ugotovil, da je koren problema v uporabljenem spletnem strežniku, da ni pravilno vrnil glave gostitelja HTTP, ko je bil zahtevan SERVER_NAME. Tako sem se poglobil Poročanje o napakah HTTPD Apache z uporabo različne ključne besede glede teme in končno sem našel sorodno napako. To vedenje je bilo uvedeno okoli Apache HTTPD 1.3. V vnosu morate vklopiti direktivo UseCanonicalName
To mi je uspelo.
Na splošno je SERVER_NAME bolj zanesljiv, vendar vi odvisni v konfiguraciji strežnika!
HTTP_HOST je ciljni gostitelj, ki ga pošlje odjemalec. Uporabnik lahko prosto manipulira z uporabnikom. Na vašo spletno stran ni treba poslati zahteve z zahtevo HTTP_HOST za vrednost www.stackoverflow.com.
SERVER_NAME izhaja iz definicije strežnika VirtualHost in zato velja za bolj zanesljivega. Z njim lahko tudi upravljate od zunaj pod določenimi pogoji, povezanimi z nastavitvijo vašega spletnega strežnika. Poglej to To SO vprašanje ki obravnava varnostne vidike obeh možnosti.
Ni vam treba zanašati, da ste varni. Katerega boste uporabili, je res odvisno od tega, kaj želite narediti. Če želite ugotoviti, na kateri domeni se skript izvaja, lahko varno uporabite HTTP_HOST, dokler neveljavne vrednosti, ki prihajajo od napadalca, ne morejo ničesar prekiniti.
Upoštevajte, da če želite uporabljati IPv6, verjetno želite uporabiti HTTP_HOST in ne SERVER_NAME. Če vnesete http: // [:: 1] /, so spremenljivke okolja naslednje:
HTTP_HOST = [:: 1] SERVER_NAME = :: 1
To pomeni, da bi na primer, če naredite mod_rewrite, lahko dobili slab rezultat. Primer preusmeritve SSL:
# SERVER_NAME NE bo deloval - preusmeritev na https: // :: 1 / RewriteRule. * Https: //% (SERVER_NAME) / # HTTP_HOST bo deloval - preusmeritev na https: // [:: 1] / RewriteRule. * Https: //% (HTTP_HOST) /
To velja SAMO, če dostopate do strežnika brez imena gostitelja.
če želite preveriti prek server.php ali kaj želite poklicati z naslednjim:
Nato dostopajte do vseh veljavnih URL -jev vašega spletnega mesta in preverite razliko.
Trajalo je nekaj časa, da sem ugotovil, kaj ljudje mislijo z izrazom "SERVER_NAME bolj zanesljiv". Uporabljam strežnik v skupni rabi in nimam dostopa do direktiv navideznega gostitelja. Torej, uporabljam mod_rewrite v .htaccess za preslikavo različnih HTTP_HOST v različnih imenikih. V tem primeru je ta vrednost HTTP_HOST smiselna.
Podobno je, če uporabljate navidezne gostitelje, ki temeljijo na imenih: direktiva ServerName znotraj navideznega gostitelja preprosto pove, katero ime gostitelja bo preslikano v tega navideznega gostitelja. Bistvo je, da se mora v obeh primerih ime gostitelja, ki ga posreduje odjemalec med zahtevo (HTTP_HOST), ujemati z imenom na strežniku, ki se sam preslika v imenik. Ne glede na to, ali je preslikava izvedena s smernicami navideznega gostitelja ali s pravili htaccess mod_rewrite, je tu drugotnega pomena. V teh primerih bo HTTP_HOST enak SERVER_NAME. Vesel sem, da je Apache tako konfiguriran.
Vendar se situacija razlikuje od virtualnih gostiteljev, ki temeljijo na IP. V tem primeru in samo v tem primeru sta lahko SERVER_NAME in HTTP_HOST drugačna, ker zdaj odjemalec izbere strežnik po IP -ju, ne po imenu. Dejansko lahko obstajajo posebne konfiguracije, kjer je to pomembno.
Zato bom odslej uporabljal SERVER_NAME, če bo moja koda potisnjena v te posebne konfiguracije.
Ob predpostavki, da imate preprosto nastavitev (CentOS 7, Apache 2.4.x in PHP 5.6.20) in samo eno spletno mesto (brez skupnega gostovanja) ...
V smislu PHP je $ _SERVER ["SERVER_NAME"] element PHP, registriran v nadrazredu $ _SERVER na podlagi vaše konfiguracije Apache (direktiva ** ime strežnika ** z UseCanonicalName vklopljeno) v httpd.conf (naj bo iz omogočene konfiguracije navideznega gostitelja) datoteke, karkoli itd.). HTTP_HOST izhaja iz glave gostitelja HTTP. Obravnavajte to kot vnos uporabnika. Pred uporabo filtrirajte in preverite.
Tukaj je primer, kjer uporabljam $ _SERVER ["SERVER_NAME"] kot osnovo za svojo primerjavo. Naslednja metoda je za določen podrejeni razred, ki sem ga poimenoval ServerValidator (podrejen Validatorja). ServerValidator pred uporabo potrdi šest ali sedem elementov v $ _SERVER.
Ko ugotavljam, ali je zahteva HTTP POST, uporabljam to metodo.
Javna funkcija jePOST () (return (($ this-> requestMethod === "POST") && // Prezri $ this-> hasTokenTimeLeft () && // Prezri $ this-> hasSameGETandPOSTIdentities () && // Ingore ($ this -> httpHost === filter_input (INPUT_SERVER, "SERVER_NAME"))));)
Do takrat, ko bo ta metoda poklicana, bo izvedeno vse filtriranje in preverjanje ustreznih elementov $ _SERVER (in njihovih ustreznih nizov lastnosti).
($ this-> httpHost === filter_input (INPUT_SERVER, "SERVER_NAME")
Preveri, ali se vrednost $ _SERVER ["HTTP_HOST"] (končno izhaja iz zahtevane glave gostitelja HTTP) ujema s $ _SERVER ["SERVER_NAME"].
Zdaj za razlago svojega primera uporabljam superglobalni pogovor, a to je zato, ker nekateri ljudje ne poznajo INPUT_GET, INPUT_POST in INPUT_SERVER v zvezi z filter_input_array ().
Bistvo je, da na svojem strežniku ne obdelam zahtev POST, razen če so izpolnjeni vsi štirje pogoji. Zato v smislu zahtev POST zavrnitev podajanja glave gostitelja HTTP (prisotnost preverjena za prej) doom uroke za stroge brskalnike HTTP 1.0... Poleg tega se zahtevani gostitelj mora ujemati z vrednostjo ServerName v httpd.conf in po razširitvi - vrednost $ _SERVER ("SERVER_NAME") v supermacleu $ _SERVER. Spet bi uporabil INPUT_SERVER s funkcijami filtra PHP, vendar ste mi prekinili drift.
Kot je poudaril balusC, SERVER_NAME ni zanesljiv in ga je mogoče spremeniti v konfiguraciji apache, konfiguraciji strežnika in požarnem zidu, ki je morda med vami in strežnikom.
Naslednja funkcija vedno vrne resničnega gostitelja (vnesenega uporabnika) brez vrat in je skoraj zanesljiv:
Funkcija getRealHost () (seznam ($ realHost,) = eksplodira (":", $ _ SERVER ["HTTP_HOST"]); vrni $ realHost;)
delitiZa začetek bomo stran za registracijo izboljšali z možnostjo nalaganja avatarja. Izvirna slika mora biti v formatu jpg, gif ali png. Prav tako ne sme biti večji od 2 MB. Ne skrbite, po stiskanju s skriptom bo avatar velik približno 3 kb in v formatu jpg. Odprite stran reg.php in dodajte oznako < oblika> vrstica enctype = "multipart / form-data" kot v primeru: