Xin chào @Mike Lee :
Để trả lời câu hỏi của bạn, thật hữu ích để hiểu mọi thứ hoạt động như thế nào.
Apache phục vụ các URL khớp với các tệp và thư mục
Apache được thiết kế để phục vụ các tệp được khớp rõ ràng bằng URL hoặc để phục vụ index.php
tìm thấy trong một thư mục khi thư mục được khớp rõ ràng.
Nhưng Apache có thể phục vụ các URL được khớp bởi Regex với mod_rewrite
Nếu bạn muốn Apache khớp URL ở nơi không có thư mục thực (trường hợp với WordPress và permalinks đẹp) thì bạn phải có một số cách để nói với Apache cách xử lý URL khác nhau. Và đó chính xác là những gì mod_rewrite
được thiết kế để cho phép; nó cung cấp cho quản trị viên máy chủ khả năng đặt quy tắc để khớp URL bằng các biểu thức thông thường. Các quy tắc này định tuyến kết quả đến các URL khác, thường bao gồm .PHP
các tệp thực sự và đôi khi với các tham số URL được truyền. Cuối cùng, các quy tắc xác định rằng các tập tin thực tế được tải.
Và mod_rewrite
được cấu hình với Hoặc .htaccess
hoặchttpd.conf
Để cấu hình, mod_rewrite
bạn chỉ có thể thực hiện bên trong .htaccess
hoặc bên trong httpd.conf
tệp hoặc một trong các tệp mà nó bao gồm, như có khả năng httpd-vhosts.conf
. Thực sự tôi rất ngạc nhiên nếu khách hàng của bạn có các kỹ năng để kiểm soát Apache mà họ chưa biết điều này.
WordPress luôn sử dụng cùng một .htaccess
tệp đơn giản
Chuyển sang những gì WordPress làm, khi bạn đặt permalinks, WordPress ghi phần sau vào .htaccess
tệp, giả sử nó có thể ghi được ( và trong ví dụ đầu tiên này giả sử trang web của bạn được phục vụ từ gốc ):
# 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
Hãy cẩn thận: Khi thư mục trang trước WordPress của bạn không root
Nếu trang web của bạn được phục vụ thay vào /blog
đó thì .htaccess
tệp được viết sẽ trông như thế này:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /blog/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /blog/index.php [L]
</IfModule>
Các tuyến WordPress Tất cả các URL không phải tệp / thư mục phù hợp với index.php
Vì vậy, như bạn có thể thấy, điều duy nhất WordPress sử dụng .htaccess
là ánh xạ bất kỳ URL nào sang tên miền /index.php
(hoặc /blog/index.php
trong ví dụ thứ 2) trừ khi URL khớp với một tệp thực tế (như .jpg
/ .gif
/ .png
hình ảnh, biểu .css
định kiểu, .js
tập lệnh, v.v.) hoặc khi nó khớp với một thư mục thực tế (mà theo như tôi biết thì không liên quan đến bản cài đặt WordPress tiêu chuẩn.)
Trong phân PHP
tích WordPress $_SERVER['REQUEST_URI']
để quyết định tải gì
Bên trong của nó PHP
mã WordPress lấy giá trị của $_SERVER['REQUEST_URI']
chứa URL yêu cầu đầy đủ sans lĩnh vực và chương trình (ví dụ: chương trình là http
hay https
) và sau đó nó phân tích các giá trị để xác định những URL được yêu cầu và do đó những gì các trang nó nên tải.
Bỏ qua .htaccess
? Nhận Apache để tải URL ảo (nhưng chúc may mắn với điều đó!)
Vì vậy, nếu bạn muốn bỏ qua .htaccess
công việc của mình bằng cách nào đó, hãy để Apache trả lời một URL tùy ý, sau đó tải WordPress và đặt thành $_SERVER['REQUEST_URI']
đường dẫn URL cộng với các tham số; IOW giả mạo nó nhưng theo một cách tốt. Điều đó nói rằng, tôi biết nếu biết không có cách nào không quá phức tạp để làm điều đó.
Nhúng /index.php/
(Có lẽ?!?)
Mặc dù * Chris_O * là chính xác về việc thêm vào /index.php/
URL của bạn, tôi co rúm lại bất cứ khi nào tôi thấy điều đó. Nó thêm 10 ký tự cho mỗi URL làm cho chúng dài hơn và ít ý nghĩa hơn đối với các công cụ tìm kiếm nhưng tệ hơn nữa làm cho chúng ít có thể chia sẻ hơn và trông khó hiểu đối với người dùng. Xin lỗi Chris tôi biết bạn có ý tốt, nhưng ugh!
Tạo thư mục thực cho mỗi URL (Có thể?)
Một cách để có được các permalinks đẹp mà không cần chạm vào Apache là viết một tập lệnh sẽ tạo một thư mục thực tế cho mọi URL mà bạn muốn và sau đó lưu trữ index.php
ở đó sẽ tải WordPress. Tất nhiên đó sẽ là nỗ lực rất lớn vì lợi ích nhỏ bé và nó sẽ yêu cầu máy chủ phải có quyền truy cập ghi, điều này còn tệ hơn cả việc sử dụng .htaccess
tệp.
Tôi ghét phải thừa nhận nhưng đây là những gì tôi đã làm vào khoảng năm 1998 với một .ASP
trang web dựa trên nền tảng khi IIS
không hỗ trợ viết lại URL (và thậm chí ngày nay nó vẫn là một PITA thực sự!) Đó là một hack xấu xí, là một nỗi đau để duy trì và tôi ghét nó nhưng các URL chắc chắn là tuyệt vời cho cả người dùng và SEO!
Giải pháp tốt nhất? Thêm quy tắc viết lại vàohttpd.conf
Quay lại với những gì có lẽ là giải pháp tốt nhất của bạn và @Simon Brown thực sự đã khuyến nghị nó; thêm quy tắc viết lại của bạn vào httpd.conf
hoặc một trong các tệp bao gồm như httpd-vhosts.conf
(đó là cách Apache được định cấu hình tại localhost trên máy Mac của tôi.) Thêm chỉ thị sau để đảm bảo thay đổi thư mục phù hợp với thư mục cho trang web của bạn:
<Directory "/home/example_user/public_html/">
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</Directory>
Tặng kem! Với tính năng khóa xuống cũng có hiệu suất
Tùy chọn cuối cùng này sẽ loại bỏ bất kỳ .htaccess
và đặt lại quyền kiểm soát trong tay họ. Thậm chí tốt hơn, nó có hiệu suất cao hơn một chút vì httpd.conf
chỉ được tải một lần khi Apache khởi động nhưng .htaccess
các tệp được tải và phân tích cú pháp trên mỗi yêu cầu URL!
PS Một điều nữa cần xem xét là Apache đầu cuối với một máy chủ bộ đệm như Nginx mà tôi tin rằng đang trở thành một cách thực hành tốt nhất cho các trang web WordPress có lưu lượng truy cập cao thực sự cần phải hoạt động. Có thể điều chỉnh trường màu xanh lá cây vì tôi không nghĩ rằng hầu hết mọi người đã sử dụng Nginx để viết lại URL cho Apache nhưng nếu hướng đó khiến bạn quan tâm thì đây là một số liên kết để theo đuổi: