Điểm:1

%{REQUEST_FILENAME}.ext nghĩa là gì? Tại sao có thêm đuôi .ext?

lá cờ dj

Các %{REQUEST_FILENAME} chứa một chuỗi như thế này:

/web/webroot/index.php

Tôi thấy nhiều người khuyên nên kiểm tra xem có tồn tại một tệp và có phần mở rộng .php như thế này không:

RewriteCond %{REQUEST_FILENAME}.php -f

không phải là .php sau đó %{REQUEST_FILENAME} dư thừa? Biến phải chứa sẵn .php, đúng?

Có vẻ như thêm .php sau đó %{REQUEST_FILENAME} sẽ làm cho kiểm tra TestString thêm một .php bổ sung, như thế này:

/web/webroot/index.php.php

Tôi đang thiếu một cái gì đó đơn giản, tôi chắc chắn về nó, nhưng tôi không biết nó là gì.

Bối cảnh là thế này:

RewriteCond %{THE_REQUEST} ^.*?\.php [NC]
Quy tắc viết lại ^ - [R=404,NE,L]

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_FILENAME}.php [L]
Điểm:1
lá cờ kz

không phải là .php sau đó %{REQUEST_FILENAME} dư thừa? Biến phải chứa sẵn .php, đúng?

Vâng, có và không, nó phụ thuộc vào những gì bạn đang cố gắng làm.

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_FILENAME}.php [L]

Quy tắc này cho phép bạn yêu cầu các URL không có phần mở rộng. ví dụ. /mục lục hoặc / foo và điều này nội bộ viết lại yêu cầu để /index.php/foo.php tương ứng.

Trong trường hợp này, REQUEST_FILENAME là một chuỗi có dạng /web/webroot/chỉ mục. Vì vậy, nó đang thử nghiệm rằng /web/webroot/index.php tồn tại trước khi viết lại như cũ. Nếu bạn yêu cầu /index.php sau đó điều kiện, tình trạng, trạng thái không thành công và không xảy ra ghi đè (điều này đúng).

Tuy nhiên, quy tắc này không hoàn toàn chính xác và có thể gây ra vòng lặp viết lại trong một số điều kiện nhất định. Xem câu hỏi liên quan sau:

Jeff avatar
lá cờ dj
Tôi thấy bạn biết công cụ của bạn. Tôi sẽ nhìn chằm chằm vào điều này trong vài giờ nữa cho đến khi tôi tìm ra nó. Tôi nghĩ rằng bạn đang nói rằng biến được sửa đổi bằng cách nối thêm `.ext`, nhưng tôi không thể tìm thấy hành vi này được ghi lại ở bất kỳ đâu ngoại trừ trên các diễn đàn SE. CHỈNH SỬA: Vâng, được rồi, tôi hiểu rồi. Cảm ơn!
lá cờ kz
@Jeff Bản thân biến (ví dụ: `REQUEST_FILENAME`) không được sửa đổi, chỉ có _TestString_ (đối số đầu tiên của lệnh `RewriteCond`) - như bạn nêu trong câu hỏi. Về cơ bản, nó đang kiểm tra xem URL được yêu cầu + `.php` có tồn tại dưới dạng tệp vật lý hay không.Mặc dù, `REQUEST_FILENAME` hoàn toàn không phải là biến chính xác để sử dụng ở đây (mặc dù hoạt động trong _most_ trường hợp), như đã đề cập trong câu hỏi được liên kết. (`REQUEST_FILENAME` là "tệp" mà URL được yêu cầu ánh xạ tới.)
Jeff avatar
lá cờ dj
Tất nhiên, vì tôi muốn sử dụng đúng các biến chính xác trong mã của mình, đây có phải là biến: `%{DOCUMENT_ROOT}%{REQUEST_URI}.php -f` không?
lá cờ kz
@Jeff Có, và thay đổi chuỗi `RewriteRule` _substlation_ cho phù hợp. I E. `RewriteRule ^ %{REQUEST_URI}.php [L]`
Jeff avatar
lá cờ dj
Tuyệt vời, cảm ơn rất nhiều!
lá cờ kz
@Jeff Biểu thức chính quy `!\.\w{2,4}$` loại trừ tất cả các yêu cầu đã bao gồm những gì _looks like_ một phần mở rộng tệp. Nó chỉ là một sự tối ưu hóa, để ngăn không cho tất cả các tài nguyên tĩnh (hình ảnh, CSS, JS, v.v.) bị kiểm tra một cách không cần thiết để xem liệu `image.jpg.php` có tồn tại hay không, v.v. (việc kiểm tra hệ thống tệp tương đối tốn kém). Các tệp không _thường_ có hai phần mở rộng tệp như `exists.qqq.php`, vì vậy thông thường sẽ không có vấn đề gì. Nhưng nó chỉ là một tối ưu hóa nên có thể xóa an toàn. Bạn có thể đạt được tối ưu hóa tương tự bằng cách loại trừ thư mục con nơi lưu trữ tất cả nội dung tĩnh của bạn.
Jeff avatar
lá cờ dj
Đồ tốt. Không phải dòng `RewriteCond` trước biểu thức chính quy loại trừ đã loại trừ tất cả các thử nghiệm bổ sung đó cho các tài nguyên tĩnh khác (ngoài các tệp .html) hay sao?
lá cờ kz
@Jeff Chỉ thị `RewriteRule` được xử lý trước. Chỉ khi `RewriteRule` _pattern_ khớp thì _conditions_ trước đó mới được xử lý. Nếu `RewriteRule` _pattern_ không thành công thì toàn bộ quy tắc sẽ bị bỏ qua và quá trình xử lý sẽ tiếp tục...
Jeff avatar
lá cờ dj
Chà, tôi không biết điều đó. Cảm ơn một lần nữa!

Đă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.