จะลบ. html จาก URL ได้อย่างไร


114

จะลบออก.htmlจาก URL ของเพจคงได้อย่างไร?

นอกจากนี้ฉันต้องเปลี่ยนเส้นทาง URL ใด ๆ.htmlไปยังURL ที่ไม่มี (กล่าวคือwww.example.com/page.htmlถึงwww.example.com/page).


1
โดย "ลบ. html" หมายความว่า "ไม่ต้องการให้. html แสดง" ใช่หรือไม่
Lightness Races ในวงโคจร

@ Tomalak: ใช่และยังเปลี่ยนเส้นทาง URL ที่มี ".html" ไปยัง URL ที่ไม่มี ปัญหาของฉันคือผลลัพธ์นี้เป็นการเปลี่ยนเส้นทางที่ไม่มีที่สิ้นสุด การตั้งค่าปัจจุบันของฉันอนุญาตให้เข้าถึงทั้ง www.example.com/page.html และ www.example.com/page ซึ่งไม่เป็นมิตรกับ SEO
Dave


@ Tomalak: ขอบคุณสำหรับเคล็ดลับ การอ่านเอกสารของ mod_rewrite มีประโยชน์มาก
Dave

คำตอบ:


107

ฉันคิดว่าคำอธิบายบางอย่างเกี่ยวกับคำตอบของจอนน่าจะเป็นประโยชน์ ดังต่อไปนี้:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

ตรวจสอบว่าหากไม่มีไฟล์หรือไดเร็กทอรีที่ระบุตามลำดับแล้วกฎการเขียนซ้ำจะดำเนินการต่อ:

RewriteRule ^(.*)\.html$ /$1 [L,R=301]

แต่นั่นหมายความว่าอย่างไร? มันใช้regex (การแสดงออกปกติ) นี่คือสิ่งเล็กน้อยที่ฉันทำไว้ก่อนหน้านี้ ... ใส่คำอธิบายภาพที่นี่

ฉันคิดว่าถูกต้อง

หมายเหตุ: เมื่อทำการทดสอบ.htaccess อย่าใช้การเปลี่ยนเส้นทาง 301 ใช้ 302 จนกว่าการทดสอบจะเสร็จสิ้นเนื่องจากเบราว์เซอร์จะแคช 301 ดูhttps://stackoverflow.com/a/9204355/3217306

อัปเดต:ฉันเข้าใจผิดเล็กน้อย.ตรงกับอักขระทั้งหมดยกเว้นบรรทัดใหม่ดังนั้นรวมถึงช่องว่างด้วย นอกจากนี้นี่คือข้อมูลสรุปของ regex ที่มีประโยชน์

แหล่งที่มา:

http://community.sitepoint.com/t/what-does-this-mean-rewritecond-request-filename-fd/2034/2

https://mediatemple.net/community/products/dv/204643270/using-htaccess-rewrite-rules


7
แผนภาพที่ยอดเยี่ยมเพื่อช่วยอธิบายคำตอบ
Ric

เคล็ดลับเกี่ยวกับ 301s และแคชของเบราว์เซอร์คือสิ่งที่ช่วยแก้ปัญหาของฉันได้
bgfvdu3w

@KnocksX ฉันไม่ได้เป็นผู้ดูแลเว็บอีกต่อไปและไม่อยู่ในฐานะที่จะสามารถช่วยเหลือได้
binaryfunt

84

หากต้องการลบนามสกุล. html ออกจาก URL ของคุณคุณสามารถใช้รหัสต่อไปนี้ใน root / htaccess:

RewriteEngine on


RewriteCond %{THE_REQUEST} /([^.]+)\.html [NC]
RewriteRule ^ /%1 [NC,L,R]

RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^ %{REQUEST_URI}.html [NC,L]

หมายเหตุ: หากคุณต้องการลบส่วนขยายอื่น ๆ ตัวอย่างเช่นการลบนามสกุล. php เพียงแค่แทนที่htmlทุกที่ด้วยphpในโค้ดด้านบน


10
ไม่มีคำตอบอื่นใดที่เหมาะกับฉัน แต่คำตอบนี้ทำได้ขอบคุณมาก!
Emmet Arries

2
อันนี้ใช้ได้ผลกับฉันด้วย ขอบคุณ @starkeen มีการโหวต ^
JeremyS

2
ทำงานได้ดีอย่างสมบูรณ์แบบ ขอบคุณ!
ixany

อันนี้ลบนามสกุลไฟล์ให้ฉัน แต่ไม่เปลี่ยนเส้นทางไปที่หน้านั้น
Bhargav Venkatesh

74

ด้วย. htaccess ภายใต้ apache คุณสามารถเปลี่ยนเส้นทางดังนี้:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)\.html$ /$1 [L,R=301] 

สำหรับการลบ. html ออกจาก url เพียงแค่เชื่อมโยงไปยังหน้าที่ไม่มี. html

<a href="http://www.example.com/page">page</a>

23
นี่ไม่ได้ทำอะไรฉันเลย มีเหตุผลบางอย่างที่มันใช้ไม่ได้?
Michael Yaworski

คุณมีไฟล์จริงสำหรับลิงค์ที่ร้องขอหรือไม่? นั่นจะทำให้เกิด!-f
Martijn

72

สิ่งนี้ควรได้ผลสำหรับคุณ:

#example.com/page will display the contents of example.com/page.html
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.+)$ $1.html [L,QSA]

