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.