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


7

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!


2
Bạn có thể (hoặc yêu cầu họ) sửa đổi tệp httpd.conf không?
Gelatin

Nếu hoàn toàn không thể có permalinks tùy chỉnh mà không có tệp .htaccess, thì tôi sẽ cung cấp cho họ các lựa chọn thay thế: 1) không có URL thân thiện với SEO hoặc 2) URL thân thiện với SEO và tệp htaccess. Đó là những lựa chọn khả thi duy nhất tôi hiện thấy, nhưng nếu tôi không chính xác, tôi rất muốn được sửa chữa. :)
Mike Lee

Câu trả lời:


15

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.phptì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 .PHPcá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.

mod_rewriteđược cấu hình với Hoặc .htaccesshoặchttpd.conf

Để cấu hình, mod_rewritebạn chỉ có thể thực hiện bên trong .htaccesshoặc bên trong httpd.conftệ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 .htaccesstệ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 .htaccesstệ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ì .htaccesstệ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 .htaccesslà ánh xạ bất kỳ URL nào sang tên miền /index.php(hoặc /blog/index.phptrong ví dụ thứ 2) trừ khi URL khớp với một tệp thực tế (như .jpg/ .gif/ .pnghình ảnh, biểu .cssđịnh kiểu, .jstậ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 PHPtích WordPress $_SERVER['REQUEST_URI']để quyết định tải gì

Bên trong của nó PHPmã 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à httphay 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 .htaccesscô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 .htaccesstệ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 .ASPtrang web dựa trên nền tảng khi IISkhô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.confhoặ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ỳ .htaccessvà đặ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.confchỉ được tải một lần khi Apache khởi động nhưng .htaccesscá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:


Cảm ơn bạn đã trả lời cực kỳ hữu ích và kỹ lưỡng, như mọi khi! Khách hàng đang nghiêng về việc sửa đổi httpd.conf và đó có lẽ là những gì chúng ta sẽ làm. Tăng hiệu suất là một mẹo tiền thưởng tốt quá!
Mike Lee

@Mike Lee : Vâng, thật tuyệt khi bạn có thể nói "Bạn thực sự nên làm theo cách này và, nhân tiện bạn sẽ có hiệu suất tốt hơn nếu bạn làm thế !" Tôi thấy rằng thường xuyên trao đổi chúng. :)
MikeSchinkel

Tôi muốn đưa công ty của mình nhảy vào nhóm nhạc NGINX. Nó thực sự là một phần mềm tốt. Tôi đã thiết lập nó cho một trang web nhỏ mà tôi đang tạo và SNAP thật nhanh!
Dan Gayle

2

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 trừ khi 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.


@Chris_O : Tôi không muốn trở thành một kẻ ngốc và bỏ phiếu vì vậy tôi sẽ không nói nhưng tôi phải nói rằng tôi thực sự co rúm người khi thấy mọi người sử dụng giải pháp này. Tôi biết bạn chỉ đang cố gắng giúp đưa ra những hạn chế đã nêu nhưng trong suy nghĩ của tôi, cách tiếp cận này là sự thù địch của người dùng, trì hoãn việc chia sẻ xã hội và tệ hơn là nó trông giống như những người nghiệp dư thiết lập trang web. Nhưng sau đó tôi đã bắt đầu viết blog một blog.welldesignurls.org vài năm trước để tôi có một chút ý thức hệ chống lại những điều như vậy. :)
MikeSchinkel

@Chris_) : Để rõ ràng, ý kiến ​​của tôi đã nhắm vào giải pháp, không phải cho bạn; bạn tuyệt lắm! Chỉ muốn bạn biết điều đó. :)
MikeSchinkel

Không có sự xúc phạm nào. Chỉ cung cấp giải pháp duy nhất mà tôi biết là không sử dụng .htaccess hoặc httpd.conf. Đồng ý rằng nó không lý tưởng nhưng tôi muốn sử dụng nó hơn example.org/?p=123 nếu đó là lựa chọn DUY NHẤT của tôi.
Chris_O

1
Tôi đồng ý đây không phải là cách lý tưởng để đi, nhưng tôi đánh giá cao đề xuất này như một cách thay thế. Và tốt hơn nhiều so với example.org/?p=123!
Mike Lee

0

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 biết 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 sửa đổi nó khi bạn điều chỉnh 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.


Cảm ơn câu trả lời. Khách hàng đang nghiêng về việc sửa đổi httpd.conf ngay bây giờ.
Mike Lee
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.