Câu hỏi hay, nhưng dường như nó đã khiến mọi người bối rối. Các câu trả lời gần như được phân chia giữa những người nghĩ rằng Dave [OP] đang lưu các trang HTML của anh ta mà không có phần mở rộng .html
và những người nghĩ rằng anh ta đang cứu họ như bình thường [với .html
], nhưng muốn URL xuất hiện mà không cần. Mặc dù câu hỏi có thể được nói tốt hơn một chút, tôi nghĩ rằng nó rõ ràng ý anh ta. Nếu anh ta đang lưu các trang mà không có .html
, hai câu hỏi của anh ta [‘Làm thế nào để xóa .html '] và [làm thế nào để chuyển hướng bất kỳ URL nào với. Vì vậy, việc giải thích không có ý nghĩa gì. Ngoài ra, nhận xét đầu tiên của anh ấy [về việc tránh một vòng lặp vô hạn] và câu trả lời của chính anh ấy dường như xác nhận điều này.
Vì vậy, hãy để bắt đầu bằng cách viết lại câu hỏi và phá vỡ nhiệm vụ. Chúng tôi muốn hoàn thành hai điều:
- Xóa rõ ràng
.html
nếu nó là một phần của URL được yêu cầu [ví dụ:/page.html
] - Chỉ URL bị cắt [ví dụ:
example.com/content.html
0] trở lại tệp thực tế [/page.html
].
Không có gì khó khăn khi làm một trong những điều này. [Chúng tôi có thể đạt được thứ hai chỉ bằng cách kích hoạt nhiều lượt xem.] Thử thách ở đây là thực hiện cả hai mà không tạo ra một vòng lặp vô hạn.
Câu trả lời riêng của Dave đã hoàn thành công việc, nhưng nó khá phức tạp và không phải là di động. . Tuy nhiên, không ai trong số họ giải thích làm thế nào các giải pháp của họ đã giải quyết vấn đề cơ bản, cách thức tránh một vòng lặp vô hạn. Theo tôi hiểu, chúng hoạt động vì biến
example.com/content.html2 giữ yêu cầu ban đầu từ trình duyệt. Như vậy, điều kiện [
example.com/content.html3] chỉ được kích hoạt một lần. Vì nó không được kích hoạt khi viết lại, bạn tránh được kịch bản vòng lặp vô hạn. Nhưng sau đó, bạn đang xử lý toàn bộ yêu cầu HTTP, ____________ 14,
example.com/content.html5 và tất cả các điều này giải thích một phần một số ví dụ về Regex xấu hơn trên trang này.
Tôi sẽ cung cấp thêm một cách tiếp cận, mà tôi nghĩ rằng dễ hiểu hơn. Tôi hy vọng điều này giúp người đọc trong tương lai hiểu mã mà họ sử dụng, thay vì chỉ sao chép và dán mã mà họ hầu như không hiểu và hy vọng điều tốt nhất.
RewriteEngine on
# Remove .html [or htm] from visible URL [permanent redirect]
RewriteCond %{REQUEST_URI} ^/[.+]\.html?$ [nocase]
RewriteRule ^ /%1 [L,R=301]
# Quietly point back to the HTML file [temporary/undefined redirect]:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^ %{REQUEST_URI}.html [END]
Hãy cùng phá vỡ nó
Quy tắc đầu tiên khá đơn giản. Điều kiện phù hợp với bất kỳ URL nào kết thúc trong .html
[hoặc
example.com/content.html7] và chuyển hướng đến URL mà không có phần mở rộng tên tệp. Đó là một chuyển hướng vĩnh viễn để chỉ ra rằng URL bị cắt là chính thức.
Quy tắc thứ hai cũng đơn giản. Điều kiện đầu tiên sẽ chỉ vượt qua nếu tên tệp được yêu cầu không phải là thư mục hợp lệ [
example.com/content.html8]. Cái thứ hai sẽ chỉ vượt qua nếu tên tệp đề cập đến một tệp hợp lệ [
example.com/content.html9] với tiện ích mở rộng .html được thêm vào. Nếu cả hai điều kiện đều vượt qua, quy tắc viết lại chỉ cần thêm ‘.html, vào tên tệp. Và sau đó phép thuật xảy ra trên
example.com/content0. Đúng, đó là tất cả những gì cần thiết để ngăn chặn một vòng lặp vô hạn. Tài liệu của Apache Rewriterule Flags giải thích nó:
imageSử dụng cờ [end] chấm dứt không chỉ vòng xử lý viết lại hiện tại [như [l]] mà còn ngăn chặn mọi xử lý viết lại tiếp theo xảy ra trong bối cảnh mỗi hướng [HTACCess].
Công cụ tìm kiếm có thể lập chỉ mục các trang này dưới dạng nội dung trùng lặp, để khắc phục điều này thêm thẻ meta trong tệp HTML. & NBSP;
Ví dụ: & nbsp; & nbsp;