Bởi vì, vì chuyển hướng là vô điều kiện, cuối cùng bạn lại chuyển hướng sau đó URL đã được viết lại thành index.php (bộ điều khiển phía trước WordPress).
Khi bạn yêu cầu /somepage.php:
- Bạn được chuyển hướng đến
/trang nào đó (theo quy tắc đầu tiên). Phản hồi chuyển hướng được gửi lại cho khách hàng.
- Ở yêu cầu thứ hai,
/trang nào đó được viết lại nội bộ thành /index.php theo quy tắc cuối cùng. Công cụ viết lại sau đó bắt đầu lại (trong một danh mục bối cảnh)...
/index.php được chuyển hướng đến /mục lục (theo quy tắc đầu tiên).Phản hồi chuyển hướng được gửi lại cho khách hàng.
- Về yêu cầu thứ ba
/mục lục được viết lại nội bộ thành /index.php bởi lần viết lại cuối cùng. Công cụ viết lại sau đó bắt đầu lại ...
- Goto 3 (bị mắc kẹt trong một vòng lặp chuyển hướng vô tận).
trong một danh mục bối cảnh (như .htaccess) công cụ viết lại không chỉ thực hiện một lần duy nhất thông qua tập lệnh. Nó lặp lại cho đến khi URL đi qua không thay đổi. (Trừ khi bạn sử dụng CHẤM DỨT cờ trên Apache 2.4 hoặc xảy ra chuyển hướng 3xx bên ngoài.)
Thay đổi để loại bỏ .html hoạt động tốt vì bạn đang viết lại /index.php, mà không kết thúc trong .html, vì vậy chỉ thị chuyển hướng (loại bỏ .html) không phù hợp với.
Để giải quyết vấn đề này, bạn cần tránh chuyển hướng yêu cầu đã viết lại. Bạn có thể làm điều này bằng cách:
sử dụng CHẤM DỨT cờ (Apache 2.4+) trong lần viết lại cuối cùng, thay vì l để ngăn chặn bất kỳ vòng lặp nào nữa của công cụ viết lại. Mặc dù bạn nên tránh thay đổi các chỉ thị stock WordPress (xem bên dưới), vì vậy đây có thể không phải là tùy chọn ưu tiên. Điều này cũng không hoạt động trên Apache 2.2.
Hoặc, kiểm tra xem .php mở rộng chống lại YÊU CẦU biến máy chủ (chứa dòng đầu tiên của tiêu đề yêu cầu HTTP và không thay đổi khi yêu cầu được viết lại). Ví dụ:
# Chỉ xóa phần mở rộng ".php" trên các yêu cầu "trực tiếp" (không được viết lại)
RewriteCond %{THE_REQUEST} [A-Z]{3,7}\s/[^?]+\.php(?:\?|\s|$) [NC]
RewriteRule (.+)\.php$ /$1 [R=301,L,NC]
Hoặc, kiểm tra REDIRECT_STATUS biến môi trường, trống trong yêu cầu ban đầu và được đặt thành 200 (như ở trạng thái HTTP 200 OK) trong lần viết lại thành công đầu tiên (điều này đơn giản hơn biểu thức chính quy phức tạp hơn ở trên). Ví dụ:
# Chỉ xóa phần mở rộng ".php" trên các yêu cầu "trực tiếp" (không được viết lại)
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule (.+)\.php$ /$1 [R=301,L,NC]
Tuy nhiên, bạn không nên chỉnh sửa mã bên trong # BẮT ĐẦU WordPress phần, vì bản thân WordPress cố gắng duy trì điều này và có thể ghi đè lên mã này sau. quy tắc này cần phải đi trước các # BẮT ĐẦU WordPress đánh dấu nhận xét. Bạn không cần phải lặp lại Viết LạiEngine Trên lệnh xuất hiện sau trong tệp (trong phần WordPress).
Bạn sẽ cần xóa bộ nhớ cache của trình duyệt trước khi thử nghiệm, vì chuyển hướng sai (vĩnh viễn) có thể đã được trình duyệt lưu vào bộ nhớ cache. Trước tiên hãy thử nghiệm với chuyển hướng 301 (tạm thời) để tránh các vấn đề về bộ nhớ đệm.
Tuy nhiên, điều này một mình không cho phép bạn truy cập .php tập tin mà không có .php sự mở rộng. Vì URL không có phần mở rộng sẽ cần phải được viết lại nội bộ trở lại .php tập tin.