Làm cách nào để xóa .html khỏi URL?


112

Làm cách nào để xóa .htmlkhỏi URL của một trang tĩnh?

Ngoài ra, tôi cần chuyển hướng bất kỳ url nào có url đến url .htmlkhông có nó. (tức là www.example.com/page.htmlđể www.example.com/page).


1
Bằng cách "loại bỏ .html", có phải ý bạn là "không yêu cầu .html hiện diện"?
Lightness Races ở Orbit

@Tomalak: Có và cũng chuyển hướng các url có ".html" đến các url không có. Vấn đề của tôi là điều này dẫn đến chuyển hướng vô hạn. Thiết lập hiện tại của tôi cho phép cả www.example.com/page.html và www.example.com/page đều có thể truy cập được, điều này không thân thiện với SEO.
Dave


@Tomalak: Cảm ơn vì những lời khuyên. Đọc tài liệu của mod_rewrite rất hữu ích.
Dave

Câu trả lời:


105

Tôi nghĩ một số giải thích về câu trả lời của Jon sẽ mang tính xây dựng. Như sau:

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

kiểm tra xem nếu tệp hoặc thư mục được chỉ định tương ứng không tồn tại, thì quy tắc ghi lại sẽ tiến hành:

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

Nhưng điều đó có nghĩa gì? Nó sử dụng regex (biểu thức chính quy) . Đây là một vài thứ tôi đã làm trước đó ... nhập mô tả hình ảnh ở đây

Tôi nghĩ điều đó chính xác.

LƯU Ý: Khi kiểm tra, bạn .htaccess không sử dụng chuyển hướng 301. Sử dụng 302 cho đến khi kiểm tra xong, vì trình duyệt sẽ lưu vào bộ nhớ cache của 301. Xem https://stackoverflow.com/a/9204355/3217306

Cập nhật: Tôi hơi nhầm, .khớp với tất cả các ký tự ngoại trừ dòng mới, vì vậy bao gồm cả khoảng trắng. Ngoài ra, đây là một bảng gian lận regex hữu ích

Nguồn:

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

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


6
Sơ đồ tuyệt vời để giúp giải thích câu trả lời.
Ric

Mẹo trên 301s và bộ nhớ cache của trình duyệt là những gì đã giải quyết vấn đề của tôi.
bgfvdu3w

@KnocksX Tôi không còn là một webmaster và không ở một vị trí để có thể giúp đỡ
binaryfunt

84

Để xóa phần mở rộng .html khỏi url của bạn, bạn có thể sử dụng mã sau trong 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]

LƯU Ý: Nếu bạn muốn xóa bất kỳ phần mở rộng nào khác, chẳng hạn như để xóa phần mở rộng .php, chỉ cần thay thế html ở mọi nơi bằng php trong đoạn mã trên.


10
Không có câu trả lời nào khác phù hợp với tôi, nhưng câu trả lời này đã làm được, cảm ơn rất nhiều!
Emmet Arries

2
cái này cũng làm việc cho tôi. Cảm ơn @starkeen. Có một ^ phiếu bầu.
JeremyS

2
Làm việc hoàn toàn tốt. Cảm ơn bạn!
ixany

cái này xóa phần mở rộng tệp cho tôi nhưng không chuyển hướng đến trang đó
Bhargav Venkatesh

74

Với .htaccess dưới apache, bạn có thể thực hiện chuyển hướng như sau:

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

Đối với việc xóa .html khỏi url, chỉ cần liên kết đến trang không có .html

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

23
Điều này không làm bất cứ điều gì cho tôi. Có một số lý do nó không hoạt động?
Michael Yaworski

Bạn có một tệp thực sự cho liên kết được yêu cầu không? Điều đó sẽ kích hoạt!-f
Martijn

72

Điều này sẽ làm việc cho bạn:

#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
Tôi đã nhận được 404 trong Godaddy với mã này và tôi đã sửa nó bằng cách đặt: Tùy chọn + FollowSymLinks -MultiViews -Chỉ số ở trên cùng.
Labanino

1
Tôi nghĩ đây là câu trả lời tốt nhất và đầy đủ nhất, cảm ơn!
ctekk

Tôi đã cố gắng thực hiện việc này trong localhost, nhưng nó không hoạt động, tôi có cần phải làm gì khác không, tôi có phải liên kết tệp .htaccess không hay làm cách nào để trang nhận ra nó?
Pianistprogrammer,

Làm cách nào để thêm phần mở rộng .php vào # 301 từ example.com/page.html thành example.com/page, có được không?

20

Bạn sẽ cần phải đảm bảo rằng bạn có Options -MultiViews cũng có.

Không có cách nào ở trên phù hợp với tôi trên máy chủ cPanel tiêu chuẩn.

Điều này đã hoạt động:

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

Trong số tất cả các câu trả lời ở trên, câu trả lời này cuối cùng đã hoạt động .. Tôi tin rằng vì trang web của tôi được lưu trữ trên godaddy với cPanel. Điều quan trọng là chọn -MultiViews
Brad Vanderbush

Vâng, không có gì trong phần này hoạt động mong đợi câu trả lời này! Bạn đã tiết kiệm trong ngày!
Neil Bannet

Cảm ơn bạn đời. Tôi không chắc tại sao những người khác không diễn ra như mong đợi.
Nanoo

13

Cảm ơn cho câu trả lời của bạn. Tôi đã giải quyết được vấn đề của mình. Giả sử tôi có các trang của mình trong http://www.yoursite.com/html , các quy tắc .htaccess sau sẽ được áp dụng.

<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

Tôi sử dụng .htacess này để xóa .html extantion khỏi trang web url của mình, vui lòng xác minh đây là mã chính xác:

    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]

Điều này dường như hiệu quả với tôi, không giống như các giải pháp khác được trình bày ở đây, cảm ơn bạn. Tôi muốn nói thêm rằng bạn vẫn cần cập nhật (các) liên kết trong HTML của mình (vì vậy nếu ban đầu bạn đang liên kết đến tệp .html của mình dưới dạng <a href="page1.html"> </a>, bạn nên cập nhật nó dưới dạng <a href=" example.com/page1"> </ a > và sau đó nó sẽ hoạt động.)
Lorenzo

Thay đổi cốt lõi đối với tôi là một RewriteBase /chút. Thật không may, tôi không hiểu tại sao nó hoạt động, nhưng tôi đoán tôi sẽ sớm học được.
Keno Clayton

4

Đối với những người đang sử dụng lưu trữ Firebase, không có câu trả lời nào sẽ hoạt động trên trang này. Vì bạn không thể sử dụng .htaccesstrong lưu trữ Firebase. Bạn sẽ phải định cấu hình tệp firebase.json. Chỉ cần thêm dòng "cleanUrls": truetrong tệp của bạn và lưu nó. Đó là nó.

Sau khi thêm dòng firebase.json sẽ trông như thế này:

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

2

Để xóa phần mở rộng .html khỏi URL của bạn, bạn có thể sử dụng mã sau trong 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]

Cảm ơn


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

Hãy thử cái này :) không biết nếu nó hoạt động.


4
Bạn không nên đăng nó như một câu trả lời nếu bạn không chắc liệu nó có hoạt động hay không.
Có vấn đề gì không?
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.