Điểm:1

htaccess chỉ viết lại trong thư mục gốc (nói chung)

lá cờ ht

Xin chào, tôi đang cố gắng viết lại htaccess chỉ khi tệp, liên kết tượng trưng hoặc thư mục không có tên đó. Mà tôi đã thực hiện thành công với điều này ngay tại đây:

RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.+) - [PT,L]
RewriteRule ^(.*)$ index\.php?var=$1 [QSA,L]

Hoạt động hoàn hảo, tuy nhiên, tôi chỉ muốn điều này xảy ra trong thư mục gốc chứ không phải trong bất kỳ thư mục con nào. Làm cách nào tôi có thể thực hiện việc này theo cách chung chung (có nghĩa là tôi không muốn nêu rõ ràng URL trong tệp .htaccess)?

Điểm:1
lá cờ kz

Để ngăn bất kỳ lệnh mod_rewrite nào được xử lý cho các yêu cầu bên ngoài thư mục gốc của tài liệu, hãy đặt quy tắc sau ở đầu tệp:

# Ngăn quá trình xử lý tiếp theo nếu yêu cầu nằm ngoài thư mục gốc
Quy tắc viết lại / - [L]

Về cơ bản, ở trên nói rằng đối với bất kỳ đường dẫn URL được yêu cầu nào có dấu gạch chéo thì dừng tại đây. (Điều này cũng sẽ bắt các yêu cầu kết thúc bằng dấu gạch chéo - đó có phải là sự cố không?)


Ngoài ra, bạn có thể làm cho biểu thức chính quy trên hai quy tắc hiện có cụ thể hơn để nó chỉ áp dụng cho các yêu cầu trong thư mục gốc.

Ví dụ:

# Chỉ áp dụng quy tắc cho các yêu cầu trong thư mục gốc
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^[^/]+$ - [L]
RewriteRule ^([^/]*)$ index.php?var=$1 [QSA,L]

Các PT cờ trên quy tắc đầu tiên là không bắt buộc. Và nhóm chụp trong quy tắc đầu tiên cũng không bắt buộc. dấu chấm theo nghĩa đen trong thay thế chuỗi không cần phải thoát dấu gạch chéo ngược.

Lưu ý: Điều này cũng sẽ không xử lý được các yêu cầu chấm dứt với một dấu gạch chéo.


Tuy nhiên, nếu đây là những quy tắc duy nhất của bạn có liên quan đến điều này thì bạn không cần hai quy tắc, chỉ một quy tắc được yêu cầu, miễn là các yêu cầu đối với tài liệu gốc không có mặt var tham số URL. Ví dụ:

Directory Index index.php

RewriteCond %{REQUEST_FILENAME} !-s
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)$ index.php?var=$1 [QSA,L]

Lưu ý rằng logic của điều kiện được đảo ngược.

Như đã đề cập, các yêu cầu đối với thư mục gốc sẽ tự chuyển đến index.php (bởi mod_dir), không index.php?var=.

tony avatar
lá cờ ht
Câu trả lời tuyệt vời, cảm ơn bạn đã trả lời chi tiết. Câu hỏi tiếp theo: điều gì sẽ xảy ra nếu tôi cũng muốn xử lý các yêu cầu kết thúc bằng dấu gạch chéo, miễn là thư mục đó không tồn tại. điều đó có thể không?

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