ไฟล์ .htaccess เริ่มต้นของ WordPress: มีอะไรอยู่ในนั้นและวิธีกู้คืน
บล็อก .htaccess ที่แน่นอนที่ WordPress เขียนไว้สำหรับ permalink, WordPress สร้างมันขึ้นใหม่อัตโนมัติเมื่อไหร่ และวิธีกู้คืนด้วยมือเมื่อโพสต์ขึ้น 404 แต่หน้าแรกยังโหลดได้
ไฟล์ .htaccess เริ่มต้นของ WordPress คือบล็อก RewriteEngine สั้นๆ ที่ซอฟต์แวร์เขียนลงใน .htaccess ที่รูทของไซต์คุณ เพื่อให้ permalink เช่น /2026/10/ชื่อโพสต์/ สามารถแก้ไขได้แทนที่จะขึ้น 404 มันมีลักษณะดังนี้:
# 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
นี่คือบล็อกที่แน่นอน นำมาจากคู่มือทางการของ WordPress เกี่ยวกับ Apache HTTP Server และตรรกะ rewrite ที่บันทึกไว้ในหน้า HelpHub เกี่ยวกับ permalink ที่สวยงาม หาก RewriteBase ของคุณไม่ใช่ / — เช่น เพราะ WordPress ติดตั้งอยู่ในซับโฟลเดอร์ — มันจะตรงกับพาธนั้นแทน ซึ่งก็เป็นเรื่องปกติเช่นกันและสร้างขึ้นโดย WordPress เอง
สิ่งสำคัญ
- WordPress สร้างบล็อกนี้โดยอัตโนมัติ เฉพาะบน Apache และ LiteSpeed เมื่อไฟล์เขียนได้และคุณบันทึก Settings > Permalinks
- ถ้าไฟล์หายไปหรือเสียหาย permalink ทั้งหมดยกเว้นหน้าแรกจะคืนค่า 404 เพราะมีเพียงหน้าแรกเท่านั้นที่หาเจอได้โดยไม่ต้องมีกฎ rewrite
- อะไรก็ตามที่คุณหรือปลั๊กอินเพิ่มเข้ามาต้องอยู่ ด้านบน
# BEGIN WordPressไม่ใช่ภายในมาร์กเกอร์เด็ดขาด — WordPress เขียนทับทุกอย่างที่อยู่ระหว่างนั้นทุกครั้งที่บันทึก permalink
ต้องสร้างไฟล์ใหม่ด้วยพาธจริงของคุณและกฎเพิ่มเติมบางอย่างไหม? เครื่องมือสร้าง .htaccess สำหรับ WordPress จะประกอบไฟล์ที่ถูกต้องให้ในเบราว์เซอร์ของคุณโดยตรง
แต่ละบรรทัดทำอะไร
RewriteEngine On เปิดใช้งานโมดูล mod_rewrite ของ Apache สำหรับไดเรกทอรีนี้ ถ้าไม่มีบรรทัดนี้ ทุกอย่างที่ตามมาจะไม่ทำงาน
RewriteBase / บอก Apache ว่าพาธที่ถูกเขียนใหม่นั้นสัมพันธ์กับรูทของไซต์ WordPress จะตั้งค่านี้ให้ตรงกับที่ไซต์อยู่จริง — การติดตั้งในซับโฟลเดอร์จะได้ RewriteBase /blog/ ไม่ใช่ /
RewriteRule ^index\.php$ - [L] เป็นตัวป้องกันที่ไม่มีผล: ถ้าคำขอเป็น index.php อยู่แล้ว การ rewrite จะหยุดและคำขอจะผ่านไปโดยไม่เปลี่ยนแปลง
สองบรรทัด RewriteCond คือตรรกะที่แท้จริง %{REQUEST_FILENAME} !-f และ !-d ถามว่า “คำขอนี้ไม่ตรงกับไฟล์จริง และไม่ตรงกับไดเรกทอรีจริงใช่หรือไม่?” ทั้งสองต้องเป็นจริงเพื่อให้กฎสุดท้ายทำงาน — ดังนั้นรูปภาพจริง ไฟล์ CSS หรือ PDF ที่อัปโหลดจะถูกส่งให้ตรงๆ และไม่เคยแตะต้องการกำหนดเส้นทางของ WordPress เลย
RewriteRule . /index.php [L] คือสิ่งที่ทำให้ permalink ทำงานได้: ทุกอย่างที่รอดจากสองเงื่อนไขก่อนหน้า — คือไม่ใช่ไฟล์หรือโฟลเดอร์จริง — จะถูกส่งไปที่ index.php และการกำหนดเส้นทางของ WordPress เอง (WP_Query แท็ก rewrite) จะตัดสินใจว่า URL นั้นหมายถึงโพสต์ หน้า หรือไฟล์เก็บถาวรใดกันแน่
WordPress สร้างไฟล์นี้ขึ้นใหม่เมื่อไหร่ และเมื่อไหร่ที่ทำไม่ได้
WordPress พยายามเขียน .htaccess ด้วยตัวเองทุกครั้งที่คุณเปิด Settings > Permalinks และคลิก Save Changes แม้ว่าไม่มีอะไรเปลี่ยนบนหน้าจอเลย การบันทึกนี้จะเรียกใช้ flush_rewrite_rules() ซึ่งพยายามเปิด .htaccess เพื่อเขียนและแทรกบล็อกปัจจุบันระหว่างมาร์กเกอร์
ความพยายามนี้ล้มเหลวแบบเงียบๆ ทำให้ไฟล์หายไปหรือล้าสมัย เมื่อ:
- ไฟล์หรือโฟลเดอร์แม่ของมันเขียนไม่ได้ สำหรับผู้ใช้ที่ PHP ทำงานอยู่ บนโฮสติ้งแบบแชร์หลายแห่ง PHP ทำงานในชื่อผู้ใช้ระบบที่ต่างจากคนที่อัปโหลดไฟล์ผ่าน FTP ดังนั้นสิทธิ์ที่ดูถูกต้องในไคลเอนต์ FTP ก็ยังอาจขวางการเขียนของ WordPress ได้
- คุณใช้ nginx
.htaccessเป็นกลไกของ Apache และ LiteSpeed เท่านั้น (เอกสารของ Apache เรื่องAllowOverrideอธิบายว่าทำไม: nginx ไม่มีไฟล์การตั้งค่าต่อไดเรกทอรีที่มันอ่านใหม่ในแต่ละคำขอ) สิ่งที่เทียบเท่าบน nginx คือtry_filesdirective ภายในบล็อก server ซึ่งมีเพียงผู้ที่มีสิทธิ์เข้าถึงเซิร์ฟเวอร์เท่านั้นที่แก้ไขได้ WordPress ไม่สามารถเขียนมันให้คุณได้เลย AllowOverrideถูกตั้งเป็นNoneสำหรับไดเรกทอรีของไซต์คุณในการตั้งค่าหลักของ Apache นี่คือการตั้งค่าที่อนุญาตให้.htaccessเขียนทับอะไรก็ตามได้ตั้งแต่แรก เอกสารของ Apache ระบุชัดเจนว่า เมื่อAllowOverride None“ไฟล์ .htaccess จะถูกเพิกเฉยอย่างสมบูรณ์” — WordPress อาจเขียนไฟล์ที่สมบูรณ์แบบ แต่มันจะยังคงไม่มีผลใดๆ จนกว่าการตั้งค่านี้จะถูกเปลี่ยนในระดับเซิร์ฟเวอร์- ไฟล์ถูกลบไปหรือไม่เคยมีอยู่จริง และมีบางอย่างในการบันทึกที่ไม่ได้กระตุ้นการสร้างใหม่ — สาเหตุที่พบบ่อยที่สุดคือโครงสร้าง permalink เหมือนกันอยู่แล้ว ดังนั้น WordPress จึงไม่เห็นการเปลี่ยนแปลงใดๆ ที่จะเขียนใหม่
วิธีกู้คืนด้วยมือ
ถ้าโพสต์และหน้าต่างๆ ขึ้น 404 ในขณะที่หน้าแรกยังทำงานได้ นี่คือสัญญาณปกติของ .htaccess ที่หายไปหรือเสีย แก้ไขด้วยสองขั้นตอน
1. ลองวิธีแก้แบบคลิกเดียวก่อน ไปที่ Settings > Permalinks ในแดชบอร์ด WordPress และคลิก Save Changes โดยไม่เปลี่ยนแปลงอะไร ถ้าไฟล์เขียนได้ เพียงเท่านี้ก็สร้างมันขึ้นใหม่และจบปัญหา
2. ถ้าไม่ได้ผล ให้สร้างไฟล์ด้วยมือ เชื่อมต่อผ่าน FTP/SFTP หรือตัวจัดการไฟล์ของโฮสต์ของคุณ ไปที่โฟลเดอร์ที่ติดตั้ง WordPress (โฟลเดอร์ที่มี wp-config.php) และตรวจสอบว่า .htaccess มีอยู่หรือไม่ — มันเป็นไฟล์ที่ซ่อนอยู่ ตัวจัดการไฟล์บางตัวซ่อนมันโดยค่าเริ่มต้น ให้เปิด “แสดงไฟล์ที่ซ่อนอยู่”
- ถ้าหายไป ให้สร้างไฟล์ใหม่ชื่อ
.htaccessเป๊ะๆ (ไม่ใช่.txtไม่มีอะไรก่อนจุด) - วางบล็อกเริ่มต้นด้านบนนี้ โดยปรับ
RewriteBaseถ้า WordPress อยู่ในซับโฟลเดอร์ - บันทึกแล้วโหลด permalink ของโพสต์ใดโพสต์หนึ่งใหม่เพื่อยืนยันว่ามันทำงาน
ถ้ายังขึ้น 404 อยู่หลังจากนั้น สาเหตุได้เปลี่ยนจาก “.htaccess หายไป” เป็น “.htaccess ถูกเพิกเฉย” — ถามโฮสต์ของคุณเรื่อง AllowOverride เพราะไฟล์ที่ถูกต้องในไดเรกทอรีที่ Apache ถูกสั่งให้เพิกเฉยจะทำงานเหมือนกับไม่มีไฟล์เลย
กฎของคุณเองเทียบกับบล็อกของ WordPress
ปลั๊กอินหรือการแก้ไขด้วยมืออาจเพิ่มกฎของตัวเอง — การรีไดเรกต์ การป้องกัน hotlink ส่วนหัวของแคช นี่เป็นบล็อกที่แยกต่างหากจากที่ WordPress สร้างขึ้น และทั้งสองไม่ควรทับซ้อนกันเลย:
# กฎที่คุณหรือปลั๊กอินเพิ่มเข้ามา — ด้านบนมาร์กเกอร์ของ WordPress
<FilesMatch "\.(jpg|jpeg|png|gif)$">
# ตัวอย่าง: การป้องกัน hotlink, กฎแคช ฯลฯ
</FilesMatch>
# 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
ทุกอย่างที่วางไว้ ระหว่าง # BEGIN WordPress และ # END WordPress จะถูกลบแบบเงียบๆ ในครั้งต่อไปที่มีคนบันทึกหน้าจอ Permalinks เพราะ WordPress ถือว่าส่วนนั้นทั้งหมดเป็นของตัวเองและเขียนมันใหม่ทั้งหมด นี่คือสาเหตุที่พบบ่อยที่สุดของการบ่นว่า “กฎที่ฉันกำหนดเองหายไป” — มันไม่เคยถูกลบออกโดยตั้งใจ มันแค่อยู่ภายในบล็อกที่ WordPress ถือว่าเป็นของตัวเอง สำหรับการรีไดเรกต์โดยเฉพาะ ดูกฎการรีไดเรกต์ .htaccess ของ WordPress ที่ทำถูกต้อง เพื่อรู้ว่าควรวางไว้ที่ไหนและหลีกเลี่ยงลูปอย่างไร
นี่ยังเป็นสาเหตุที่พบบ่อยที่สุดของ 500 Internal Server Error ที่เกิดขึ้นทันทีหลังจากแก้ไขไฟล์: กฎที่คัดลอกมาจากโพสต์ในฟอรัมที่เขียนไว้สำหรับ Apache เวอร์ชันอื่น (ไวยากรณ์ Order/Deny ของ 2.2 ผสมกับไวยากรณ์ Require ของ 2.4) ทำให้การแปลวิเคราะห์ไฟล์ทั้งหมดพัง รวมถึงบล็อก WordPress ที่อยู่ด้านล่างด้วย และทั้งไซต์ก็ล้มลง — ไม่ใช่แค่ส่วนที่คุณแก้ไข
เหนือกว่าบล็อกเริ่มต้น
บล็อกเริ่มต้นจัดการเฉพาะการกำหนดเส้นทาง permalink เท่านั้น หากคุณต้องการเพิ่มความเข้มงวดในการเข้าถึงไฟล์ที่มีความสำคัญ หรือเพิ่มกฎ .htaccess จำนวนน้อยที่ลดพื้นที่การโจมตีได้จริง — การบล็อกการรัน PHP ใน /uploads การปฏิเสธคำขอโดยตรงไปที่ wp-config.php — ดูกฎความปลอดภัย .htaccess ของ WordPress ที่ช่วยได้จริง และถ้า permalink ขึ้น 404 ด้วยสาเหตุอื่น — โครงสร้าง permalink ผิด ชั้นแคชที่ให้บริการกฎเก่า ความขัดแย้งของ multisite ในซับไดเรกทอรี — permalink ของ WordPress ที่ไม่ทำงาน จะพูดถึงสาเหตุอื่นๆ
คำถามที่พบบ่อย
ไฟล์ .htaccess เริ่มต้นของ WordPress คืออะไร?
คือบล็อก RewriteEngine ที่ WordPress เขียนระหว่าง # BEGIN WordPress และ # END WordPress เพื่อให้ permalink แก้ไขไปเป็น index.php แทนที่จะขึ้น 404
โค้ด .htaccess เริ่มต้นที่แน่นอนของ WordPress คืออะไร?
RewriteEngine On, RewriteBase /, กฎผ่านสำหรับ index.php, สองเงื่อนไขที่ตรวจสอบว่าคำขอไม่ใช่ไฟล์หรือไดเรกทอรีจริง และกฎสุดท้ายที่ส่งทุกอย่างที่เหลือไปยัง index.php บล็อกทั้งหมดแสดงไว้ที่ด้านบนของคู่มือนี้
ทำไมโพสต์ทั้งหมดของฉันขึ้น 404 ยกเว้นหน้าแรก?
หน้าแรกหาเจอได้โดยไม่ต้องมีกฎ rewrite ใดๆ ส่วน permalink อื่นๆ ทุกตัวต้องการมัน .htaccess ที่หายไปหรือเสียหายบน Apache สร้างรูปแบบนี้ขึ้นมาพอดี
WordPress สร้าง .htaccess ขึ้นใหม่อัตโนมัติหรือไม่?
เฉพาะเมื่อไฟล์เขียนได้ — การบันทึก Settings > Permalinks ใหม่จะกระตุ้นสิ่งนี้ ถ้าไฟล์เขียนไม่ได้ หายไปบนโฮสต์ที่ไม่สร้างมันโดยอัตโนมัติ หรือ AllowOverride ถูกปิด WordPress จะแก้ไขให้คุณไม่ได้ และคุณต้องสร้างหรือแก้ไขไฟล์ด้วยมือ
ทำไม nginx ไม่มีไฟล์ .htaccess ของ WordPress?
.htaccess ทำงานได้เฉพาะบน Apache และ LiteSpeed เท่านั้น nginx ไม่มีไฟล์การตั้งค่าต่อไดเรกทอรีและเพิกเฉยต่อ .htaccess ทั้งหมด การกำหนดเส้นทางแบบเดียวกันจะเขียนเป็นกฎ try_files ในบล็อก server ของ nginx
ทำไม .htaccess ของฉันพังหลังจากบันทึก permalink?
กฎที่กำหนดเองถูกวางไว้ภายในมาร์กเกอร์ # BEGIN WordPress / # END WordPress แทนที่จะอยู่ด้านบน และ WordPress ได้เขียนทับส่วนนั้นทั้งหมดในการบันทึก permalink ครั้งต่อไป
สร้าง .htaccess ที่สะอาดและถูกต้อง — บล็อก permalink เริ่มต้นพร้อมกับกฎความปลอดภัยหรือการรีไดเรกต์ที่คุณต้องการจริงๆ — ด้วยเครื่องมือสร้าง .htaccess สำหรับ WordPress แบบฟรี
FAQ
คำถาม
ไฟล์ .htaccess เริ่มต้นของ WordPress คืออะไร?
คือบล็อก RewriteEngine สั้นๆ ที่ WordPress เขียนลงใน .htaccess ที่รูทของไซต์เพื่อให้ permalink ทำงานได้ มันอยู่ระหว่างคอมเมนต์ # BEGIN WordPress และ # END WordPress และส่งทุกคำขอที่ไม่ใช่ไฟล์หรือโฟลเดอร์จริงไปที่ index.php ซึ่ง WordPress จะตัดสินใจว่าจะแสดงอะไร
โค้ด .htaccess เริ่มต้นที่แน่นอนของ WordPress คืออะไร?
RewriteEngine On, RewriteBase /, กฎที่ปล่อยให้ไฟล์และไดเรกทอรีที่มีอยู่แล้วผ่านไปโดยไม่เปลี่ยนแปลง และ RewriteRule สุดท้ายที่ส่งทุกอย่างที่เหลือไปยัง index.php พร้อมคงค่า query string ไว้ บล็อกทั้งหมดแสดงไว้ด้านล่างและตรงกับบล็อกที่ WordPress สร้างขึ้นเองใน Settings > Permalinks
ทำไมโพสต์ทั้งหมดของฉันขึ้น 404 ยกเว้นหน้าแรก?
นี่คืออาการคลาสสิกของ .htaccess ที่หายไปหรือเสียหายบน Apache หน้าแรกโหลดได้เพราะเซิร์ฟเวอร์หา index.php เจอโดยตรง แต่ permalink อื่นๆ ต้องใช้กฎ rewrite เพื่อไปถึงที่นั่น และถ้าไม่มีกฎเหล่านี้ Apache ก็จะหาไฟล์ที่ไม่มีอยู่จริงแล้วคืนค่า 404
WordPress สร้าง .htaccess ขึ้นใหม่อัตโนมัติหรือไม่?
เฉพาะเมื่อไฟล์เขียนได้และคุณบันทึก Settings > Permalinks ใหม่ WordPress จะตรวจสอบว่าสามารถเขียนไฟล์ได้หรือไม่ และถ้าได้ก็จะเขียนบล็อกระหว่างตัวมาร์กเกอร์ใหม่ ถ้าไฟล์หายไป เป็นแบบอ่านอย่างเดียว หรือเป็นของผู้ใช้คนละคนกับที่รัน PHP WordPress จะล้มเหลวแบบเงียบๆ และคุณต้องสร้างมันด้วยมือ
ทำไม nginx ไม่มีไฟล์ .htaccess ของ WordPress?
เพราะ .htaccess เป็นฟีเจอร์ของ Apache (และ LiteSpeed) เท่านั้น nginx ไม่มีสิ่งที่เทียบเท่าและจะเพิกเฉยต่อไฟล์นี้ทั้งหมด บน nginx ตรรกะการกำหนดเส้นทางเดียวกันจะถูกเขียนเป็น try_files directive ภายในบล็อก server ซึ่งมีเพียงโฮสต์ของคุณหรือผู้ดูแลระบบเท่านั้นที่แก้ไขได้
ทำไม .htaccess ของฉันพังหลังจากบันทึก permalink?
แทบทุกครั้งเป็นเพราะปลั๊กอินหรือการแก้ไขด้วยมือก่อนหน้านี้วางกฎของตัวเองไว้ภายในมาร์กเกอร์ของ WordPress แทนที่จะอยู่ด้านบน WordPress จะเขียนทับทุกอย่างระหว่าง # BEGIN WordPress และ # END WordPress ทุกครั้งที่บันทึก permalink ดังนั้นกฎใดๆ ที่วางไว้ด้านในจะถูกลบโดยไม่มีการเตือน