#301 from example.com/page.html to example.com/page
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /.*\.html\ HTTP/
RewriteRule ^(.*)\.html$ /$1 [R=301,L]

3
ฉันได้รับ 404 ใน Godaddy ด้วยรหัสนี้และฉันได้แก้ไขการใส่: ตัวเลือก + FollowSymLinks -MultiViews - ดัชนีที่ด้านบนสุด
Labanino

1
ฉันคิดว่านี่เป็นคำตอบที่ดีและสมบูรณ์ที่สุดขอบคุณ!
ctekk

ฉันพยายามทำสิ่งนี้ใน localhost แต่มันใช้ไม่ได้มีสิ่งอื่นอีกไหมที่ฉันต้องทำฉันต้องเชื่อมโยงไฟล์. htaccess หรือไม่หรือหน้าจะจดจำได้อย่างไร
Pianistprogrammer

ฉันจะเพิ่มนามสกุล. php ไปที่ # 301 จาก example.com/page.html เป็น example.com/page ได้อย่างไร

20

คุณจะต้องแน่ใจว่าคุณมี Options -MultiViewsเช่นกัน

ไม่มีข้อใดที่ใช้ได้ผลกับฉันในโฮสต์ cPanel มาตรฐาน

สิ่งนี้ได้ผล:

Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.html [NC,L]

ในที่สุดคำตอบทั้งหมดข้างต้นก็ใช้ได้ผล .. ฉันเชื่อว่าเพราะไซต์ของฉันโฮสต์บน GoDaddy ด้วย cPanel ที่สำคัญคือตัวเลือก -MultiViews
Brad Vanderbush

ใช่ไม่มีอะไรในส่วนนี้ที่คาดหวังคำตอบนี้ได้! คุณช่วยวัน!
Neil Bannet

ขอบคุณเพื่อน ฉันไม่แน่ใจว่าทำไมคนอื่นถึงไม่ได้ผลตามที่คาดหวัง
Nanoo

13

ขอบคุณสำหรับการตอบกลับ ฉันได้แก้ไขปัญหาของฉันแล้ว สมมติว่าฉันมีเพจของฉันภายใต้http://www.yoursite.com/html จะใช้กฎ. htaccessต่อไปนี้

<IfModule mod_rewrite.c>
   RewriteEngine On
   RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /html/(.*).html\ HTTP/
   RewriteRule .* http://localhost/html/%1 [R=301,L]

   RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /html/(.*)\ HTTP/
   RewriteRule .* %1.html [L]
</IfModule>

6

ฉันใช้. htacess นี้เพื่อลบ. html ส่วนที่เกินออกจากไซต์ url ของฉันโปรดตรวจสอบว่ารหัสนี้ถูกต้อง:

    RewriteEngine on
RewriteBase /
RewriteCond %{http://www.proofers.co.uk/new} !(\.[^./]+)$
RewriteCond %{REQUEST_fileNAME} !-d
RewriteCond %{REQUEST_fileNAME} !-f
RewriteRule (.*) /$1.html [L]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^.]+)\.html\ HTTP
RewriteRule ^([^.]+)\.html$ http://www.proofers.co.uk/new/$1 [R=301,L]

สิ่งนี้ดูเหมือนจะใช้ได้ผลสำหรับฉันซึ่งแตกต่างจากโซลูชันอื่น ๆ ที่นำเสนอที่นี่ขอบคุณ ฉันขอเพิ่มแม้ว่าคุณจะยังคงต้องอัปเดตลิงก์ใน HTML ของคุณ (ดังนั้นหากคุณกำลังลิงก์ไปยังไฟล์. href="page1.html"> </a> คุณควรอัปเดต เป็น <a href=" example.com/page1"> </ a > จากนั้นจะใช้งานได้)
Lorenzo

การเปลี่ยนแปลงหลักสำหรับฉันคือRewriteBase /บิต น่าเสียดายที่ฉันไม่เข้าใจว่าทำไมมันถึงได้ผล แต่ฉันคิดว่าฉันจะได้เรียนรู้ในไม่ช้า
Keno Clayton

4

สำหรับผู้ที่ใช้ Firebase โฮสติ้งจะไม่มีคำตอบใด ๆ ในหน้านี้ เนื่องจากคุณไม่สามารถใช้.htaccessในโฮสติ้ง Firebase คุณจะต้องกำหนดค่าไฟล์ firebase.json เพียงเพิ่มบรรทัด"cleanUrls": trueในไฟล์ของคุณและบันทึก แค่นั้นแหละ.

หลังจากเพิ่มบรรทัด firebase.json แล้วจะมีลักษณะดังนี้:

{
  "hosting": {
    "public": "public",
    "cleanUrls": true, 
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ]
  }
}

2

ในการลบนามสกุล. html ออกจาก URL ของคุณคุณสามารถใช้รหัสต่อไปนี้ใน root / htaccess:

#mode_rerwrite start here

RewriteEngine On

# does not apply to existing directores, meaning that if the folder exists on server then don't change anything and don't run the rule.

RewriteCond %{REQUEST_FILENAME} !-d

#Check for file in directory with .html extension 

RewriteCond %{REQUEST_FILENAME}\.html !-f

#Here we actually show the page that has .html extension

RewriteRule ^(.*)$ $1.html [NC,L]

ขอบคุณ


-1
RewriteRule /(.+)(\.html)$ /$1 [R=301,L] 

ลองดูสิ :) ไม่รู้ว่าใช้ได้หรือเปล่า


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