it-swarm-vi.tech

Thiết lập WordPress với Permalinks tùy chỉnh và không có tệp .htaccess?

Tôi có một ứng dụng khách rất thích vô hiệu hóa các tệp .htaccess vì họ muốn tự thiết lập các cấu hình Apache. Tuy nhiên, họ vẫn muốn các URL thân thiện với SEO.

Có cách nào để có permalinks tùy chỉnh không có tệp .htaccess không? Nghiên cứu của tôi cho đến nay dường như chỉ ra điều này là không thể, nhưng có lẽ một trong những nhà phát triển tài giỏi biết làm thế nào điều dường như không thể có thể xảy ra. Cảm ơn trước!

7
Mike Lee

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ân phát index.php được 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 các tệp .PHP thực sự và đôi khi có 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.

mod_rewrite được định cấu hình bằng .htaccess hoặc httpd.conf

Để định cấu hình mod_rewrite, bạn chỉ có thể thực hiện trong .htaccess hoặc trong tệp httpd.conf 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 tệp .htaccess đơn giản

Chuyển sang những gì WordPress làm, khi bạn đặt permalinks, WordPress sẽ viết đoạn sau vào tệp .htaccess, 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 thay vào đó được phục vụ từ /blog thì tệp .htaccess được viết sẽ 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 cho là ánh xạbất kỳURL tới tên miền tới /index.php (hoặc /blog/index.php trong ví dụ thứ 2)ngoại trừkhi một URL khớp với một tập tin thực tế (chẳng hạn như .jpg/.gif/.png hình ảnh, một biểu định kiểu .css, một tập lệnh .js, v.v.) hoặc khi nó khớp với một thư mục thực tế không liên quan trong bản cài đặt WordPress tiêu chuẩn.)

Trong PHP Phân tích WordPress $_SERVER['REQUEST_URI'] để quyết định tải gì

Bên trong mã PHP của nó, WordPress lấy giá trị của $_SERVER['REQUEST_URI'] chứa yêu cầu URL đầy đủ sans tên miền và lược đồ (nghĩa là lược đồ là http hoặc https) và sau đó phân tích giá trị để xác định URL nào được yêu cầu các trang 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 bằng cách nào đó, công việc của bạn sẽ là để Apache trả lời một URL tùy ý, sau đó tải WordPress và đặt $_SERVER['REQUEST_URI'] làm đườ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ó thể?!?)

Mặc dù * Chris_O * là chính xác về việc trả trước /index.php/ cho các URL của bạn, tôi co rúm lại mỗi khi 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 sự 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 tệp .htaccess.

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 trang web dựa trên .ASP 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ự!) 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ào httpd.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ự đã đề xuất 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>

Tiền thưởng! 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ỏ mọi .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 tệp được tải và phân tích cú pháp trên mỗi yêu cầu URL!

P.S. Một điều nữa cần xem xét là Apache front-end với máy chủ bộ đệm như Nginxmà tôi tin rằng đang trở thành 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 được biểu diễn. 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 để thực hiện 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:

15
MikeSchinkel

Permalinks không có mod_rewrite

Nếu không có tệp .htaccess hoặc sửa đổi tệp httpd.conf của bạn, cách tốt nhất bạn có thể làm là permalinks pathinfo. Các permalinks Pathinfo giống như các permalinks đẹp, ngoại trừ chúng bắt đầu bằng index.php.

Để sử dụng permalinks pathinfo, hãy đặt index.php/vào đầu cấu trúc permalink tùy chỉnh của bạn:

/index.php/%postname%/

Xem bài viết Codex để biết thêm thông tin.

2
Chris_O

Quay trở lại những ngày cũ tồi tệ, WordPress cần phải viết một tệp cấu hình mới mỗi khi bạn thay đổi cấu trúc permalink. Trong các thiết lập hiện đại, RewriteRules không thay đổi:

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

Tất cả các yêu cầu cho các tệp không tồn tại (ví dụ: đường dẫn permalink tùy chỉnh không khớp với tệp trên hệ thống tệp) được chuyển qua index.php và $_SERVER['REQUEST_URI'] cho PHP những gì thực sự được yêu cầu. Khách hàng của bạn có thể đặt quy tắc viết lại trong httpd.conf hoặc .htaccess và bạn sẽ không cần phải sửa đổi nó khi bạn Tweak cấu trúc permalink.

Một số plugin cố gắng tự sửa đổi .htaccess hoặc yêu cầu bạn sửa đổi tệp. Giải pháp này có thể không dành cho tất cả mọi người, nhưng nó đáng để xem xét.

0
Annika Backstrom