คอมพิวเตอร์ Windows อินเทอร์เน็ต

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.

ความคิดเห็น

  • ดูรายการทั้งหมดขององค์ประกอบอาร์เรย์ $ _SERVER
  • คุณสามารถใช้ฟังก์ชัน print_r () ซึ่งพิมพ์ดัมพ์ของอาร์เรย์ หรือใช้ฟังก์ชัน phpinfo () ซึ่งแสดงข้อมูลเกี่ยวกับตัวแปล PHP

    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 : 8090 -t / home / ec2-user / สาธารณะ
    นอกจาก,. คุณสามารถระบุชื่อไฟล์เราเตอร์เฉพาะได้ ตัวอย่างเช่น:
    $ 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

    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 ในรายการ ชื่อเซิร์ฟเวอร์ใน httpd.conf (ตรวจสอบคำเตือนที่ด้านล่างของเอกสารด้วย!)

    ชื่อเซิร์ฟเวอร์ example.com ใช้CanonicalName บน

    สิ่งนี้ใช้ได้ผลสำหรับฉัน

    โดยทั่วไปแล้ว 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 = "หลายส่วน / รูปแบบข้อมูล"ดังในตัวอย่าง:


    การลงทะเบียน










    ตอนนี้เราประหยัด reg.php

    2. จากนั้นคุณต้องสร้างฟิลด์อื่นในตาราง ผู้ใช้... ไปที่ phpmyadmin, เลือกฐานและตารางที่ต้องการ


    เราตั้งค่าทั้งหมดตามภาพ:

    เส้นทางไปยังอวาตาร์จะถูกเขียนในช่องนี้ และจะถูกบันทึกไว้ในโฟลเดอร์แยกต่างหาก เรียกมันว่า "อวาตาร์" โฟลเดอร์จะอยู่ในไดเร็กทอรีเดียวกันกับไฟล์สคริปต์ที่เหลือ

    3.ไปที่ไฟล์ บันทึก_ ผู้ใช้. phpและเพิ่มรหัสต่อไปนี้หลังจากลบช่องว่างจากการเข้าสู่ระบบและรหัสผ่าน:

    // ลบช่องว่างพิเศษ
    $ เข้าสู่ระบบ = ตัด ($ เข้าสู่ระบบ);

    // เพิ่มใหม่ *******************************************

    // เพิ่มการตรวจสอบความยาวของล็อกอินและรหัสผ่าน
    ถ้า (strlen ($ เข้าสู่ระบบ)< 3 or strlen($login) > 15) {
    ออก ("การเข้าสู่ระบบต้องมีอย่างน้อย 3 ตัวอักษรและไม่เกิน 15");
    }
    ถ้า (strlen ($ รหัสผ่าน)< 3 or strlen($password) > 15) {
    exit ("รหัสผ่านต้องมีอย่างน้อย 3 ตัวอักษรและไม่เกิน 15");
    }

    if (! empty ($ _ POST ["fupload"])) // ตรวจสอบว่าผู้ใช้โพสต์ภาพหรือไม่
    {
    $ fupload = $ _ POST ["fupload"]; $ fupload = ตัดแต่ง ($ fupload);
    ถ้า ($ fupload == "" หรือว่าง ($ fupload)) (
    unset ($ fupload); // หากตัวแปร $ fupload ว่างเปล่า ให้ลบออก
    }
    }
    if (! isset ($ fupload) หรือว่าง ($ fupload) หรือ $ fupload == "")
    {
    // หากไม่มีตัวแปร (ผู้ใช้ไม่ได้ส่งรูปภาพ) เราจะกำหนดรูปภาพที่เตรียมไว้ล่วงหน้าพร้อมข้อความว่า "no avatar"
    $ avatar = "ภาพแทนตัว / net-avatara.jpg"; // คุณสามารถวาด net-avatara.jpg หรือรับแหล่งที่มา
    }
    อื่น
    {
    // มิฉะนั้น - โหลดอิมเมจผู้ใช้
    $ path_to_90_directory = "avatars /"; // โฟลเดอร์ที่จะโหลดรูปภาพเริ่มต้นและสำเนาที่บีบอัด

    ถ้า (preg_match ("/ [.] (JPG) | (jpg) | (gif) | (GIF) | (png) | (PNG) $ /", $ _ FILES ["fupload"] ["name"]) ) // ตรวจสอบรูปแบบของภาพต้นฉบับ
    {
    $ filename = $ _FILES ["fupload"] ["name"];
    $ แหล่งที่มา = $ _FILES ["fupload"] ["tmp_name"];
    $ เป้าหมาย = $ path_to_90_directory $ ชื่อไฟล์;
    move_uploaded_file ($ source, $ target); // อัปโหลดต้นฉบับไปยังโฟลเดอร์ $ path_to_90_directory
    if (preg_match ("/ [.] (GIF) | (gif) $ /", $ filename)) (
    $ im = imagecreatefromgif ($ path_to_90_directory. $ filename); // หากต้นฉบับอยู่ในรูปแบบ gif ให้สร้างรูปภาพในรูปแบบเดียวกัน จำเป็นสำหรับการบีบอัดที่ตามมา
    }
    if (preg_match ("/ [.] (PNG) | (png) $ /", $ filename)) (
    $ im = imagecreatefrompng ($ path_to_90_directory. $ filename); // หากต้นฉบับอยู่ในรูปแบบ png ให้สร้างรูปภาพในรูปแบบเดียวกัน จำเป็นสำหรับการบีบอัดที่ตามมา
    }

    ถ้า (preg_match ("/ [.] (JPG) | (jpg) | (jpeg) | (JPEG) $ /", $ filename)) (
    $ im = imagecreatefromjpeg ($ path_to_90_directory. $ ชื่อไฟล์); // หากต้นฉบับอยู่ในรูปแบบ jpg ให้สร้างภาพในรูปแบบเดียวกัน จำเป็นสำหรับการบีบอัดที่ตามมา
    }
    // การสร้างภาพสี่เหลี่ยมจัตุรัสและการบีบอัดที่ตามมาจากเว็บไซต์ www.codenet.ru
    // สร้างสี่เหลี่ยมจัตุรัสขนาด 90x90
    // ปลายทาง - ผลลัพธ์ของภาพ
    // w - ความกว้างของภาพ
    // อัตราส่วน - อัตราส่วนภาพ
    $ w = 90; // สี่เหลี่ยม 90x90. สามารถจัดหาขนาดอื่น ๆ ได้
    // สร้างภาพต้นฉบับตาม
    // ไฟล์ต้นฉบับและกำหนดขนาดของมัน
    $ w_src = imagesx ($ im); // คำนวณความกว้าง
    $ h_src = ภาพ ($ im); // คำนวณความสูงของภาพ
    // สร้างภาพสี่เหลี่ยมว่าง
    // มันคือ truecolor! ที่สำคัญ !, มิฉะนั้นเราจะได้ผลลัพธ์ 8 บิต
    $ dest = imagecreatetruecolor ($ w, $ w);
    // ตัดศูนย์สี่เหลี่ยมที่ x ถ้ารูปภาพอยู่ในแนวนอน
    ถ้า ($ w_src> $ h_src)
    สำเนาภาพตัวอย่าง ($ dest, $ im, 0, 0,
    รอบ ((สูงสุด ($ w_src, $ h_src) - นาที ($ w_src, $ h_src)) / 2),
    0, $ w, $ w, นาที ($ w_src, $ h_src), ขั้นต่ำ ($ w_src, $ h_src));
    // ตัดยอดสี่เหลี่ยมที่ y ออก
    // ถ้ารูปเป็นแนวตั้ง (ทั้งๆ ที่ตรงกลางก็ได้)
    ถ้า ($ w_src<$h_src)
    สำเนาภาพตัวอย่าง ($ dest, $ im, 0, 0, 0, 0, $ w, $ w,
    ขั้นต่ำ ($ w_src, $ h_src), ขั้นต่ำ ($ w_src, $ h_src));
    // รูปภาพสี่เหลี่ยมจัตุรัสถูกปรับขนาดโดยไม่มีการตัดทอน
    ถ้า ($ w_src == $ h_src)
    สำเนาภาพตัวอย่าง ($ dest, $ im, 0, 0, 0, 0, $ w, $ w, $ w_src, $ w_src);
    $ วันที่ = เวลา (); // คำนวณเวลาในขณะนี้
    imagejpeg ($ dest, $ path_to_90_directory. $ date. ". jpg"); // บันทึกภาพ jpg ลงในโฟลเดอร์ที่ต้องการ ชื่อจะเป็นเวลาปัจจุบัน ทำขึ้นเพื่อไม่ให้อวตารมีชื่อเหมือนกัน
    // ทำไมต้อง jpg? ใช้พื้นที่น้อยมาก + ภาพเคลื่อนไหวของภาพ gif ที่ทำให้ผู้ใช้เสียสมาธิถูกทำลาย ไม่ใช่เรื่องน่ายินดีนักที่จะอ่านคำอธิบายของเขาเมื่อคุณสังเกตเห็นการเคลื่อนไหวบางอย่างจากหางตาของคุณ
    $ avatar = $ path_to_90_directory. $ date. ". jpg"; // ป้อนเส้นทางไปยัง avatar ในตัวแปร
    $ delfull = $ path_to_90_directory $ ชื่อไฟล์;
    unlink ($ delfull); // ลบภาพต้นฉบับที่อัพโหลด เราไม่ต้องการมันอีกต่อไป งานคือการได้รับขนาดเล็ก
    }
    อื่น
    {
    // ในกรณีที่รูปแบบไม่ตรงกัน ให้ออกข้อความที่เหมาะสม
    exit ("อวตารต้องอยู่ในรูปแบบ JPG, GIF หรือ PNG");
    }
    // สิ้นสุดกระบวนการโหลดและกำหนดตัวแปร $ avatar ด้วยที่อยู่ของ avatar ที่โหลด
    }



    // เพิ่มใหม่ *******************************************
    // จากนั้นทุกอย่างจากส่วนแรกของบทความจะตามมา แต่จำเป็นต้องเพิ่มการเปลี่ยนแปลงในคำขอไปยังฐานข้อมูล
    // เชื่อมต่อกับฐานข้อมูล
    // ตรวจสอบการมีอยู่ของผู้ใช้ที่มีการเข้าสู่ระบบเดียวกัน
    $ result = mysql_query ("เลือก id จากผู้ใช้ WHERE เข้าสู่ระบบ =" $ เข้าสู่ระบบ "", $ db);
    ถ้า (! ว่างเปล่า ($ myrow ["id"])) (
    exit ("ขออภัย ชื่อผู้ใช้ที่คุณป้อนถูกลงทะเบียนแล้ว กรุณาป้อนชื่อผู้ใช้อื่น");
    }
    //ถ้าไม่ใช่ก็บันทึกข้อมูล
    $ result2 = mysql_query ("INSERT INTO ผู้ใช้ (เข้าสู่ระบบ, รหัสผ่าน, รูปแทนตัว) VALUES (" $ เข้าสู่ระบบ "," $ รหัสผ่าน "," $ avatar ")");
    // ตรวจสอบว่ามีข้อผิดพลาดหรือไม่
    ถ้า ($ result2 == "TRUE")
    {
    echo "คุณได้ทำการลงทะเบียนเรียบร้อยแล้ว คุณสามารถเข้าสู่เว็บไซต์ได้ หน้าแรก";
    }
    อื่น (
    echo "Error! คุณยังไม่ได้ลงทะเบียน";
    }
    ?>

    4. จำเป็นต้องเพิ่มตารางหนึ่งตารางลงในฐานข้อมูลเดียวกัน มันจะเก็บที่อยู่ IP ที่ทำผิดพลาดเมื่อเข้ามา ดังนั้น เราจะสามารถจำกัดการเข้าถึงผู้ที่ทำผิดพลาดมากกว่าสามครั้งติดต่อกันเป็นเวลา 15 นาที ฉันคิดว่าโปรแกรมที่เดารหัสผ่านจะต้องวุ่นวายเป็นเวลานาน
    ไปที่ phpmyadmin และสร้างตารางใหม่ที่มี 3 ฟิลด์:


    ip - ที่อยู่ IP
    date - วันที่เข้าสู่ระบบไม่สำเร็จในช่วง 15 นาทีที่ผ่านมาสำหรับผู้ใช้ที่มี IP ที่กำหนด col - จำนวนข้อผิดพลาดในช่วง 15 นาทีที่ผ่านมาสำหรับผู้ใช้ที่มี IP ที่กำหนด
    ดี! เสร็จแล้วเราจะเปลี่ยนไฟล์สำหรับตรวจสอบการเข้าสู่ระบบและรหัสผ่านเพราะตอนนี้รหัสผ่านของเราถูกเข้ารหัสแล้ว เปิด testreg.php และลบทุกอย่างที่นอกเหนือไปจากการลบช่องว่างออกจากชื่อผู้ใช้และรหัสผ่าน ถัดไป เพิ่มรหัสต่อไปนี้:

    // ลบช่องว่างพิเศษ
    $ เข้าสู่ระบบ = ตัด ($ เข้าสู่ระบบ);
    $ รหัสผ่าน = ตัด ($ รหัสผ่าน);

    // เปลี่ยนอันใหม่ ******************************************
    // เชื่อมต่อกับฐานข้อมูล
    รวม ("bd.php"); // ไฟล์ bd.php ต้องอยู่ในโฟลเดอร์เดียวกับคนอื่น ๆ ถ้าไม่ใช่ ก็แค่เปลี่ยนเส้นทาง
    // ตรวจสอบการเดารหัสผ่านแบบย่อ
    $ ip = getenv ("HTTP_X_FORWARDED_FOR");
    if (empty ($ ip) || $ ip == "unknown") ($ ip = getenv ("REMOTE_ADDR");) // เรียกข้อมูล ip
    mysql_query ("DELETE FROM oshibka WHERE UNIX_TIMESTAMP () - UNIX_TIMESTAMP (date)> 900"); // ลบที่อยู่ IP ของผู้ใช้ที่เข้าสู่ระบบผิดพลาดหลังจากผ่านไป 15 นาที
    $ result = mysql_query ("SELECT col FROM oshibka WHERE ip =" $ ip "", $ db); // ดึงข้อมูลจากฐานข้อมูลจำนวนครั้งของการพยายามเข้าสู่ระบบที่ไม่สำเร็จในช่วง 15 ครั้งล่าสุดสำหรับผู้ใช้ที่มี ip ที่กำหนด
    $ myrow = mysql_fetch_array ($ ผล);
    ถ้า ($ myrow ["col"]> 2) (
    // หากมีข้อผิดพลาดมากกว่าสองข้อ กล่าวคือ สามข้อผิดพลาด ให้ออกข้อความ
    exit ("คุณพิมพ์ข้อมูลเข้าสู่ระบบหรือรหัสผ่านไม่ถูกต้อง 3 ครั้ง โปรดรอ 15 นาทีก่อนดำเนินการครั้งต่อไป");
    }
    $ รหัสผ่าน = md5 ($ รหัสผ่าน); // เข้ารหัสรหัสผ่าน
    $ password = strrev ($ password); // เพิ่มการย้อนกลับเพื่อความปลอดภัย
    $ รหัสผ่าน = $ รหัสผ่าน "b3p6f";
    // คุณสามารถเพิ่มอักขระของคุณเองได้หลายตัวตามต้องการ เช่น โดยการพิมพ์ "b3p6f" หากรหัสผ่านนี้ถูกถอดรหัสโดยวิธี brute-force บนเซิร์ฟเวอร์ของตนเองด้วย md5 เดียวกัน แสดงว่าไม่มีอะไรดีเกิดขึ้นอย่างแน่นอน แต่ฉันแนะนำให้คุณใส่อักขระอื่น ๆ ไว้ที่จุดเริ่มต้นของบรรทัดหรือตรงกลาง
    // ในกรณีนี้ จำเป็นต้องเพิ่มความยาวของช่องรหัสผ่านในฐานข้อมูล รหัสผ่านที่เข้ารหัสอาจมีขนาดใหญ่กว่ามาก

    $ ผล = mysql_query ("เลือก * จากผู้ใช้ที่เข้าสู่ระบบ =" $ เข้าสู่ระบบ "และรหัสผ่าน =" $ รหัสผ่าน "", $ db); // ดึงข้อมูลจากฐานข้อมูลทั้งหมดเกี่ยวกับผู้ใช้ด้วยชื่อผู้ใช้และรหัสผ่านที่ป้อน
    $ myrow = mysql_fetch_array ($ ผล);
    ถ้า (ว่างเปล่า ($ myrow ["id"]))
    {
    // หากไม่มีผู้ใช้ที่ป้อนชื่อผู้ใช้และรหัสผ่าน
    // จดบันทึกว่าไม่สามารถป้อน ip ที่กำหนดได้
    $ select = mysql_query ("เลือก ip จาก oshibka โดยที่ ip =" $ ip "");
    $ tmp = mysql_fetch_row ($ เลือก);
    if ($ ip == $ tmp) (// ตรวจสอบว่าผู้ใช้อยู่ในตาราง "oshibka" หรือไม่
    $ result52 = mysql_query ("เลือก col จาก oshibka โดยที่ ip =" $ ip "", $ db);
    $ myrow52 = mysql_fetch_array ($ ผล 52);
    $ col = $ myrow52 + 1; // เพิ่มความพยายามในการเข้าสู่ระบบที่ล้มเหลวอีกครั้ง
    mysql_query ("อัปเดต oshibka SET col = $ col, date = NOW () WHERE ip =" $ ip "");
    }
    อื่น (
    mysql_query ("INSERT INTO oshibka (ip, date, col) VALUES (" $ ip ", NOW ()," 1 ")");
    // หากไม่มีข้อผิดพลาดในช่วง 15 นาทีที่ผ่านมา ให้แทรกระเบียนใหม่ลงในตาราง "oshibka"
    }

    exit ("ขออภัย ชื่อผู้ใช้หรือรหัสผ่านที่คุณป้อนไม่ถูกต้อง");
    }
    อื่น (
    นสพ. // หากรหัสผ่านตรงกัน เราจะเริ่มเซสชันสำหรับผู้ใช้! คุณสามารถแสดงความยินดีกับเขา เขาเข้ามา!
    $ _SESSION ["รหัสผ่าน"] = $ myrow ["รหัสผ่าน"];
    $ _SESSION ["เข้าสู่ระบบ"] = $ myrow ["เข้าสู่ระบบ"];
    $ _SESSION ["id"] = $ myrow ["id"]; // ข้อมูลนี้ถูกใช้บ่อยมาก ดังนั้นผู้ใช้ที่เข้าสู่ระบบจะ "พกพาติดตัวไปด้วย"

    // ต่อไป เราจำข้อมูลในคุกกี้ สำหรับการเข้าสู่ระบบครั้งต่อไป
    //ความสนใจ!!! ทำตามที่การสนทนาของคุณ เนื่องจากข้อมูลถูกเก็บไว้ในคุกกี้โดยไม่มีการเข้ารหัส
    ถ้า ($ _POST ["บันทึก"] == 1) (
    // หากผู้ใช้ต้องการให้บันทึกข้อมูลของเขาสำหรับการเข้าสู่ระบบครั้งต่อไป เราก็บันทึกไว้ในคุกกี้ของเบราว์เซอร์
    setcookie ("เข้าสู่ระบบ", $ _POST ["เข้าสู่ระบบ"], เวลา () + 9999999);
    setcookie ("รหัสผ่าน", $ _POST ["รหัสผ่าน"], เวลา () + 9999999);
    }}
    เสียงสะท้อน " "; // เปลี่ยนเส้นทางผู้ใช้ไปที่หน้าหลัก ที่นั่นเขาจะได้รับแจ้งเกี่ยวกับการเข้าสู่ระบบที่สำเร็จ
    ?>

    5. เปลี่ยนหน้าหลักโดยสิ้นเชิง จำเป็นต้องแสดงอวาตาร์ของผู้ใช้ แสดงลิงก์เพื่อออกจากระบบบัญชี และเพิ่มช่องทำเครื่องหมายเพื่อจดจำรหัสผ่านเมื่อเข้าสู่ระบบ
    Index.php

    // ขั้นตอนทั้งหมดทำงานในเซสชัน มันอยู่ที่ข้อมูลของผู้ใช้จะถูกเก็บไว้ในขณะที่เขาอยู่ในไซต์ มันสำคัญมากที่จะต้องเรียกใช้ที่จุดเริ่มต้นของหน้า !!!
    session_start ();
    รวม ("bd.php"); // ไฟล์ bd.php ต้องอยู่ในโฟลเดอร์เดียวกับคนอื่น ๆ ถ้าไม่ใช่ ก็แค่เปลี่ยนเส้นทาง
    ถ้า (! ว่างเปล่า ($ _ SESSION ["login"]) และ! ว่างเปล่า ($ _ SESSION ["password"]))
    {
    // หากมีล็อกอินและรหัสผ่านในเซสชั่น เราจะตรวจสอบและดึงอวาตาร์
    $ เข้าสู่ระบบ = $ _SESSION ["เข้าสู่ระบบ"];
    $ รหัสผ่าน = $ _SESSION ["รหัสผ่าน"];
    $ result = mysql_query ("เลือก id, avatar จากผู้ใช้ WHERE login =" $ เข้าสู่ระบบ "AND password =" $ รหัสผ่าน "", $ db);
    $ myrow = mysql_fetch_array ($ ผล);
    // ดึงข้อมูลผู้ใช้ที่จำเป็น
    }
    ?>


    หน้าแรก


    หน้าแรก

    if (! isset ($ myrow ["avatar"]) หรือ $ myrow ["avatar"] == "") (
    // ตรวจสอบว่ามีการดึงข้อมูลผู้ใช้จากฐานข้อมูลหรือไม่ ถ้าไม่เช่นนั้นเขาไม่ได้ป้อนหรือรหัสผ่านในเซสชันไม่ถูกต้อง เราแสดงหน้าต่างเข้าสู่ระบบ แต่เราจะไม่แสดงไว้สำหรับผู้ที่เข้ามาแล้วพวกเขาไม่ต้องการมันอีกต่อไป
    พิมพ์<<


    ที่นี่;

    if (isset ($ _ COOKIE ["login"])) // มีตัวแปรพร้อมล็อกอินใน COOKIE หรือไม่ ควรจะเป็นถ้าผู้ใช้ที่เข้าสู่ระบบก่อนหน้านี้คลิกที่ช่องทำเครื่องหมาย "จดจำฉัน"
    {
    // ถ้าใช่ ให้ใส่ค่าลงในแบบฟอร์ม ในกรณีนี้ แสดงว่าผู้ใช้เข้าสู่ระบบถูกป้อนในคอลัมน์ที่กำหนดแล้ว
    echo "value =" ". $ _ COOKIE [" login "]." ">";
    }

    พิมพ์<<




    ที่นี่;

    if (isset ($ _ COOKIE ["password"])) // มีตัวแปรพร้อมรหัสผ่านในคุกกี้หรือไม่ ควรจะเป็นถ้าผู้ใช้ที่เข้าสู่ระบบก่อนหน้านี้คลิกที่ช่องทำเครื่องหมาย "จดจำฉัน"
    {
    // ถ้าใช่ ให้ใส่ค่าลงในแบบฟอร์ม ในกรณีนี้ แสดงว่าผู้ใช้ได้ป้อนรหัสผ่านในคอลัมน์ที่กำหนดแล้ว
    echo "value =" ". $ _ คุกกี้ [" password "]." ">";
    }

    พิมพ์<<



    จดจำฉัน.






    สมัครตอนนี้



    คุณเข้าสู่ระบบในฐานะแขก

    ที่นี่;
    }
    อื่น
    {
    // เมื่อเข้าสู่ระบบสำเร็จ ผู้ใช้จะได้รับทุกสิ่งด้านล่างระหว่างเครื่องหมายดอกจัน

    พิมพ์<<
    คุณลงชื่อเข้าใช้ไซต์ด้วย $ _SESSION (ออกจากระบบ)


    ลิงค์นี้มีให้สำหรับผู้ใช้ที่ลงทะเบียนเท่านั้น

    อวตารของคุณ:




    ที่นี่;

    //************************************************************************************
    // เมื่อเข้าสู่ระบบสำเร็จ ผู้ใช้จะได้รับทุกสิ่งที่ด้านบนระหว่างเครื่องหมายดอกจัน
    }
    ?>

    6. จำเป็นต้องทำให้สามารถออกจากระบบบัญชีสำหรับผู้ใช้ที่เข้าสู่ระบบได้ มีลิงค์ทางออกอยู่แล้วในหน้าหลัก แต่ไฟล์นี้ยังไม่มีอยู่ มาสร้างไฟล์ใหม่กันเถอะ exit.phpด้วยรหัส:

    session_start ();
    ถ้า (ว่าง ($ _ SESSION ["login"]) หรือว่าง ($ _ SESSION ["password"]))
    {
    // หากไม่มีเซสชันที่มีชื่อผู้ใช้และรหัสผ่าน แสดงว่าผู้ใช้ที่ปลดล็อกแล้วจะเข้าสู่ไฟล์นี้ เขาไม่ใช่คนที่นี่ เราออกข้อความแสดงข้อผิดพลาด หยุดสคริปต์
    exit ("การเข้าถึงหน้านี้อนุญาตเฉพาะผู้ใช้ที่ลงทะเบียน หากคุณลงทะเบียนแล้วให้เข้าสู่ไซต์โดยใช้ชื่อผู้ใช้และรหัสผ่านของคุณ
    หน้าแรก ");
    }

    ยกเลิกการตั้งค่า ($ _ SESSION ["รหัสผ่าน"]);
    ยกเลิกการตั้งค่า ($ _ SESSION ["เข้าสู่ระบบ"]);
    unset ($ _ SESSION ["id"]); // ทำลายตัวแปรใน sessions
    ทางออก (" ");
    // ส่งผู้ใช้ไปยังหน้าหลัก
    ?>

    นั่นคือทั้งหมด! ใช้เพื่อสุขภาพของคุณ! ขอให้โชคดี!