Naka-block ang JavaScript sa iyong browser. Mangyaring paganahin ang JavaScript para gumana ang site!
Superglobal array $_SERVER
Upang array $_SERVER Inilalagay ng interpreter ng PHP ang mga variable na natanggap mula sa server. Kung wala ang mga variable na ito, mahirap ayusin ang buong suporta para sa mga Web application. Nasa ibaba ang isang paglalarawan ng pinakamahalagang elemento ng superglobal array $_SERVER.
Magkomento
Array ( => sa => 200 => sa => htmlweb.ru => https => 443 => malapit => Mozilla/5.0 (tugma; 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 => [email protected]=>.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"]
Ang elementong $_SERVER["DOCUMENT_ROOT"] ay naglalaman ng path sa root directory ng server; Yung. sa httpd.conf configuration file, ang virtual host ay mayroong DocumentRoot directive na nakatakda sa "D:/main", ang $_SERVER["DOCUMENT_ROOT"] na elemento ay maglalaman ng value na "D:main".
$_SERVER[" REMOTE_ADDR"]
Ang elementong $_SERVER["REMOTE_ADDR"] ay naglalaman ng IP address ng kliyente. Kapag sumusubok sa isang lokal na makina, ang address na ito ay magiging katumbas ng 127.0.0.1. Gayunpaman, kapag sinusubukan sa network, ibabalik ng variable ang IP address ng kliyente o ang huling proxy server kung saan naabot ng kliyente ang server. Kung ang kliyente ay gumagamit ng proxy server, maaari mong malaman ang IP address nito gamit ang HTTP_X_FORWARDED_FOR environment variable, ang halaga nito ay maaaring makuha gamit ang getenv() function.
Magkomento
Ang mga proxy server ay mga espesyal na intermediate server na nagbibigay ng isang espesyal na uri ng serbisyo: traffic compression, data encoding, adaptation para sa mga mobile device, atbp. Sa maraming proxy server, mayroong tinatawag na anonymous proxy server, na nagbibigay-daan sa iyong itago ang tunay na IP address ng kliyente ay hindi nagbabalik ng HTTP_X_FORWARDED_FOR environment variable.
Pagkuha ng variable ng kapaligiran HTTP_X_FORWARDED_FOR
echo @getenv(HTTP_X_FORWARDED_FOR);
$_SERVER[" SCRIPT_FILENAME"]
Ang elementong $_SERVER["SCRIPT_FILENAME"] ay naglalaman ng ganap na landas patungo sa file mula sa disk root. Kaya, kung ang server ay nagpapatakbo ng Windows operating system, ang landas na ito ay maaaring magmukhang ganito: "d:main estindex.php", i.e. ang path ay tinukoy mula sa disk; sa isang UNIX-tulad ng operating system, ang landas ay tinukoy mula sa root directory /, halimbawa "/var/share/www/test/index.php".
/var/www/htmlweb/data/www/site/index.php
$_SERVER[" SERVER_NAME"]
Ang elementong $_SERVER["SERVER_NAME"] ay naglalaman ng pangalan ng server, na karaniwang tumutugma sa domain name ng site na matatagpuan dito. Halimbawa,
Ang nilalaman ng elementong $_SERVER["SERVER_NAME"] ay kadalasang pareho sa nilalaman ng elementong $_SERVER["HTTP_HOST"]. Bilang karagdagan sa pangalan ng server, binibigyang-daan ka ng superglobal array na $_SERVER na malaman ang isang bilang ng mga parameter ng server, halimbawa, ang IP address ng server, ang listening port, kung saan naka-install ang Web server at ang bersyon ng HTTP protocol. Ang impormasyong ito ay inilalagay sa mga elementong $_SERVER["SERVER_ADDR"], $_SERVER["SERVER_PORT"], $_SERVER["SERVER_SOFTWARE"], at $_SERVER["SERVER_PROTOCOL"], ayon sa pagkakabanggit. Nasa ibaba ang isang halimbawa gamit ang mga elementong ito.
Gamit ang $_SERVER Array Elements
echo "Ang pangalan ng server ay ".$_SERVER["SERVER_NAME"].""; echo "Ang IP address ng server ay ".$_SERVER["SERVER_ADDR"]."
"; echo "Server port - ".$_SERVER["SERVER_PORT"]."
"; echo "Web server - ".$_SERVER["SERVER_SOFTWARE"]."
"; echo "Bersyon ng HTTP protocol - ".$_SERVER["SERVER_PROTOCOL"]."
";
Pangalan ng server - site
IP address ng server - 185.12.92.137
Port ng server - 80
Web server - Apache/2.4.25 (Debian) mpm-itk/2.4.7-04 OpenSSL/1.0.2l
Bersyon ng HTTP protocol - HTTP/1.0
$_SERVER[" REQUEST_METHOD"]
Ang elementong $_SERVER["REQUEST_METHOD"] ay naglalaman ng paraan ng kahilingan na ginagamit para tawagan ang script: GET o POST.
Echo $_SERVER["REQUEST_METHOD"];
$_SERVER[" QUERY_STRING"]
Ang elementong $_SERVER["QUERY_STRING"] ay naglalaman ng mga parameter na ipinasa sa script kung ang string ng query ay isang address
Halimbawa, kapag ina-access ang:
ang elementong $_SERVER["QUERY_STRING"] ay maglalaman ng lahat ng teksto pagkatapos ng "?"
Echo $_SERVER["QUERY_STRING"];
id=1&test=wet&id_theme=512
$_SERVER[" PHP_SELF"]
Ang elementong $_SERVER["PHP_SELF"] ay naglalaman ng pangalan ng script, simula sa root directory ng virtual host, i.e. kung ang query string ay isang address http://www.mysite.ru/test/index.php?id=1&test=wet&id_theme=512 pagkatapos ang elementong $_SERVER["PHP_SELF"] ay maglalaman ng fragment "/test/index.php". Karaniwan, ang parehong fragment ay inilalagay sa elementong $_SERVER["SCRIPT_NAME"].
$_SERVER[" REQUEST_URI"]
Ang elementong $_SERVER["REQUEST_URI"] ay naglalaman ng pangalan ng script, simula sa root directory ng virtual host at mga parameter, i.e. kung ang query string ay isang address: http://www.mysite.ru/test/index.php?id=1&test=wet&id_theme=512 pagkatapos ang elementong $_SERVER["REQUEST_URI"] ay maglalaman ng fragment "/test/index.php?id=1&test=wet&id_theme=512". Upang maibalik ang buong address sa script, na inilagay sa linya ng query, sapat na gamitin ang kumbinasyon ng mga elemento ng $_SERVER array na ipinakita sa ibaba
Buong address sa script
echo "http://".$_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];At ito ang aktwal na ginamit ng kliyente bilang "target host" ng kahilingan. Ang SERVER_NAME ay tinukoy sa configuration ng server. Alin ang depende sa kung ano ang kailangan mo. Ngayon ay dapat mong maunawaan na ito ay isang kinokontrol na halaga ng kliyente na kung saan ay hindi maaasahan para sa paggamit sa lohika ng negosyo at ang isa ay isang halaga na kinokontrol ng server na mas maaasahan. Gayunpaman, kailangan mong tiyakin na ang web server ay may tamang configuration ng SERVER_NAME. Ang pagkuha ng Apache HTTPD bilang isang halimbawa, narito ang isang sipi mula sa dokumentasyon nito:
Kung hindi tinukoy ang ServerName, susubukan ng server na ipahiwatig ang hostname sa pamamagitan ng pagsasagawa ng reverse lookup sa IP address. Kung walang port na tinukoy sa ServerName , gagamitin ng server ang port mula sa papasok na kahilingan. Para sa pinakamainam na pagiging maaasahan at predictability, dapat kang tumukoy ng isang tahasang hostname at port gamit ang ServerName na direktiba.
Update: Pagkatapos suriin ang sagot ni Pekka sa iyong tanong, na naglalaman ng isang link sa sagot ni bobince, palaging ibabalik ng PHP na iyon ang halaga ng HTTP_HOST para sa SERVER_NAME, na sumasalungat sa sarili kong karanasan sa PHP 4.x + Apache HTTPD 1.2.x mula sa ilang taon na ang nakakaraan. , pinalabas ko ang alikabok sa aking kasalukuyang XAMPP sa Windows XP (Apache HTTPD 2.2.1 na may PHP 5.2.8), pinatakbo ito, lumikha ng isang pahina ng PHP na nagpi-print ng parehong mga halaga, lumikha ng isang pagsubok na Java application gamit ang URLConnection upang baguhin ang header ng Host, at ang mga pagsubok ay nagturo sa akin na ito ay talagang (mali) ang kaso.
Matapos ang unang paghihinala sa PHP at paghuhukay sa ilan Mga ulat ng error sa PHP patungkol sa paksa, nalaman ko na ang ugat ng problema ay nasa web server na ginagamit, na mali nitong ibinabalik ang header ng HTTP Host noong hiniling ang SERVER_NAME. Kaya hinukay ko Mga ulat ng error sa Apache HTTPD gamit iba't ibang mga keyword medyo paksa at sa wakas ay natagpuan ko ang kaugnay na error. Ang pag-uugali na ito ay ipinakilala mula noong Apache HTTPD 1.3. Kailangan mong itakda ang UseCanonicalName na direktiba sa entry
Ito ay nagtrabaho para sa akin.
Sa pangkalahatan, mas maaasahan ang SERVER_NAME, ngunit ikaw umaasa sa configuration ng server!
Ang HTTP_HOST ay ang target na host na ipinadala ng kliyente. Malayang manipulahin ng user ang user. Hindi na kailangang magpadala ng kahilingan sa iyong site na humihingi ng HTTP_HOST na halaga ng www.stackoverflow.com.
Ang SERVER_NAME ay nagmula sa kahulugan ng server ng VirtualHost at samakatuwid ay itinuturing na mas maaasahan. Maaari din itong manipulahin sa labas sa ilalim ng ilang partikular na kundisyon na nauugnay sa setup ng iyong web server. Tingnan mo ito SOBRANG tanong na ito, na tumutugon sa mga aspeto ng seguridad ng parehong mga opsyon.
Hindi ka dapat umasa dito para maging ligtas. Gayunpaman, kung alin ang gagamitin ay talagang depende sa kung ano ang gusto mong gawin. Kung gusto mong matukoy kung saang domain tumatakbo ang iyong script, ligtas mong magagamit ang HTTP_HOST hangga't ang mga di-wastong halaga na nagmumula sa isang umaatake ay hindi makakasira ng anuman.
Tandaan na kung gusto mong gumamit ng IPv6, malamang na gugustuhin mong gumamit ng HTTP_HOST kaysa sa SERVER_NAME. Kung ilalagay mo ang http://[::1]/ , ang mga variable ng kapaligiran ay magiging tulad ng sumusunod:
HTTP_HOST = [::1] SERVER_NAME = ::1
Nangangahulugan ito na kung gagawin mo ang mod_rewrite, halimbawa, maaari kang makakuha ng mga pangit na resulta. Halimbawa ng pag-redirect ng SSL:
HINDI gagana ang # SERVER_NAME - Redirection sa https://::1/ RewriteRule .* https://%(SERVER_NAME)/ # HTTP_HOST will work - Redirection to https://[::1]/ RewriteRule .* https: //%(HTTP_HOST)/
Nalalapat LAMANG ito kung ina-access mo ang server nang walang hostname.
kung gusto mong suriin sa pamamagitan ng server.php o anumang nais mong tawagan gamit ang sumusunod:
Pagkatapos ay i-access ang lahat ng wastong URL para sa iyong site at subukan ang pagkakaiba.
Nagtagal ako bago maunawaan kung ano ang ibig sabihin ng mga tao sa "SERVER_NAME ay mas maaasahan." Gumagamit ako ng shared server at walang access sa mga virtual host directive. Kaya gumagamit ako ng mod_rewrite sa .htaccess para mag-map ng iba't ibang HTTP_HOST sa iba't ibang direktoryo. Sa kasong ito, ang halaga ng HTTP_HOST na ito ay may katuturan.
Ang sitwasyon ay katulad kung gumagamit ka ng name-based na virtual host: ang ServerName directive sa loob ng virtual host ay nagsasabi lang sa iyo kung anong hostname ang imamapa sa virtual host na iyon. Ang bottom line ay na sa parehong mga kaso, ang hostname na ibinigay ng kliyente sa oras ng kahilingan (HTTP_HOST) ay dapat tumugma sa pangalan sa server, na mismong nakamapa sa direktoryo. Kung ang pagmamapa ay ginawa laban sa mga virtual na direktiba ng host o laban sa htaccess mod_rewrite na mga panuntunan ay pangalawa rito. Sa mga kasong ito, ang HTTP_HOST ay magiging kapareho ng SERVER_NAME. Natutuwa akong naka-configure ang Apache sa ganitong paraan.
Gayunpaman, iba ang sitwasyon para sa mga IP-based na virtual host. Sa kasong ito at sa kasong ito lamang, maaaring magkaiba ang SERVER_NAME at HTTP_HOST dahil pinipili na ngayon ng kliyente ang server sa pamamagitan ng IP, hindi sa pangalan.
Sa katunayan, maaaring may mga espesyal na pagsasaayos kung saan ito ay mahalaga.
Kaya mula ngayon, gagamitin ko ang SERVER_NAME kung sakaling ma-port ang aking code sa mga espesyal na configuration na ito.
Ipagpalagay na mayroon kang isang simpleng setup (CentOS 7, Apache 2.4.x at PHP 5.6.20) at isang website lamang (hindi ipinapalagay na nakabahaging pagho-host)... Sa kahulugan ng PHP, ang $_SERVER["SERVER_NAME"] ay isang elemento ng PHP na nakarehistro sa superclass na $_SERVER batay sa iyong configuration ng Apache (**ServerName** na direktiba na may UseCanonicalName On) sa httpd.conf (mula man sa pinaganang configuration ng virtual host file, anuman, atbp.). HTTP_HOST
hinuha mula sa header ng HTTP host. Isaalang-alang ito bilang input ng user. Salain at suriin bago gamitin.
Narito ang isang halimbawa kung saan ginagamit ko ang $_SERVER["SERVER_NAME"] bilang batayan para sa paghahambing. Ang sumusunod na pamamaraan ay nasa isang partikular na klase ng bata na tinawag kong ServerValidator (anak ng Validator). Sinusuri ng ServerValidator ang anim o pitong elemento sa $_SERVER bago gamitin ang mga ito.
Ang pampublikong function ayPOST() ( return (($this->requestMethod === "POST") && // Balewala ang $this->hasTokenTimeLeft() && // Balewala $this->hasSameGETandPOSTIdentities() && // Ingore ($this ->httpHost === filter_input(INPUT_SERVER, "SERVER_NAME")));
Sa oras na tinawag ang pamamaraang ito, ang lahat ng pag-filter at pagpapatunay ng mga katumbas na elemento ng $_SERVER (at mga kaukulang set ng property) ay magagawa na.
($this->httpHost === filter_input(INPUT_SERVER, "SERVER_NAME")
Bine-verify na ang halaga ng $_SERVER["HTTP_HOST"] (sa huli ay nakuha mula sa hiniling na HTTP host header) ay tumutugma sa $_SERVER["SERVER_NAME"] .
Ngayon ay gumagamit ako ng superglobal talk upang ipaliwanag ang aking halimbawa, ngunit iyon ay dahil ang ilang mga tao ay hindi pamilyar sa INPUT_GET , INPUT_POST at INPUT_SERVER na may kaugnayan sa filter_input_array() .
Ang bottom line ay hindi ko pinoproseso ang mga kahilingan sa POST sa aking server maliban kung natutugunan ang lahat ng apat na kundisyon. Kaya, sa mga tuntunin ng mga kahilingan sa POST, ang pagkabigo na magbigay ng HTTP host header (presence checked para sa mas maaga) doom spells para sa mahigpit na mga browser HTTP 1.0. Bilang karagdagan, ang hiniling na host ay dapat tumugma sa halaga Pangalan ng Server sa httpd.conf, at ayon sa extension - ang halaga na $_SERVER("SERVER_NAME") sa $_SERVER supermaclon. Muli, gagamit ako ng INPUT_SERVER sa mga function ng filter ng PHP, ngunit sinira mo ang aking drift.
Gaya ng sinabi ng balusC, ang SERVER_NAME ay hindi maaasahan at maaaring baguhin sa apache config, server server config at firewall na maaaring nasa pagitan mo at ng server.
Ang sumusunod na function ay palaging ibinabalik ang tunay na host (custom typed host) nang walang port, at ito ay halos walang palya:
Function getRealHost())( list($realHost,)=explode(":",$_SERVER["HTTP_HOST"]); ibalik ang $realHost; )
ibahagiUna, pagbubutihin namin ang pahina ng pagpaparehistro sa pamamagitan ng pagdaragdag ng kakayahang mag-upload ng avatar. Ang pinagmulang larawan ay dapat nasa jpg, gif o png na format. Dapat din itong hindi hihigit sa 2 MB. Huwag mag-alala, pagkatapos itong ma-compress ng script, ang laki ng avatar ay magiging mga 3 kb at jpg na format. Buksan ang pahina reg.php at idagdag ito sa tag < anyo> linya enctype="multipart/form-data", tulad ng sa halimbawa: