Điểm:1

Viết lại quy tắc cho URL có truy vấn không hoạt động

lá cờ cn

Tôi viết quy tắc viết lại sau:

<IfModule mod_rewrite.c>
RewriteCond %{QUERY_STRING} rp=\/knowledgebase\/.*
RewriteRule ^\/customer\/index.php /knowledgebase/ [R=301,L]
RewriteRule ^\/customer\/knowledgebase\.php$ /knowledgebase/ [R=301,L,QSA]
</IfModule>

Để chuyển hướng URL chẳng hạn như

https://www.example.com/customer/index.php?rp=/knowledgebase/5/DataNumen-Excel-Repair đến https://www.example.com/knowledgebase/

Và URL chuyển hướng chẳng hạn như

https://www.example.com/customer/knowledgebase.php đến https://www.example.com/knowledgebase/

Nhưng cả hai đều không hoạt động. Tại sao?

Cập nhật

Tôi thử đặt mã của MrWhite từ /.htaccess thành /customer/.htaccess và thực hiện một số thay đổi nhỏ để áp dụng các thay đổi, như sau:

RewriteCond %{QUERY_STRING} rp=/knowledgebase/
RewriteRule ^index\.php$ https://www.example.com/knowledgebase/ [QSD,R=301,L,NC]

RewriteRule ^knowledgebase\.php$ https://www.example.com/knowledgebase/ [R=301,L,NC]

Bây giờ chuyển hướng hoạt động. Tuy nhiên, nó sẽ chỉ hoạt động đối với trường hợp như:

https://www.example.com/customer/index.php?rp=/knowledgebase/9/DataNumen-PDF-Repair

nhưng đối với trường hợp như

https://www.example.com/customer/index.php?a=b&c=d&rp=/knowledgebase/9/DataNumen-PDF-Repair

Nó sẽ không làm việc. Ngay cả sau khi tôi thay đổi ^rp= thành rp trong RewriteCond.

Điểm:1
lá cờ kz

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.

alancc avatar
lá cờ cn
Xin lỗi nhưng điều đó vẫn không hoạt động. Cảm ơn rất nhiều.
lá cờ kz
@alancc Ý bạn là "không hoạt động" chính xác là gì? Bạn có mắc lỗi gì không? Chuyển hướng không chính xác? Không? Tệp `.htaccess` của bạn nằm ở đâu? Bạn có chỉ thị nào khác không? Bất kỳ tệp `.htaccess` nào khác?
alancc avatar
lá cờ cn
@MrWrite, Cảm ơn bạn rất nhiều. "Không hoạt động" có nghĩa là khi tôi nhập URL chẳng hạn như https://www.example.com/customer/index.php?rp=/knowledgebase/9/DataNumen-PDF-Repair thì không có gì xảy ra.Tôi kiểm tra mã phản hồi và nó hiển thị 200. Tôi đoán đó có thể là do có nhiều tệp .htaccess, vì vậy để đơn giản, tôi đặt các quy tắc viết lại vào tệp .htaccess trong /customer thay vì /. Tôi đã cập nhật bài viết của tôi cho phù hợp.
lá cờ kz
@alancc Các lệnh như được viết trong câu trả lời của tôi nhằm mục đích đi vào tệp `.htaccess` gốc. Nếu bạn đặt chúng trong thư mục con `/customer` thì bạn sẽ cần sửa đổi chúng như bạn đã thực hiện trong câu hỏi cập nhật của mình. Các lệnh trong câu hỏi được cập nhật của bạn có vẻ ổn (đã xóa tiền tố `^` để khớp với URL thứ 2 - mặc dù hiện tại có thể cho rằng điều đó khớp quá nhiều). Tuy nhiên, bạn có bất kỳ chỉ thị nào khác trong tệp `/customer/.htaccess` không? Bất kỳ chuyển hướng bên ngoài nào như thế này cần phải đi gần đầu trang. Nhiều tệp `.htaccess` có thể có vấn đề. Bạn có đang sử dụng viết lại _inheritance_ không?
alancc avatar
lá cờ cn
Cảm ơn rất nhiều. Tôi kiểm tra lại /customer/.htaccess, sau khi viết lại quy tắc, có AddHandler do cPanel tự động tạo. Và đó là câu lệnh cuối cùng trong .htaccess. URL thực tế là https://www.datanum.com/customer/index.php?a=b&c=d&rp=/knowledgebase/9/DataNumen-PDF-Repair, mặc dù bây giờ Cloudflare đã được bật, tôi đã thử khi nó bị tắt và cũng không hoạt động.
lá cờ kz
@alancc Tôi thấy rằng URL hiện có vẻ chuyển hướng như dự kiến. Điều gì đã được thực hiện để giải quyết điều này? Đó có phải là vấn đề về bộ nhớ đệm không? "AddHandler được tạo tự động bởi cPanel" - cPanel không nên chỉnh sửa tệp `.htaccess` trong thư mục con? `AddHandler` thường chỉ nằm trong tệp `.htaccess` gốc. (?)
alancc avatar
lá cờ cn
Tôi đoán đó là do Cloudflare Cache. Mặc dù tôi tạm dừng Cloudflare trên trang web của mình khi kiểm tra, bộ đệm hoặc thứ gì đó vẫn có thể suy ra. Bây giờ bộ đệm đã hết hạn. Có, thông thường Addhandler nên dành cho root .htaccess.Tuy nhiên, trong trường hợp của tôi, khách hàng sử dụng WHMCS thường không hỗ trợ phiên bản PHP mới nhất, vì vậy tôi phải đặt một phiên bản khác trên thư mục con đó. Cảm ơn bạn rất nhiều vì đã chỉ ra điều này.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.