Làm cách nào để triển khai viết lại URL trong tệp .htaccess của tôi?


17

Tôi muốn thực hiện viết lại một số URL (Tại sao? Xem câu hỏi này .) Để thay vì người dùng nhìn thấy các địa chỉ như

labouseur.com/course-compilers.html 

thay vào đó họ có thể nhìn thấy và sử dụng một cách đơn giản

labouseur.com/course-compilers

(Thậm chí tốt hơn, có lẽ tôi nên cơ cấu lại để nó là khóa học / trình biên dịch.)

Tôi đang sử dụng dịch vụ lưu trữ chia sẻ dựa trên Linux cho trang web của mình, vì vậy tôi không có quyền kiểm soát quản trị máy chủ, nhưng tôi có quyền kiểm soát .htaccess. Các tài liệu tham khảo tôi đã đọc trực tuyến dường như chưa rõ ràng đối với tôi, vì vậy tôi đang tìm kiếm một chút rõ ràng và lời khuyên ở đây.


Lưu ý rằng đây không phải là điều bạn chỉ làm trong cấu hình máy chủ (.htaccess). Bước đầu tiên quan trọng là thực sự thay đổi các URL trong ứng dụng của bạn, nếu không, bạn sẽ kết thúc với rất nhiều chuyển hướng không cần thiết (hoặc nội dung trùng lặp).
MrWhite

Câu trả lời:


13

Bạn thực sự có thể xóa .html khỏi các tệp trên máy chủ của mình và đặt cài đặt trong htaccess để chúng được phục vụ dưới dạng tệp html, nhưng đó có thể không phải là thứ bạn đang tìm kiếm.

Làm cái này :

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

Có sự phức tạp hơn ở đây, đặc biệt nếu bạn lo lắng về các vấn đề nội dung trùng lặp. Với quy tắc trên, các trang của bạn sẽ vẫn có thể truy cập được từ các URL cũ.
JasonBirch

3

Trước tiên, hãy đảm bảo apache có mô-đun và nó được phép trong các tệp .htacces, sau đó thêm:

RewriteEngine on

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

Ví dụ của bạn sẽ yêu cầu

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

Đối với cấu trúc thư mục một cấp và

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

Đối với một cấu trúc đa cấp.

Nhưng hãy cẩn thận

Nếu bạn có cấu trúc

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

Các quy tắc viết lại trong các .htaccesstệp con sẽ liên quan đến thư mục mẹ của chúng và bạn có thể gặp một số tình huống lặp lại viết lộn xộn . Hãy chắc chắn rằng bạn sử dụng RewriteCondđể ngăn chặn chúng xảy ra nếu bạn có thể!


Bạn có nhớ đi sâu vào chi tiết hơn về điểm cuối cùng đó (sử dụng RewriteCond để dừng các vòng lặp) không?
Travis Northcutt

2

Ngoài câu trả lời trên, người ta có thể sử dụng

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

([\w-]+) Cho phép chữ cái, chữ số có dấu gạch nối (-).

(.*) sẽ viết lại mọi yêu cầu bất kể, điều này có thể làm bất lực các quy tắc sau đây gây ra lỗi máy chủ nội bộ khi truy cập.


RewriteRule Mẫu của bạn là một cải tiến so với câu trả lời được chấp nhận cho ví dụ cụ thể được đưa ra trong câu hỏi, tuy nhiên, nó sẽ không khớp với trường hợp tổng quát hơn khi có nhiều hơn một đoạn đường dẫn, ví dụ. /path/to/course-compilers. Bao gồm Lcờ để giảm tác động đến các quy tắc sau. Trong khi (.*)mẫu là chung chung không cần thiết, không có khả năng gây ra vấn đề nghiêm trọng, vì điều kiện kiểm tra tệp tồn tại.
MrWhite

1

Bạn không phải sử dụng tệp .htaccess để thực hiện việc này. Đơn giản chỉ cần cấu trúc các tệp của bạn vào các thư mục và thay vì sử dụng "labouseur.com/cference-compilers.html", chỉ cần đặt tên tệp index.html và đặt nó vào một thư mục có tên là "trình biên dịch khóa học". Sau đó, khi bạn trỏ đến thư mục đó, chỉ mục được cung cấp theo mặc định nhưng sẽ không được hiển thị trong URL. Vì vậy, bạn chỉ có thể viết các liên kết của mình dưới dạng "labferenceur.com/cference-compilers" và tất cả sẽ ổn.

Không yêu cầu .htaccess.

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.