Làm thế nào để WordPress tạo các URL mà Apache biết về?


17

Khi bạn tạo một trang trong WordPress, nó chỉ là một mục trong bảng cơ sở dữ liệu; không có tập tin thực tế tại vị trí đó. Tuy nhiên tôi có thể tự tạo một tệp tại vị trí đó và nó sẽ đánh cắp trang khỏi WordPress. Tôi xóa tệp và nó liền mạch quay trở lại trang WordPress.

Tôi chỉ tò mò về cách đạt được điều này. Có lẽ một số giao tiếp đang xảy ra giữa WordPress và Apache (?).

Câu trả lời:


27

Trên thực tế không có giao tiếp xảy ra giữa Apache và WordPress. "Phép thuật" đang diễn ra trong mod_rewritecác quy tắc của Apache .

Để cài đặt WordPress tiêu chuẩn, bạn có các quy tắc sau .htaccess:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

Lưu ý dòng này: RewriteRule . /index.php [L] Ở đây, chúng tôi đang bảo Apache chuyển hướng nội bộ bất kỳ yêu cầu URL nào sang /index.php.

Trừ khi: dòng này:RewriteCond %{REQUEST_FILENAME} !-ftrở thành sai. Điều đó có nghĩa là, bằng cách thêm điều nàyRewriteCondvào phần trênRewriteRule, chúng tôi đang bảo Apache gửi tất cả các yêu cầu đến/index.php, nhưng không phải nếu đó là một tệp hiện có .

Ngoài ra, khi dòng này:RewriteCond %{REQUEST_FILENAME} !-dtrở thành sai. Điều đó có nghĩa là, với việc thêm điều nàyRewriteCondvới ở trênRewriteRule, chúng tôi đang bảo Apache gửi tất cả yêu cầu đến/index.php, nhưng không phải nếu đó là một thư mục hiện có .

Vì vậy, cuối cùng, trừ khi đó là một tệp hiện có hoặc một thư mục hiện có, Apache sẽ gửi nội bộ tất cả các yêu cầu khác đến /index.php.

Vì vậy, như bạn thấy, không có giao tiếp nào xảy ra giữa Apache & WordPress. Apache đang quyết định mọi thứ và chúng tôi đang bảo nó làm như vậy bằng cách sử dụng RewriteRuleRewriteCondchỉ thị.

Đọc thêm về mod_rewriteĐÂY .


3
Điều đó thật tuyệt. Tôi hiểu một cách hoàn hảo. Tôi đã xem tệp .htaccess mặc định nhiều lần và không bao giờ bận tâm phân tích nó. Cảm ơn bạn!
Matt

Đây là một mẫu thiết kế được gọi là bộ điều khiển phía trước. Lưu ý rằng nó chuyển hướng tất cả các url không tồn tại sang index.php, điều này có nghĩa là nếu bạn nhập đường dẫn đầy đủ đến tệp tin.php của mình, trình điều khiển phía trước sẽ không hoạt động và trang web sẽ phục vụ hàm.php. Đây là lý do tại sao bạn sẽ thường thấy các tệp WordPress và tệp chủ đề bắt đầu bằngif ( !defined(‘ABSPATH’)) exit;
Sjors Ottjes

Có, tôi đã thấy rằng trong các plugin nhưng không hiểu mục đích của nó. Vì vậy, nếu !defined(‘ABSPATH’)đánh giá là đúng, điều đó có nghĩa là một cái gì đó không phải là WordPress đang cố truy cập vào tập lệnh (vì ABSPATH được định nghĩa trong wp-config.php), và do đó, nên bỏ qua yêu cầu đó. Đúng không?
Matt

@matt Đúng vậy. Mặc dù tôi không nói rằng "cái gì khác ngoài WordPress". Bởi vì bạn cũng có thể định nghĩa ABSPATHtrong bất kỳ tập lệnh PHP nào khác, vì vậy nó sẽ cho phép các tập lệnh khác trên máy chủ của riêng bạn. Những gì nó sẽ không cho phép là quyền truy cập trực tiếp của tệp đó từ bên ngoài máy chủ của bạn (giả sử từ trình duyệt). Bởi vì bằng cách truy cập tệp đó trực tiếp, người dùng không thể xác định được ABSPATH.
Fayaz

Điều này thực sự tuyệt vời để biết. Tôi liên tục lo lắng về bảo mật và tôi sẽ có thể tận dụng lợi thế này ngay lập tức. Cảm ơn bạn!
Matt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.