RewriteRule ^/customer/index.php /knowledgebase/ [R=301,L]
Trong .htaccess
, đường dẫn URL khớp với viết lại quy tắc
mẫu (I E. ^\/customer\/index.php
) không bắt đầu bằng dấu gạch chéo, vì vậy điều này sẽ không bao giờ khớp.Đường dẫn URL phù hợp có liên quan đến danh mục có chứa .htaccess
tệp (trừ tiền tố dấu gạch chéo). (Không giống như khi được sử dụng trong một người phục vụ ngữ cảnh, khi đường dẫn URL khớp là đường dẫn URL tương đối gốc của tài liệu, bắt đầu bằng dấu gạch chéo.)
Bạn cũng sẽ cần QSD
cờ trên quy tắc đầu tiên để loại bỏ chuỗi truy vấn theo yêu cầu ban đầu, nếu không thì điều này được chuyển qua nguyên trạng.
Điểm nhỏ ... không cần phải gạch chéo ngược dấu gạch chéo thoát trong biểu thức chính quy của Apache, vì không gian là dấu phân cách đối số và dấu gạch chéo không có ý nghĩa đặc biệt nào khác trong biểu thức chính quy.
Thay vào đó, hãy thử những cách sau:
Viết LạiEngine Trên
RewriteCond %{QUERY_STRING} ^rp=/knowledgebase/
RewriteRule ^customer/index\.php$ /knowledgebase/ [QSD,R=301,L]
RewriteRule ^customer/knowledgebase\.php$ /knowledgebase/ [R=301,L]
Tôi đã neo chuỗi truy vấn trong điều kiện, tình trạng, trạng thái vì vậy nó phù hợp rp=...
ở đầu chuỗi truy vấn, như trong ví dụ của bạn. Các .*
ở cuối regex là không bắt buộc.
Các QSA
cờ không bắt buộc đối với quy tắc thứ 2 vì chuỗi truy vấn được chuyển qua theo mặc định. Các QSA
cờ sẽ chỉ được yêu cầu nếu bạn cần hợp nhất chuỗi truy vấn ban đầu theo yêu cầu bằng một chuỗi truy vấn mới mà bạn đang thêm vào thay thế.
Các <IfModule>
trình bao bọc là không cần thiết, trừ khi các chỉ thị này là không bắt buộc và dự định sẽ được sử dụng trên nhiều máy chủ nơi mod_rewrite có thể không khả dụng. Xem câu hỏi này trên ngăn xếp Quản trị viên web: https://webmasters.stackexchange.com/questions/112600/is-checking-for-mod-write-really-necessary
Trước tiên, bạn nên thử nghiệm với chuyển hướng 302 (tạm thời) để tránh các sự cố tiềm ẩn về bộ nhớ đệm.
CẬP NHẬT: để làm cho mọi thứ đơn giản, tôi đặt các quy tắc viết lại vào .htaccess
tập tin dưới /khách hàng
thay vì /
. Tôi đã cập nhật bài viết của tôi cho phù hợp.
Trong trường hợp đó, bạn sẽ cần phải loại bỏ khách hàng/
tiền tố trên mỗi viết lại quy tắc
hoa văn, như bạn đã làm trong câu hỏi cập nhật của mình.
Nếu rp
Tham số URL nhằm khớp với bất kỳ vị trí nào trong chuỗi truy vấn thì bạn nên thay đổi CondPattern đọc (^|&)rp=/knowledgebase/
, thay vì chỉ đơn giản là loại bỏ ^
tiếp đầu ngữ. Bằng cách loại bỏ ^
tiền tố bạn có khả năng khớp quá nhiều, vd. abcrp=/kiến thức cơ sở/...
cũng sẽ phù hợp, mặc dù điều đó có thể hoặc không thể là một vấn đề trong thực tế.
Mặt khác, các chỉ thị được cập nhật đó trông vẫn ổn, tùy thuộc vào bất kỳ xung đột nào khác có thể tồn tại với các chỉ thị khác. Bộ nhớ đệm cũng có thể là một vấn đề, đặc biệt nếu bạn đang sử dụng CDN.