ฉันจะใช้การเขียน URL ใหม่ในไฟล์. htaccess ของฉันได้อย่างไร


17

ฉันต้องการเขียน URL ใหม่ (เพราะอะไรดูคำถามนี้) เพื่อให้ผู้ใช้เห็นที่อยู่แทน

labouseur.com/course-compilers.html 

พวกเขาสามารถดูและใช้งานได้ง่าย

labouseur.com/course-compilers

(ดียิ่งขึ้นบางทีฉันควรปรับโครงสร้างเพื่อที่ว่ามันเป็นคอร์ส / คอมไพเลอร์)

ฉันใช้บริการโฮสติ้งที่ใช้ร่วมกันบน Linux สำหรับเว็บไซต์ของฉันดังนั้นฉันจึงไม่มีการควบคุมดูแลของเซิร์ฟเวอร์ แต่ฉันมีการควบคุม. htaccess การอ้างอิงที่ฉันได้อ่านออนไลน์ดูเหมือนจะไม่ชัดเจนสำหรับฉันดังนั้นฉันกำลังมองหาความชัดเจนและคำแนะนำเล็กน้อยที่นี่


หมายเหตุว่านี่เป็นสิ่งที่คุณไม่เพียง แต่ทำอย่างไรในการตั้งค่าเซิร์ฟเวอร์ (.htaccess) ขั้นตอนแรกที่สำคัญคือการเปลี่ยน URL จริงในแอปพลิเคชันของคุณมิฉะนั้นคุณจะต้องเปลี่ยนเส้นทางที่ไม่จำเป็นจำนวนมาก (หรือทำซ้ำเนื้อหา)
MrWhite

คำตอบ:


13

คุณสามารถลบ. html ออกจากไฟล์บนเซิร์ฟเวอร์ของคุณและตั้งค่าเป็น htaccess เพื่อให้สามารถใช้เป็นไฟล์ html ได้ แต่นั่นอาจไม่ใช่สิ่งที่คุณต้องการ

ทำเช่นนี้ :

RewriteEngine on
# Check this condition to ensure that it's not a directory.
RewriteCond %{REQUEST_FILENAME} !-d
# Check this condition to ensure that there's a file there
RewriteCond %{REQUEST_FILENAME}\.html -f
# Replace html with your file extension, eg: php, htm, asp
RewriteRule ^(.*)$ $1.html

มีความซับซ้อนมากขึ้นโดยเฉพาะถ้าคุณกังวลเกี่ยวกับปัญหาเนื้อหาที่ซ้ำกัน ด้วยกฎด้านบนหน้าของคุณจะยังคงสามารถเข้าถึงได้จาก URL เก่า
JasonBirch

3

ขั้นแรกตรวจสอบให้แน่ใจว่า apache มีโมดูลและได้รับอนุญาตในไฟล์. htacces จากนั้นเพิ่ม:

RewriteEngine on

# Rewrite rules
RewriteRule ^/myoldsubfolder/(.*) /newfolder/$1 

ตัวอย่างของคุณต้องการ

RewriteCond %{REQUEST_URI} !-d
RewriteCond %{REQUEST_URI}\.html -f
RewriteRule ^/(([a-zA-Z0-9_]+)/?)$ /$1.html

สำหรับโครงสร้างไดเรกทอรีระดับเดียวและ

RewriteRule ^/(([a-zA-Z0-9_]+)/?)+$ /$1.html

สำหรับโครงสร้างหลายระดับ

แต่ต้องระวัง

หากคุณมีโครงสร้าง

/site/.htaccess
/site/subfolder/.htaccess
/site/subfolder/cats/.htaccess

กฎการเขียนซ้ำใน.htaccessไฟล์ย่อยจะสัมพันธ์กับโฟลเดอร์พาเรนต์และคุณสามารถเข้าสู่สถานการณ์การเขียนซ้ำที่ยุ่งเหยิงได้ ให้แน่ใจว่าคุณใช้RewriteCondเพื่อหยุดพวกเขาเกิดขึ้นถ้าคุณสามารถ!


คุณต้องการทราบรายละเอียดเพิ่มเติมเกี่ยวกับจุดสุดท้ายนั้นหรือไม่ (ใช้ RewriteCond เพื่อหยุดการวนซ้ำ)
Travis Northcutt

2

นอกเหนือจากคำตอบข้างต้นหนึ่งสามารถใช้

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^([\w-]+)$ $1.html [L]

([\w-]+) อนุญาตให้ตัวอักษร, ตัวเลขด้วยยัติภังค์ (-)

(.*) จะเขียนใหม่ทุกคำขอโดยไม่คำนึงถึงซึ่งอาจทำให้กฎต่อไปนี้ไม่สมบูรณ์ทำให้เกิดข้อผิดพลาดเซิร์ฟเวอร์ภายในในการเข้าถึง


RewriteRule รูปแบบของคุณคือการปรับปรุงคำตอบที่ยอมรับได้สำหรับตัวอย่างที่ระบุในคำถามอย่างไรก็ตามมันจะไม่ตรงกับกรณีทั่วไปมากขึ้นเมื่อมีส่วนของเส้นทางมากกว่าหนึ่งเช่น /path/to/course-compilers. รวมการLตั้งค่าสถานะเพื่อลดผลกระทบกับกฎต่อไปนี้ ในขณะที่(.*)รูปแบบทั่วไปโดยไม่จำเป็นก็ไม่น่าจะทำให้เกิดปัญหาร้ายแรงเนื่องจากเงื่อนไขที่ตรวจสอบไฟล์ที่มีอยู่
MrWhite

1

คุณไม่จำเป็นต้องใช้ไฟล์. htaccess เพื่อทำสิ่งนี้ เพียงจัดโครงสร้างไฟล์ของคุณลงในไดเรกทอรีและแทนที่จะใช้ "labouseur.com/course-compilers.html" เพียงตั้งชื่อไฟล์ index.html และใส่ไว้ในไดเรกทอรีที่เรียกว่า "course-compilers" จากนั้นเมื่อคุณชี้ไปที่ไดเรกทอรีนั้นดัชนีจะถูกแสดงตามค่าเริ่มต้น แต่จะไม่แสดงใน URL ดังนั้นคุณสามารถเขียนลิงก์ของคุณเป็น "labourseur.com/course-compilers" และทั้งหมดจะดี

ไม่จำเป็นต้องใช้. htaccess

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