WordPress สร้าง URL ที่ Apache รู้จักได้อย่างไร


17

เมื่อคุณสร้างเพจใน WordPress มันเป็นเพียงรายการในตารางฐานข้อมูล ไม่มีไฟล์จริงที่ตำแหน่งนั้น อย่างไรก็ตามฉันสามารถสร้างไฟล์ที่ตำแหน่งนั้นด้วยตัวเองและมันจะขโมยหน้าออกจาก WordPress ฉันลบไฟล์และมันกลับไปที่หน้า WordPress อย่างราบรื่น

ฉันแค่อยากรู้เกี่ยวกับความสำเร็จนี้ การสื่อสารบางอย่างเกิดขึ้นระหว่าง WordPress และ Apache (?)

คำตอบ:


27

จริงๆแล้วจะไม่มีการสื่อสารเกิดขึ้นระหว่าง Apache และ WordPress "เวทมนต์" กำลังเกิดขึ้นในmod_rewriteกฎApache

สำหรับการติดตั้ง WordPress แบบมาตรฐานคุณมีกฎดังต่อไปนี้.htaccess:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

สังเกตบรรทัดนี้: ที่RewriteRule . /index.php [L] นี่เรากำลังบอก Apache ให้เปลี่ยนเส้นทางการร้องขอ URL /index.phpภายใน

เว้นแต่:บรรทัดนี้:RewriteCond %{REQUEST_FILENAME} !-fกลายเป็นเท็จ ซึ่งหมายความว่ามีการเพิ่มนี้RewriteCondกับข้างต้นRewriteRuleเราจะบอก Apache เพื่อส่งคำขอทั้งหมด/index.phpแต่ไม่ได้ถ้าหากมันเป็นไฟล์ที่มีอยู่

นอกจากนี้เมื่อบรรทัดนี้:RewriteCond %{REQUEST_FILENAME} !-dกลายเป็นเท็จ ซึ่งหมายความว่ามีการเพิ่มนี้RewriteCondกับข้างต้นRewriteRuleเราจะบอก Apache ส่งคำขอทั้งหมดไป/index.phpแต่ไม่ได้ถ้ามันไดเรกทอรีที่มีอยู่

ดังนั้นในที่สุดถ้ามันเป็นไฟล์ที่มีอยู่หรือไดเรกทอรีที่มีอยู่ Apache จะส่งคำขออื่น ๆ ทั้งหมดไป/index.phpภายใน

อย่างที่คุณเห็นไม่มีการสื่อสารใดเกิดขึ้นระหว่าง Apache และ WordPress Apache กำลังตัดสินใจทุกอย่างเองและเรากำลังบอกให้ใช้RewriteRuleและRewriteCondสั่ง

อ่านเพิ่มเติมเกี่ยวกับที่นี่mod_rewrite


3
มันเยี่ยมมาก ฉันเข้าใจอย่างสมบูรณ์ ฉันได้ดูไฟล์. htaccess ที่เป็นค่าเริ่มต้นหลายครั้งและไม่เคยใส่ใจที่จะวิเคราะห์ ขอขอบคุณ!
แมตต์

นี่คือรูปแบบการออกแบบที่เรียกว่าตัวควบคุมด้านหน้า โปรดทราบว่ามันเปลี่ยนเส้นทาง URL ที่ไม่มีอยู่ทั้งหมดไปที่ index.php ซึ่งหมายความว่าหากคุณพิมพ์เส้นทางแบบเต็มไปยังไฟล์ functions.php ของคุณผู้ควบคุมด้านหน้าจะไม่ทำงานและเว็บไซต์จะให้บริการ function.php นี่คือเหตุผลที่คุณมักจะเห็นปลั๊กอิน WordPress และไฟล์ชุดรูปแบบเริ่มต้นด้วยif ( !defined(‘ABSPATH’)) exit;
Sjors Ottjes

ใช่ฉันเห็นว่าในปลั๊กอิน แต่ไม่เข้าใจวัตถุประสงค์ ดังนั้นหาก!defined(‘ABSPATH’)ประเมินเป็นจริงก็หมายถึงสิ่งอื่นที่ไม่ใช่ WordPress พยายามเข้าถึงสคริปต์ (เนื่องจาก ABSPATH ถูกกำหนดใน wp-config.php) ดังนั้นจึงควรเพิกเฉยต่อคำขอนั้น ถูกต้องหรือไม่
Matt

@matt ถูกต้องแล้ว แม้ว่าฉันจะไม่พูดว่า "สิ่งอื่นนอกเหนือจาก WordPress" เพราะคุณสามารถกำหนดABSPATHในสคริปต์ PHP อื่น ๆ ได้ดังนั้นมันจะอนุญาตสคริปต์อื่น ๆ บนเซิร์ฟเวอร์ของคุณเอง สิ่งที่จะไม่อนุญาตคือการเข้าถึงไฟล์นั้นโดยตรงจากภายนอกเซิร์ฟเวอร์ของคุณ (พูดจากเบราว์เซอร์) เนื่องจากการเข้าถึงไฟล์นั้นโดยตรงทำให้ผู้ใช้ไม่สามารถกำหนดABSPATHได้
Fayaz

นี่เป็นเรื่องดีที่จะรู้ ฉันกังวลเกี่ยวกับความปลอดภัยอย่างต่อเนื่องและฉันจะสามารถใช้ประโยชน์จากสิ่งนี้ได้ทันที ขอขอบคุณ!
แมตต์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.