HTTP_HOST และ SERVER_NAME ใน PHP แตกต่างกันอย่างไร PHP $ _SERVER Global Array การดึงตัวแปรสภาพแวดล้อม HTTP_X_FORWARDED_FOR
$ _SERVERเป็นหนึ่งในอาร์เรย์ที่กำหนดไว้ล่วงหน้าที่สำคัญที่สุดใน PHP ประกอบด้วยตัวแปรที่ได้รับจากเซิร์ฟเวอร์โดยล่าม PHP ทุกคนใช้ตัวแปรเหล่านี้ มิฉะนั้นพวกเขาจะใช้มันอย่างแน่นอน เนื่องจากหากไม่มีตัวแปรเหล่านี้ ค่อนข้างยากที่จะจัดระเบียบการสนับสนุนอย่างเต็มที่สำหรับเว็บแอปพลิเคชัน
ในบทความของฉัน ฉันขอเสนอตารางที่มีตัวแปรหลัก $ _SERVER superglobal array ตารางนี้คล้ายกับตารางที่สร้างขึ้นสำหรับฟังก์ชันสตริง PHP
หากต้องการดูองค์ประกอบทั้งหมดของอาร์เรย์ $ _SERVER คุณต้อง: a) เรียกใช้ฟังก์ชัน print_r () ซึ่งจะพิมพ์อาร์เรย์นั้น b) เรียกใช้ฟังก์ชัน phpinfo () ซึ่งจะแสดงข้อมูลเกี่ยวกับตัวแปล PHP
สั้น ๆ เกี่ยวกับ $ HTTP_SERVER_VARS
$ _SERVER superglobal array แทนที่อาร์เรย์ $ HTTP_SERVER_VARS ใน PHP 4.1.0 $ HTTP_SERVER_VARSไม่ได้ใช้ตอนนี้ แต่ก็คุ้มค่าที่จะรู้เรื่องนี้ อย่างแรกเลย รุ่นเก่าไม่ใช่ออโตโกลบอล ข้อแตกต่างประการที่สองคือองค์ประกอบบางอย่างของอาร์เรย์ $ _SERVER ไม่มีอยู่ใน $ HTTP_SERVER_VARS แม้ว่าในกรณีส่วนใหญ่ตัวแปรจะเหมือนกัน
ธาตุ |
คำอธิบายสั้น |
ตัวอย่าง |
$ _SERVER ["DOCUMENT_ROOT"] |
ประกอบด้วยพาธไปยังไดเร็กทอรีรากของเซิร์ฟเวอร์ |
|
$ _SERVER ["HTTP_HOST"] $ _SERVER ["SERVER_NAME"] |
||
$ _SERVER ["SCRIPT_FILENAME"] |
ประกอบด้วยชื่อของสคริปต์ โดยเริ่มต้นจากไดเร็กทอรีรากของโฮสต์เสมือน |
C: \ โฟลเดอร์ \ index.php /www/folder/index.php |
$ _SERVER ["PHP_SELF"] $ _SERVER ["SCRIPT_NAME"] |
ประกอบด้วยชื่อของสคริปต์ |
|
$ _SERVER ["REQUEST_URI"] |
ประกอบด้วยชื่อของสคริปต์ โดยเริ่มจากไดเร็กทอรีรากของโฮสต์ของบริษัท ตลอดจนพารามิเตอร์ที่ส่งไปโดยวิธี GET |
/www/folder/index.php?page=2&num=5 |
$ _SERVER ["QUERY_STRING"] |
ประกอบด้วยพารามิเตอร์ที่ส่งผ่านไปยังสคริปต์โดยวิธี GET |
สำหรับที่อยู่ http://site.com/index.php?page=2&num=5 จะออก |
$ _SERVER ["REQUEST_METHOD"] |
ประกอบด้วยวิธีการร้องขอที่ใช้ในการเรียกใช้สคริปต์ |
รับ หรือโพสต์ |
$ _SERVER ["HTTP_REFERER"] |
ประกอบด้วยที่อยู่ของหน้าที่ผู้เยี่ยมชมเข้ามา |
http://yandex.ru/yandsearch |
$ _SERVER ["HTTP_USER_Agent"] |
ประกอบด้วยประเภทและเวอร์ชันของเบราว์เซอร์และระบบปฏิบัติการของผู้เยี่ยมชม นอกจากนี้ยังสามารถตรวจจับโรบ็อตการค้นหาและแบรนด์ของโทรศัพท์มือถือได้อีกด้วย ด้านล่างนี้คือการเปรียบเทียบยี่ห้อโทรศัพท์กับรหัสเป็นสตริง โนเกีย - โนเกีย; Sony Ericsson - ERICSSON หรือ SONYERICSSON; Samsung - SAMSUNG หรือ SEC-; โมโตโรล่า - MOT; LG - LG หรือ LG-; อัลคาเทล - อัลคาเทล; พานาโซนิค - พานาโซนิค; Sagem - SAGEM; แพนเทค - แพนเทค; ซีเมนส์ - SIE; เบ็นคิว - เบ็นคิว; NEC - NEC; ชาร์ป - ชาร์ป |
Mozilla / 4.0 (เข้ากันได้; MSIE 6.0; Windows NT 5.1) ( IE6และWindows XP) Mozilla / 4.0 (เข้ากันได้; MSIE 7.0; Windows NT 5.0) Opera 9.50 ( โอเปร่า 9.5และWindows 2000) |
$ _SERVER ["REMOTE_ADDR"] |
ประกอบด้วยที่อยู่ IP ของลูกค้า |
|
$ _SERVER ["SERVER_ADDR"] |
ประกอบด้วยที่อยู่ IP ของเซิร์ฟเวอร์ |
|
$ _SERVER ["HTTP_ACCEPT"] |
อธิบายการตั้งค่าของลูกค้าสำหรับประเภทเอกสาร เนื้อหาขององค์ประกอบนี้ดึงมาจากส่วนหัว Accept HTTP ที่ส่งผ่านไปยังเซิร์ฟเวอร์โดยไคลเอ็นต์ รูปแบบเอาต์พุต: ประเภท MIME [[; q] ประเภท MIME อื่น [; NS] ...] MIME ที่ต้องการมีได้หลายประเภท จากนั้นให้คั่นด้วยเครื่องหมายจุลภาค * ใช้สำหรับตั้งค่าแม่แบบการจัดกลุ่ม q - ค่าสัมประสิทธิ์การกำหนดลักษณะ โดยค่าเริ่มต้น 1 ช่วงตั้งแต่ 0 ถึง 1 |
รูปภาพ / jpeg, รูปภาพ / x-xbitmap, แอปพลิเคชัน / x-shockwave-flash ภาพ / *; q = 0.5, รูปภาพ / jpeg (ชอบ zhpeg กับรูปแบบอื่นทั้งหมด) |
$ _SERVER ["HTTP_ACCEPT_LANGUAGE"] |
คล้ายกับองค์ประกอบก่อนหน้า แต่เกี่ยวข้องกับการตั้งค่าภาษา สามารถใช้กำหนดสัญชาติของผู้เยี่ยมชมได้ แต่ค่าประมาณจะเป็นค่าประมาณ เนื่องจากบางคนชอบใช้บราวเซอร์เวอร์ชั่นภาษาอังกฤษ |
ru, en; q = 0.9 (ชอบภาษารัสเซีย แต่ถ้าไม่มี - และภาษาอังกฤษจะทำ) |
$ _SERVER ["HTTP_ACCEPT_CHARSET"] |
คล้ายกับก่อนหน้านี้ ประกอบด้วยส่วนหัว Accept-Charset |
|
$ _SERVER ["HTTP_ACCEPT_ENCODING"] |
คล้ายกับก่อนหน้านี้ มีส่วนหัวที่ยอมรับการเข้ารหัส |
|
$ _SERVER ["SERVER_PORT"] |
ประกอบด้วยพอร์ตการรับฟังของเซิร์ฟเวอร์ |
|
$ _SERVER ["SERVER_SOFTWARE"] |
มีข้อมูลเกี่ยวกับเว็บเซิร์ฟเวอร์ |
อาปาเช่ / 2.2.4 (Win32) |
$ _SERVER ["SERVER_PROTOCOL"] |
ประกอบด้วยเวอร์ชันของโปรโตคอล HTTP |
|
$ _SERVER ["GATEWAY_INTERFACE"] |
ประกอบด้วยเวอร์ชันของ CGI ที่เว็บเซิร์ฟเวอร์ใช้ |
|
$ _SERVER ["REQUEST_TIME"] |
เวลาเริ่มต้นของการร้องขอหน้าเว็บในรูปแบบ UNIX ใช้ได้ตั้งแต่ PHP 5.1.0 |
ที่อยู่แบบเต็มของหน้าพร้อมพารามิเตอร์:
echo "http: //" .SERVER_NAME $ _ SERVER ["REQUEST_URI"];
?>
สามารถดาวน์โหลดตารางพร้อมฟังก์ชันทั้งหมดได้จากลิงก์ในรูปแบบ * .doc
ให้ความสนใจเป็นพิเศษกับตัวแปร $ _SERVER ["REQUEST_URI"] และอย่าลืมตรวจสอบมัน!ประเด็นคือการใช้งานอาจไม่ปลอดภัยเป็นพิเศษ ตัวอย่างเช่น ในเว็บไซต์ของคุณ URL บาง URL ถูกสร้างขึ้นโดยใช้พารามิเตอร์นี้ จากนั้นคุณสามารถเขียนลิงค์ http://site.com/index.php ในบรรทัดเบราว์เซอร์ได้หรือไม่ ”>... จะเป็นการเปิดหน้าต่างแสดงเนื้อหาของไฟล์คุกกี้ ตัวอย่างนี้ไม่มีอันตราย แต่เป็นรูที่แฮ็กเกอร์สามารถใช้ประโยชน์จากรูนั้นได้ เช่น เพื่อขโมยข้อมูลจากผู้ใช้รายอื่น ดังนั้น - ตรวจสอบตัวแปรเพื่อหาอักขระที่ไม่ถูกต้อง โดยเฉพาะ> และ<.
สำหรับวันนี้บางทีทุกอย่าง จนกว่าจะถึงครั้งต่อไปและสุขสันต์วันหยุดสุดสัปดาห์!
JavaScript ถูกบล็อกในเบราว์เซอร์ของคุณ โปรดเปิดใช้งาน JavaScript เพื่อให้ไซต์ทำงานได้!
สุดยอดอาร์เรย์ $ _SERVER
เข้าสู่อาร์เรย์ $ _SERVERล่าม PHP ใส่ตัวแปรที่ได้รับจากเซิร์ฟเวอร์ หากไม่มีตัวแปรเหล่านี้ จะเป็นการยากที่จะให้การสนับสนุนเว็บแอปพลิเคชันอย่างเต็มที่ ต่อไปนี้เป็นคำอธิบายขององค์ประกอบที่สำคัญที่สุดของ superglobal array $ _SERVER.
ความคิดเห็น
Array (=> เปิด => 200 => เปิด => htmlweb.ru => https => 443 => ปิด => Mozilla / 5.0 (เข้ากันได้; 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 => /var/www/htmlweb/data/www/htmlweb.ru => [ป้องกันอีเมล]=>. 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"]
อิลิเมนต์ $ _SERVER ["DOCUMENT_ROOT"] มีพาธไปยังไดเร็กทอรีรากของเซิร์ฟเวอร์ ถ้าสคริปต์ถูกเรียกใช้งานในโฮสต์เสมือน อิลิเมนต์นี้มีพาธไปยังไดเร็กทอรีรากของโฮสต์เสมือน เหล่านั้น. ในไฟล์การกำหนดค่า httpd.conf โฮสต์เสมือนมีคำสั่ง DocumentRoot ซึ่งกำหนดค่า "D: / main" องค์ประกอบ $ _SERVER ["DOCUMENT_ROOT"] จะมีค่า "D: main"
$ _SERVER [" REMOTE_ADDR"]
องค์ประกอบ $ _SERVER ["REMOTE_ADDR"] มีที่อยู่ IP ของลูกค้า เมื่อทำการทดสอบกับเครื่องท้องถิ่น ที่อยู่นี้จะเป็น 127.0.0.1 อย่างไรก็ตาม เมื่อทำการทดสอบบนเครือข่าย ตัวแปรจะส่งคืนที่อยู่ IP ของไคลเอนต์หรือพร็อกซีเซิร์ฟเวอร์ตัวสุดท้ายที่ไคลเอนต์เข้าถึงเซิร์ฟเวอร์ หากไคลเอนต์ใช้พร็อกซีเซิร์ฟเวอร์ คุณสามารถค้นหาที่อยู่ IP โดยใช้ตัวแปรสภาพแวดล้อม HTTP_X_FORWARDED_FOR ซึ่งสามารถรับค่าได้โดยใช้ฟังก์ชัน getenv ()
ความคิดเห็น
พร็อกซีเซิร์ฟเวอร์เป็นเซิร์ฟเวอร์กลางพิเศษที่ให้บริการประเภทพิเศษ: การบีบอัดการรับส่งข้อมูล การเข้ารหัสข้อมูล การปรับให้เข้ากับอุปกรณ์มือถือ ฯลฯ ในบรรดาพร็อกซีเซิร์ฟเวอร์จำนวนมาก มีสิ่งที่เรียกว่าพร็อกซีเซิร์ฟเวอร์ที่ไม่ระบุชื่อ ซึ่งอนุญาตให้คุณซ่อนที่อยู่ IP ที่แท้จริงของไคลเอนต์ เซิร์ฟเวอร์ดังกล่าวจะไม่ส่งคืนตัวแปรสภาพแวดล้อม HTTP_X_FORWARDED_FOR
การแยกตัวแปรสภาพแวดล้อม HTTP_X_FORWARDED_FOR
echo @getenv (HTTP_X_FORWARDED_FOR);
$ _SERVER [" SCRIPT_FILENAME"]
อิลิเมนต์ $ _SERVER ["SCRIPT_FILENAME"] มีพาธสัมบูรณ์ไปยังไฟล์จากรูทของดิสก์ ดังนั้น หากเซิร์ฟเวอร์ใช้ระบบปฏิบัติการ Windows เส้นทางนี้อาจมีลักษณะดังนี้ "d: main estindex.php" กล่าวคือ พาธถูกระบุจากดิสก์ ในระบบปฏิบัติการที่เหมือน UNIX พาธถูกระบุจากไดเร็กทอรี root / ตัวอย่างเช่น "/var/share/www/test/index.php"
/var/www/htmlweb/data/www/site/index.php
$ _SERVER [" ชื่อเซิร์ฟเวอร์"]
องค์ประกอบ $ _SERVER ["SERVER_NAME"] มีชื่อเซิร์ฟเวอร์ตามกฎเหมือนกับชื่อโดเมนของไซต์ที่อยู่บนนั้น ตัวอย่างเช่น,
เนื้อหาขององค์ประกอบ $ _SERVER ["SERVER_NAME"] มักจะเหมือนกับเนื้อหาขององค์ประกอบ $ _SERVER ["HTTP_HOST"] นอกจากชื่อเซิร์ฟเวอร์แล้ว $ _SERVER superglobal array ยังช่วยให้คุณค้นหาพารามิเตอร์เซิร์ฟเวอร์จำนวนหนึ่งได้ เช่น ที่อยู่ IP ของเซิร์ฟเวอร์ พอร์ตการรับฟัง เว็บเซิร์ฟเวอร์ที่ติดตั้ง และเวอร์ชันของโปรโตคอล HTTP ข้อมูลนี้อยู่ใน $ _SERVER ["SERVER_ADDR"], $ _SERVER ["SERVER_PORT"], $ _SERVER ["SERVER_SOFTWARE"] และ $ _SERVER ["SERVER_PROTOCOL"] ตามลำดับ ด้านล่างนี้คือตัวอย่างการใช้รายการเหล่านี้
การใช้องค์ประกอบของ $ _SERVER array
echo "ชื่อเซิร์ฟเวอร์คือ" $ _ SERVER ["SERVER_NAME"] ""; echo" IP ของเซิร์ฟเวอร์คือ ". $ _ SERVER [" SERVER_ADDR "]"
"; echo" พอร์ตเซิร์ฟเวอร์คือ ". $ _ SERVER [" SERVER_PORT "]"
"; echo" เว็บเซิร์ฟเวอร์ - ". $ _ SERVER [" SERVER_SOFTWARE "]"
"; echo" เวอร์ชันโปรโตคอล HTTP - ". $ _ SERVER [" SERVER_PROTOCOL "]"
";
ชื่อเซิร์ฟเวอร์ - ไซต์
IP เซิร์ฟเวอร์ - 185.12.92.137
พอร์ตเซิร์ฟเวอร์ - 80
เว็บเซิร์ฟเวอร์ - Apache / 2.4.25 (Debian) mpm-itk / 2.4.7-04 OpenSSL / 1.0.2l
เวอร์ชันโปรโตคอล HTTP - HTTP / 1.0
$ _SERVER [" REQUEST_METHOD"]
องค์ประกอบ $ _SERVER ["REQUEST_METHOD"] มีวิธีการร้องขอที่ใช้ในการเรียกสคริปต์: GET หรือ POST
เสียงสะท้อน $ _SERVER ["REQUEST_METHOD"];
$ _SERVER [" QUERY_STRING"]
องค์ประกอบ $ _SERVER ["QUERY_STRING"] มีพารามิเตอร์ที่ส่งไปยังสคริปต์หากสตริงการสืบค้นเป็นที่อยู่
ตัวอย่างเช่น เมื่อพูดถึง:
$ _SERVER ["QUERY_STRING"] องค์ประกอบจะมีข้อความทั้งหมดหลังเครื่องหมาย "?"
เสียงสะท้อน $ _SERVER ["QUERY_STRING"];
id = 1 & ทดสอบ = เปียก & id_theme = 512
$ _SERVER [" PHP_SELF"]
องค์ประกอบ $ _SERVER ["PHP_SELF"] มีชื่อของสคริปต์ โดยเริ่มต้นจากไดเรกทอรีรากของโฮสต์เสมือน กล่าวคือ ถ้าสตริงการสืบค้นเป็นที่อยู่ http://www.mysite.ru/test/index.php?id=1&test=wet&id_theme=512 จากนั้นองค์ประกอบ $ _SERVER ["PHP_SELF"] จะมีตัวอย่างข้อมูล "/test/index.php"... โดยทั่วไป ส่วนย่อยเดียวกันจะอยู่ในองค์ประกอบ $ _SERVER ["SCRIPT_NAME"]
$ _SERVER [" REQUEST_URI"]
องค์ประกอบ $ _SERVER ["REQUEST_URI"] มีชื่อของสคริปต์ โดยเริ่มต้นจากไดเรกทอรีรากของโฮสต์เสมือนและพารามิเตอร์ เช่น หากสตริงการสืบค้นเป็นที่อยู่: http://www.mysite.ru/test/index.php?id=1&test=wet&id_theme=512 จากนั้นองค์ประกอบ $ _SERVER ["REQUEST_URI"] จะมีตัวอย่าง "/test/index.php?id=1&test=wet&id_theme=512"... เพื่อที่จะกู้คืนที่อยู่แบบเต็มในสคริปต์ซึ่งอยู่ในบรรทัดแบบสอบถามก็เพียงพอที่จะใช้การรวมกันขององค์ประกอบของอาร์เรย์ $ _SERVER ที่แสดงด้านล่าง
ที่อยู่แบบเต็มของสคริปต์
echo "http: //". $ _ SERVER ["SERVER_NAME"]. $ _ SERVER ["REQUEST_URI"];- การแปล
- กวดวิชา
หนึ่งในคุณสมบัติใหม่ที่ยอดเยี่ยมที่สุดใน php 5.4 คือเซิร์ฟเวอร์ในตัวที่สร้างขึ้นโดยเฉพาะสำหรับการพัฒนาและการทดสอบ ตอนนี้คุณสามารถเขียนและทดสอบรหัสของคุณโดยไม่ต้องมีเว็บเซิร์ฟเวอร์เต็มรูปแบบ - เพียงแค่เริ่มเซิร์ฟเวอร์ฝังตัว ทดสอบรหัสของคุณ และปิดเครื่องเมื่อดำเนินการเสร็จ
เซิร์ฟเวอร์ยังให้โอกาสในการใช้อย่างสร้างสรรค์ ตัวอย่างเช่น คุณสามารถแจกจ่ายเว็บแอปพลิเคชันแบบพกพาบนซีดีหรือ USB หรือแม้แต่เป็นแอปพลิเคชันเดสก์ท็อปที่สร้างขึ้นใน PHP โดยไม่ต้องใช้ GTK หรือไลบรารีกราฟิกอื่นๆ
คู่มือ PHP เน้นว่าเซิร์ฟเวอร์ในตัวมีไว้สำหรับการพัฒนาและไม่แนะนำให้ใช้กับเซิร์ฟเวอร์ที่ใช้งานจริง ไม่มีคำสั่ง INI ที่รับผิดชอบสำหรับเซิร์ฟเวอร์ (ยกเว้นการกำหนดสีของเอาต์พุตในคอนโซล) และดูเหมือนว่าแนวคิดหลักของเอกสารประกอบคือ: "ตอนนี้เรามีเว็บเซิร์ฟเวอร์ด้วย ปล่อยเราไว้คนเดียว"
อย่างไรก็ตาม ฉันเชื่อว่าเซิร์ฟเวอร์ฝังตัวเป็นเครื่องมือในการพัฒนาและทดสอบที่มีคุณค่า ตัวอย่างเช่น ในเครื่องของฉัน ฉันใช้ Apache ที่ติดตั้งไว้ล่วงหน้าพร้อมการกำหนดค่าแบบกำหนดเองที่เหมาะกับฉัน แต่บางครั้งฉันก็อยากลองใช้งานเว็บแอปพลิเคชันใหม่ๆ ด้วยเว็บเซิร์ฟเวอร์แบบฝัง ฉันสามารถทดสอบแอปพลิเคชันได้โดยตรงจากโฟลเดอร์ดาวน์โหลดหรือโฟลเดอร์ temp และย้ายไปยังสภาพแวดล้อมปกติของฉันเมื่อจำเป็นเท่านั้น
แต่สำหรับผู้เริ่มต้น มันไม่ง่ายขนาดนั้น เนื่องจากแอปพลิเคชั่นจำนวนมากใช้ .htaccess และ mod_rewrite แต่ฉันแน่ใจว่าใครบางคน (บางทีอาจเป็นคุณ ทำไมจะไม่ได้) จะเขียนอะแดปเตอร์สำหรับสิ่งนี้ และฉันขอเป็นคนแรกที่จะทดสอบ
ในบทความนี้ ผมจะอธิบายตัวอย่างพื้นฐานบางประการของการใช้เซิร์ฟเวอร์ฝังตัว และแสดงวิธีทำให้มีประโยชน์สำหรับการพัฒนาและการทดสอบ
เราใช้เซิร์ฟเวอร์ในตัว
ดังนั้น ในการใช้เซิร์ฟเวอร์ เราต้องการ php 5.4 หรือสูงกว่า ในการตรวจสอบเวอร์ชัน PHP ของคุณ ให้เรียกใช้:php -v
คุณยังสามารถระบุได้ว่าเซิร์ฟเวอร์มีอยู่ในแอสเซมบลีของคุณหรือไม่โดยการเรียกใช้:
php -h
และมองหาคำอธิบายของตัวเลือก "-S" และ "-t" ซึ่งใช้สำหรับเซิร์ฟเวอร์เท่านั้น
ในการตรวจสอบเซิร์ฟเวอร์ คุณสามารถสร้างไฟล์ index.php ในไดเร็กทอรีปัจจุบัน ซึ่งจะมีการเรียกฟังก์ชัน phpinfo () แล้วจึงเริ่มเซิร์ฟเวอร์:
$ php -S 127.0.0.1:8080 เซิร์ฟเวอร์การพัฒนา PHP 5.4.0RC7 เริ่มเมื่อวันศุกร์ที่ 26 กุมภาพันธ์ เวลา 18:49:29 น. 2012 ฟังบน 127.0.0.1:8080 รูทของเอกสารคือ / home / ec2-user กด Ctrl-C เพื่อออก
และตอนนี้ คุณสามารถดูเนื้อหาที่ให้บริการโดยเว็บเซิร์ฟเวอร์แบบฝังตัว:
คำขอของลูกค้าแต่ละรายจะถูกเขียนไปยังคอนโซล:
80.180.55.37:36318 : /
80.180.55.37:36584 : /
กลับมาดูที่พารามิเตอร์บรรทัดคำสั่ง "-S" ซึ่งใช้เพื่อระบุที่อยู่ที่จะเข้าถึงเซิร์ฟเวอร์ได้ ค่าที่เป็นไปได้:
localhost- เซิร์ฟเวอร์จะสามารถเข้าถึงได้จากเครื่องท้องถิ่นเท่านั้น
0.0.0.0
- บนอินเทอร์เฟซใด ๆ ของเครื่อง
IP . ภายนอกหรือสีเทาใดๆ- เฉพาะใน IP ที่ระบุ
อ็อพชัน -t ตั้งค่ารูทไดเร็กทอรีที่ระบุ ตัวอย่างเช่น:
$ php -S
นอกจาก,. คุณสามารถระบุชื่อไฟล์เราเตอร์เฉพาะได้ ตัวอย่างเช่น:
$ php -S> localhost หรือ IP สาธารณะของคุณ>: 8080 -t / home / ec2-user / สาธารณะสาธารณะ / index.php
เอาต์พุตจากเราเตอร์นี้จะถูกแยกวิเคราะห์และดำเนินการโดยเซิร์ฟเวอร์ ตัวอย่างง่ายๆ:
ยินดีต้อนรับสู่ PHP
หากสคริปต์ส่งคืน FALSE URI ที่ร้องขอจะถูกประมวลผลโดยเซิร์ฟเวอร์ ซึ่งจะออกทรัพยากรที่ร้องขอ หรือจะส่งคืนข้อผิดพลาด 404 หากสคริปต์ส่งคืนสิ่งอื่น เอาต์พุตของสคริปต์จะถูกส่งไปยังไคลเอนต์
แม้ว่าวิธีนี้จะช่วยให้เราควบคุมได้มากขึ้น แต่ก็มีบางสิ่งที่คุณควรรู้ ขั้นแรก เซิร์ฟเวอร์ PHP จะส่งชุดส่วนหัว HTTP ขั้นต่ำเท่านั้น:
การเชื่อมต่อ: ปิด ประเภทเนื้อหา: ข้อความ / html โฮสต์: aws-dev-01.vtardia.com X-Powered-By: PHP / 5.4.0RC7 D
เปรียบเทียบสิ่งนี้กับส่วนหัวที่ส่งคืนโดยเซิร์ฟเวอร์ Apache:
ช่วงที่ยอมรับ: ไบต์ การเชื่อมต่อ: Keep-Alive เนื้อหายาว: 631 ประเภทเนื้อหา: ข้อความ / html วันที่: วันเสาร์ 04 ก.พ. 2555 18:24:42 GMT Etag: "bbb99-277-4ace8c5470a40" Keep-Alive: หมดเวลา = 15 สูงสุด = 100 แก้ไขล่าสุด: พุธ 14 ก.ย. 2554 15:54:09 GMT เซิร์ฟเวอร์: Apache / 2.2.21 (Unix) DAV / 2
หากแอปพลิเคชันของคุณใช้ส่วนหัว จะต้องพิจารณาถึงความแตกต่างในสภาพแวดล้อมการพัฒนาและการใช้งานจริง
ประการที่สอง เซิร์ฟเวอร์ฝังตัวมี SAPI (Server API) ที่แตกต่างกัน ดังนั้น ด้วยการกำหนดเส้นทางในดัชนี, php คุณสามารถกำหนดการเรียกสคริปต์บนเซิร์ฟเวอร์ทดสอบหรือเซิร์ฟเวอร์ที่ใช้งานจริงได้ php_sapi_name () จะส่งคืน "cli-server" บนเซิร์ฟเวอร์ฝังตัว:
มีคำสั่ง INI พิเศษที่เรียกว่า "cli_server.color" คำสั่งนี้ส่งคืนเอาต์พุตที่เป็นสีไปยังคอนโซล สร้างไฟล์เปล่าชื่อ cli-server.iniและแทรกบรรทัดนี้:
cli_server.color = เปิด
คุณสามารถสร้างการกำหนดค่าสภาพแวดล้อมที่ไม่ซ้ำกันสำหรับเซิร์ฟเวอร์ของคุณโดยการระบุคำสั่งที่จำเป็นในไฟล์ INI ของคุณ คำสั่งที่ไม่ได้ประกาศจะยอมรับค่าเริ่มต้น ตอนนี้เราได้ประกาศเพียงหนึ่งคำสั่ง - cli_server.color.
เริ่มเซิร์ฟเวอร์ด้วยพารามิเตอร์ "-c" ที่ระบุไฟล์ INI:
$ php -S localhost -c cli-server.ini
หากเครื่องอ่านบัตรของคุณรองรับสี คุณควรจะเห็นผลลัพธ์เป็น "สี" ในคอนโซล สถานะ 200 จะถูกเน้นด้วยสีเขียว 404 เป็นสีส้ม และข้อผิดพลาดของสคริปต์จะถูกเน้นด้วยสีแดง
เราสร้างเซิร์ฟเวอร์ส่วนบุคคล
ตอนนี้ คุณรู้ทุกอย่างเกี่ยวกับ Embedded Server แล้ว มาทำอะไรเจ๋งๆ กัน มาสร้างเซิร์ฟเวอร์พกพาของเราเองกันเถอะ!ฉันจะเริ่มต้นด้วยโครงสร้างต่อไปนี้สำหรับแอปพลิเคชันของเรา:
โฟลเดอร์ "library" ประกอบด้วยรหัสแอปพลิเคชัน "public" คือไดเร็กทอรีราก ประกอบด้วย index.php และไฟล์สแตติกบางไฟล์ บทช่วยสอนนี้จะเน้นที่โฟลเดอร์ "เซิร์ฟเวอร์" ดังนั้นแอปพลิเคชันของเราจะประกอบด้วย "Hello Word!" อย่างง่าย และรูปภาพบางส่วนและ css
เป้าหมายของเราคือสามารถเริ่มต้นเซิร์ฟเวอร์จากไดเรกทอรีแอปพลิเคชันด้วยคำสั่งเดียว และเซิร์ฟเวอร์ของเราจะดูแลการกำหนดเส้นทาง ส่วนหัว HTTP และข้อผิดพลาด
$ ./start.sh
ลองดูที่สคริปต์เริ่มต้น:
#! / bin / bash INIFILE = "$ (pwd) /server/server.ini" DOCROOT = "$ (pwd) / public" ROUTER = "$ (pwd) /server/router.php" HOST = 0.0.0.0 PORT = 8080 PHP = $ (php ใด) ถ้า [$? ! = 0]; จากนั้น echo "ไม่พบ PHP" ออก 1 fi $ PHP -S $ HOST: $ PORT -c $ INIFILE -t $ DOCROOT $ ROUTER
ฉันสมมติว่าสคริปต์ถูกเรียกใช้จากไดเร็กทอรีแอปพลิเคชัน ดังนั้น INIFILE, DOCROOT, ROUTER จึงถูกกำหนดโดยใช้ pwd เส้นทางไปยัง php ถูกกำหนดโดยใช้คำสั่งใด หากไม่พบ php ใน $ PATH ของผู้ใช้ สคริปต์จะล้มเหลวโดยมีข้อผิดพลาด
วิธีนี้ใช้งานได้ดี แต่ให้ผู้ใช้เปลี่ยนพารามิเตอร์ที่กำหนดจากบรรทัดคำสั่งได้ เช่น
ถ้า [! -z $ INIFILE]; จากนั้น INIFILE = "$ (pwd) /server/server.ini" fi
ดำเนินการต่อ โฟลเดอร์ "ข้อผิดพลาด" มีไฟล์สำหรับข้อความแสดงข้อผิดพลาด HTTP นี่คือตัวอย่างเกี่ยวกับข้อผิดพลาด 403 แม้ว่าฉันจะใช้ HTML เท่านั้น แต่สคริปต์จะรวมอยู่ด้วย ฉันใช้ รวมเพื่อให้คุณสามารถใช้รหัส php ใดก็ได้:
403: ต้องห้าม
ขออภัย ไม่สามารถเข้าถึงทรัพยากรที่ร้องขอได้
ทีนี้มาดูที่ router.php งานของไฟล์นี้คือรับและจัดการคำขอทั้งหมดและโอนไปยังเซิร์ฟเวอร์หากมีไฟล์นี้อยู่เท่านั้น หน้าข้อผิดพลาดทั้งหมดจะแสดงขึ้นโดยการเชื่อมต่อเทมเพลต
ในบรรทัดแรก ฉันกำหนดพารามิเตอร์ส่วนกลางบางอย่าง เช่น DIRECTORY_INDEX ไดเร็กทอรีที่มีเทมเพลตข้อผิดพลาด พารามิเตอร์ date_default_timezone_set () ต้องตรงกับการตั้งค่า OS ไม่เช่นนั้นจะเกิดความไม่สอดคล้องกันระหว่างรายการในบันทึกและบนเซิร์ฟเวอร์ ฉันยังเพิ่มรายการที่อยู่ IP ที่อนุญาตเพื่อปรับปรุงความปลอดภัย
จำเป็นต้องใช้ฟังก์ชัน logAccess () เนื่องจากเมื่อสคริปต์การกำหนดเส้นทางยอมรับคำขอ เซิร์ฟเวอร์บันทึกจะถูกละเว้นโดยค่าเริ่มต้น ฟังก์ชันนี้ยอมรับเฉพาะรหัสสถานะ และรูปแบบผลลัพธ์จะสอดคล้องกับรูปแบบเซิร์ฟเวอร์อย่างสมบูรณ์
งานแรกของเราคือการตรวจสอบความปลอดภัย หาก IP ของไคลเอ็นต์ไม่อยู่ในอาร์เรย์ของ IP ที่อนุญาต ให้แสดงข้อความแสดงข้อผิดพลาดและออกจากสคริปต์ เราจำเป็นต้องให้รหัสสถานะอื่นที่ไม่ใช่ 200 และฟังก์ชันส่วนหัว () จะไม่ทำงานที่นี่ ดังนั้นเราจึงใช้ฟังก์ชันใหม่ - http_response_code
หาก IP ของลูกค้าอยู่ในอาร์เรย์ของ IP ที่อนุญาต ขั้นตอนต่อไปของเราคือรับเส้นทางที่ร้องขอและนามสกุลไฟล์ หากส่วนขยายว่างเปล่า เราคิดว่าผู้ใช้กำลังขอโฟลเดอร์และสร้างเส้นทางโดยใช้ DIRECTORY_INDEX ที่กำหนดไว้ก่อน
สุดท้าย หากมีไฟล์ที่ร้องขออยู่ ให้คืนค่า FALSE และให้เซิร์ฟเวอร์เข้าถึงไฟล์ หากไม่เป็นเช่นนั้น ข้อความแสดงข้อผิดพลาด 404 จะปรากฏขึ้น
สรุป
มันคือทั้งหมด อย่างที่คุณเห็น เซิร์ฟเวอร์ php ใช้งานง่าย เซิร์ฟเวอร์ส่วนบุคคลของเรานั้นง่ายมาก รหัสสามารถปรับให้เหมาะสมและรวมเข้ากับคลาสที่ซับซ้อนและใช้งานได้มากขึ้น มีความสุขในการเข้ารหัส!ป.ล. ฉันยินดีที่จะยอมรับคำวิจารณ์และความคิดเห็นเกี่ยวกับการแปลเป็นการส่วนตัว
และนั่นคือสิ่งที่ลูกค้าใช้เป็น "โฮสต์เป้าหมาย" ของคำขอจริงๆ SERVER_NAME ถูกกำหนดไว้ในการกำหนดค่าเซิร์ฟเวอร์ อันไหนขึ้นอยู่กับสิ่งที่คุณต้องการสำหรับ ตอนนี้คุณควรเข้าใจว่านี่คือค่าที่ไคลเอ็นต์ควบคุม ซึ่งไม่สามารถเชื่อถือได้สำหรับใช้ในตรรกะทางธุรกิจ และอีกค่าหนึ่งคือค่าที่เซิร์ฟเวอร์ควบคุมซึ่งมีความน่าเชื่อถือมากกว่า อย่างไรก็ตาม คุณต้องตรวจสอบให้แน่ใจว่าเว็บเซิร์ฟเวอร์มีการกำหนดค่า SERVER_NAME ที่ถูกต้อง ยกตัวอย่าง Apache HTTPD นี่เป็นข้อความที่ตัดตอนมาจากเอกสารประกอบ:
หากไม่ได้ระบุชื่อเซิร์ฟเวอร์ เซิร์ฟเวอร์จะพยายามอนุมานชื่อโฮสต์โดยทำการค้นหาแบบย้อนกลับบนที่อยู่ IP หากไม่มีการระบุพอร์ตใน ServerName เซิร์ฟเวอร์จะใช้พอร์ตจากคำขอที่เข้ามา เพื่อความน่าเชื่อถือและคาดการณ์ได้ดีที่สุด คุณต้องระบุชื่อโฮสต์และพอร์ตที่ชัดเจนโดยใช้คำสั่ง ServerName
รีเฟรช: หลังจากตรวจสอบคำตอบของ Pekka สำหรับคำถามของคุณซึ่งมีลิงก์ไปยังคำตอบของ bobince ว่า PHP จะคืนค่า HTTP_HOST สำหรับ SERVER_NAME เสมอ ซึ่งตรงกันข้ามกับประสบการณ์ของฉันเอง PHP 4.x + Apache HTTPD 1.2.x เมื่อสองสามปีก่อน ฉันปัดฝุ่น XAMPP ปัจจุบันของฉันบน Windows XP (Apache HTTPD 2.2.1 พร้อม PHP 5.2.8) เรียกใช้สร้างหน้า PHP ที่พิมพ์ทั้งสองค่าสร้างแอปพลิเคชันทดสอบ Java โดยใช้ URLConnection เพื่อเปลี่ยนส่วนหัวของโฮสต์ และการทดสอบสอนฉันว่ากรณีนี้ (เท็จ) จริง
หลังจากสงสัย PHP แล้วลองขุดดู การรายงานข้อผิดพลาด PHPในหัวข้อนี้ ฉันพบว่ารากของปัญหาอยู่ที่เว็บเซิร์ฟเวอร์ที่ใช้งานอยู่ ซึ่งไม่ได้ส่งคืนส่วนหัวของโฮสต์ HTTP อย่างถูกต้องเมื่อมีการร้องขอ SERVER_NAME ดังนั้นฉันจึงขุดลงไปใน การรายงานข้อผิดพลาด Apache HTTPDโดยใช้ คีย์เวิร์ดต่างๆเกี่ยวกับเรื่องและในที่สุดฉันก็พบข้อผิดพลาดที่เกี่ยวข้อง ลักษณะการทำงานนี้ถูกนำมาใช้ตั้งแต่ประมาณ Apache HTTPD 1.3 คุณต้องตั้งค่าคำสั่ง UseCanonicalName ในรายการ
สิ่งนี้ใช้ได้ผลสำหรับฉัน
โดยทั่วไปแล้ว SERVER_NAME มีความน่าเชื่อถือมากกว่า แต่คุณ ขึ้นอยู่กับในการกำหนดค่าเซิร์ฟเวอร์!
HTTP_HOST เป็นโฮสต์เป้าหมายที่ส่งโดยไคลเอนต์ ผู้ใช้มีอิสระในการจัดการกับผู้ใช้ ไม่จำเป็นต้องส่งคำขอไปยังไซต์ของคุณด้วยคำขอ HTTP_HOST สำหรับค่า www.stackoverflow.com
SERVER_NAME มาจากคำจำกัดความของเซิร์ฟเวอร์ VirtualHost ดังนั้นจึงถือว่ามีความน่าเชื่อถือมากกว่า นอกจากนี้ยังสามารถจัดการจากภายนอกได้ภายใต้เงื่อนไขบางประการที่เกี่ยวข้องกับการกำหนดค่าเว็บเซิร์ฟเวอร์ของคุณ ดูนี่ คำถาม SO นี้ซึ่งเกี่ยวข้องกับด้านความปลอดภัยของทั้งสองตัวเลือก
คุณไม่จำเป็นต้องพึ่งพาเพื่อความปลอดภัย อย่างไรก็ตาม อันไหนที่จะใช้จริงๆ ขึ้นอยู่กับสิ่งที่คุณต้องการทำ หากคุณต้องการกำหนดโดเมนที่สคริปต์ของคุณกำลังทำงานอยู่ คุณสามารถใช้ HTTP_HOST ได้อย่างปลอดภัย ตราบใดที่ค่าที่ไม่ถูกต้องที่มาจากผู้โจมตีไม่สามารถทำลายสิ่งใดๆ ได้
โปรดทราบว่าหากคุณต้องการใช้ IPv6 คุณอาจต้องการใช้ HTTP_HOST ไม่ใช่ SERVER_NAME หากคุณป้อน http: // [:: 1] / ตัวแปรสภาพแวดล้อมจะเป็นดังนี้:
HTTP_HOST = [:: 1] SERVER_NAME = :: 1
ซึ่งหมายความว่าหากคุณทำ mod_rewrite คุณอาจได้ผลลัพธ์ที่ไม่พึงประสงค์ ตัวอย่างการเปลี่ยนเส้นทาง SSL:
# SERVER_NAME จะไม่ทำงาน - เปลี่ยนเส้นทางไปที่ https: // :: 1 / RewriteRule * Https: //% (SERVER_NAME) / # HTTP_HOST จะทำงาน - เปลี่ยนเส้นทางไปที่ https: // [:: 1] / RewriteRule * Https: //% (HTTP_HOST) /
ใช้ได้เฉพาะเมื่อคุณเข้าถึงเซิร์ฟเวอร์โดยไม่มีชื่อโฮสต์
ถ้าคุณต้องการตรวจสอบผ่าน server.php หรือสิ่งที่คุณต้องการเรียกด้วยสิ่งต่อไปนี้:
จากนั้นเข้าถึง URL ที่ถูกต้องทั้งหมดสำหรับเว็บไซต์ของคุณและตรวจสอบความแตกต่าง
ฉันต้องใช้เวลาสักพักกว่าจะรู้ว่า "SERVER_NAME น่าเชื่อถือกว่า" คนอื่นๆ หมายถึงอะไร ฉันใช้เซิร์ฟเวอร์ที่ใช้ร่วมกันและไม่สามารถเข้าถึงคำสั่งโฮสต์เสมือนได้ ดังนั้นฉันจึงใช้ mod_rewrite ใน .htaccess เพื่อแมป HTTP_HOST ต่างๆ ในไดเร็กทอรีต่างๆ ในกรณีนี้ ค่า HTTP_HOST นี้สมเหตุสมผล
สถานการณ์จะคล้ายคลึงกันหากคุณใช้โฮสต์เสมือนตามชื่อ: คำสั่ง ServerName ภายในโฮสต์เสมือนเพียงบอกว่าชื่อโฮสต์ใดจะถูกจับคู่กับโฮสต์เสมือนนั้น สิ่งสำคัญที่สุดคือ ในทั้งสองกรณี ชื่อโฮสต์ที่ไคลเอ็นต์ให้ไว้ระหว่างการร้องขอ (HTTP_HOST) ต้องตรงกับชื่อบนเซิร์ฟเวอร์ ซึ่งแมปกับไดเร็กทอรีเอง ไม่ว่าการแมปจะทำโดยขัดกับคำสั่งโฮสต์เสมือนหรือด้วยกฎ htaccess mod_rewrite หรือไม่ก็เป็นเรื่องรองที่นี่ ในกรณีเหล่านี้ HTTP_HOST จะเหมือนกับ SERVER_NAME ฉันดีใจที่ Apache ได้รับการกำหนดค่าด้วยวิธีนี้
อย่างไรก็ตาม สถานการณ์จะแตกต่างจากโฮสต์เสมือนที่ใช้ IP ในกรณีนี้ และในกรณีนี้เท่านั้น SERVER_NAME และ HTTP_HOST อาจแตกต่างกัน เนื่องจากตอนนี้ไคลเอ็นต์เลือกเซิร์ฟเวอร์ตาม IP ไม่ใช่ตามชื่อ อันที่จริง อาจมีการกำหนดค่าพิเศษที่สำคัญ
จากนี้ไป ฉันจะใช้ SERVER_NAME ในกรณีที่รหัสของฉันถูกผลักเข้าไปในการกำหนดค่าพิเศษเหล่านี้
สมมติว่าคุณมีการตั้งค่าที่เรียบง่าย (CentOS 7, Apache 2.4.x และ PHP 5.6.20) และมีเพียงเว็บไซต์เดียวเท่านั้น (ไม่มีโฮสติ้งที่ใช้ร่วมกัน) ...
ในแง่ PHP $ _SERVER ["SERVER_NAME"] เป็นองค์ประกอบ PHP ที่ลงทะเบียนในซูเปอร์คลาส $ _SERVER ตามการกำหนดค่า Apache ของคุณ (** ServerName ** directive with UseCanonicalName On) ใน httpd.conf (ไม่ว่าจะมาจากการกำหนดค่าโฮสต์เสมือนที่เปิดใช้งาน) ไฟล์ อะไรก็ได้ ฯลฯ) HTTP_HOSTถูกอนุมานจากส่วนหัวโฮสต์ HTTP ปฏิบัติเหมือนเป็นการป้อนข้อมูลของผู้ใช้ กรองและตรวจสอบก่อนใช้งาน
นี่คือตัวอย่างที่ฉันใช้ $ _SERVER ["SERVER_NAME"] เป็นพื้นฐานในการเปรียบเทียบ วิธีถัดไปคือสำหรับคลาสลูกเฉพาะ ซึ่งฉันตั้งชื่อว่า ServerValidator (ลูกของ Validator) ServerValidator ตรวจสอบหกหรือเจ็ดรายการใน $ _SERVER ก่อนใช้งาน
ในการพิจารณาว่าคำขอ HTTP เป็น POST หรือไม่ ฉันใช้วิธีนี้
ฟังก์ชันสาธารณะ isPOST () (ส่งคืน (($ this-> requestMethod === "POST") && // Ignore $ this-> hasTokenTimeLeft () && // ละเว้น $ this-> hasSameGETandPOSTIdentities () && // Ingore ($ นี่ -> httpHost === filter_input (INPUT_SERVER, "SERVER_NAME")));)
เมื่อเรียกใช้เมธอดนี้ การกรองและการตรวจสอบความถูกต้องของอิลิเมนต์ $ _SERVER ที่สอดคล้องกัน (และชุดคุณสมบัติที่เกี่ยวข้องกัน) จะเสร็จสิ้น
($ this-> httpHost === filter_input (INPUT_SERVER, "SERVER_NAME")
ตรวจสอบว่าค่าของ $ _SERVER ["HTTP_HOST"] (ได้มาจากส่วนหัวของโฮสต์ HTTP ที่ร้องขอในขั้นสุดท้าย) ตรงกับ $ _SERVER ["SERVER_NAME"]
ตอนนี้ฉันกำลังใช้การสนทนาระดับสุดยอดเพื่ออธิบายตัวอย่างของฉัน แต่นั่นเป็นเพราะว่าบางคนไม่คุ้นเคยกับ INPUT_GET, INPUT_POST และ INPUT_SERVER เกี่ยวกับ filter_input_array ()
สิ่งสำคัญที่สุดคือฉันไม่ดำเนินการตามคำขอ POST บนเซิร์ฟเวอร์ของฉัน เว้นแต่จะตรงตามเงื่อนไขทั้งสี่ข้อ ดังนั้นในแง่ของคำขอ POST ปฏิเสธที่จะให้ส่วนหัวของโฮสต์ HTTP (ตรวจสอบสถานะก่อนหน้านี้) คาถาลงโทษสำหรับเบราว์เซอร์ที่เข้มงวด HTTP 1.0... นอกจากนี้โฮสต์ที่ร้องขอจะต้องตรงกับค่า ชื่อเซิร์ฟเวอร์ใน httpd.conf และตามส่วนขยาย - ค่าของ $ _SERVER ("SERVER_NAME") ใน supermacle $ _SERVER อีกครั้ง ฉันจะใช้ INPUT_SERVER กับฟังก์ชันตัวกรอง PHP แต่คุณกำลังทำลายการดริฟท์ของฉัน
ตามที่ระบุไว้ใน balusC SERVER_NAME ไม่น่าเชื่อถือและสามารถเปลี่ยนแปลงได้ในการกำหนดค่า apache การกำหนดค่าเซิร์ฟเวอร์ และไฟร์วอลล์ที่อาจอยู่ระหว่างคุณกับเซิร์ฟเวอร์
ฟังก์ชันต่อไปนี้จะคืนค่าโฮสต์จริงเสมอ (โฮสต์ที่ผู้ใช้พิมพ์) โดยไม่มีพอร์ต และเกือบจะเชื่อถือได้:
ฟังก์ชัน getRealHost () (รายการ ($ realHost) = ระเบิด (":", $ _ SERVER ["HTTP_HOST"]); ส่งคืน $ realHost;)
แบ่งในการเริ่มต้น เราจะปรับปรุงหน้าการลงทะเบียนโดยเพิ่มความสามารถในการอัปโหลดอวาตาร์ รูปภาพต้นฉบับต้องอยู่ในรูปแบบ jpg, gif หรือ png และไม่ควรเกิน 2 MB ไม่ต้องกังวล หลังจากบีบอัดด้วยสคริปต์แล้ว อวาตาร์จะมีขนาดประมาณ 3 kb และอยู่ในรูปแบบ jpg เปิดเพจ ทะเบียนphpและเพิ่มในแท็ก < รูปร่าง> ไลน์ enctype = "หลายส่วน / รูปแบบข้อมูล"ดังในตัวอย่าง: