Sau khi triển khai trang web WordPress cho một trong những VPS của tôi và cố gắng cài đặt một plugin trong môi trường này, hộp thoại của Wordpress xuất hiện và nó thông báo rằng " To perform the requested action, WordPress needs to access your web server. Please enter your FTP credentials to proceed. If you do not remember your credentials, you should contact your web host (Để thực hiện hành động được yêu cầu, WordPress cần truy cập vào máy chủ web của bạn. Vui lòng nhập thông tin đăng nhập FTP của bạn để tiếp tục. Nếu bạn không nhớ thông tin đăng nhập của mình, bạn nên liên hệ với công ty lưu trữ web của mình )".
Có một số điểm kỹ thuật gây ra sự cố này và có thể không được người dùng thông thường quan tâm (người dùng thông thường có thể sẽ yêu cầu quản trị viên máy chủ cung cấp thông tin đăng nhập FTP vì cách này dễ dàng và an toàn hơn). Vâng, nó có vẻ là cách an toàn hơn cho hệ thống vì đây là một biện pháp bảo mật khá tốt, do đó việc khai thác hoặc tấn công plugin từ các nguồn không đáng tin cậy có thể không thể sửa đổi các tệp được lưu trữ trong máy chủ của bạn.
Tuy nhiên, nếu bạn là nhà phát triển và bạn biết về quyền tệp trong môi trường Linux và bạn đang gặp phải vấn đề này, có thể bạn đã chỉ định quyền cho thư mục wp-content/plugins
để WordPress có thể cài đặt các plugin mà không gặp vấn đề về quyền, nhưng, vấn đề vẫn tồn tại phải không? Trong bài viết này, tôi sẽ cung cấp cho bạn giải thích kỹ thuật về vấn đề và cách giải quyết nó.
Lý do tại sao điều này xảy ra?
Hộp thoại này được kích hoạt khi các lớp hệ thống tệp của WordPress được sử dụng. Trong trường hợp này, khi cố gắng cài đặt một plugin hoặc giao diện, nội dung của plugin cần phải được giải nén ra wp-content/plugins
hoặc trong trường hợp của một giao diện thì là thư mục wp-content/themes
đúng vậy không? Và mã của hàm get_filesystem_method
:
Ví dụ
/**
* Determines which method to use for reading, writing, modifying, or deleting
* files on the filesystem.
*
* The priority of the transports are: Direct, SSH2, FTP PHP Extension, FTP Sockets
* (Via Sockets class, or `fsockopen()`). Valid values for these are: 'direct', 'ssh2',
* 'ftpext' or 'ftpsockets'.
*
* The return value can be overridden by defining the `FS_METHOD` constant in `wp-config.php`,
* or filtering via {@see 'filesystem_method'}.
*
* @link https://wordpress.org/support/article/editing-wp-config-php/#wordpress-upgrade-constants
*
* Plugins may define a custom transport handler, See WP_Filesystem().
*
* @since 2.5.0
*
* @global callable $_wp_filesystem_direct_method
*
* @param array $args Optional. Connection details. Default empty array.
* @param string $context Optional. Full path to the directory that is tested
* for being writable. Default empty.
* @param bool $allow_relaxed_file_ownership Optional. Whether to allow Group/World writable.
* Default false.
* @return string The transport to use, see description for valid return values.
*/
function get_filesystem_method( $args = array(), $context = '', $allow_relaxed_file_ownership = false ){ /* */ }
Cố gắng tạo tệp tạm thời trong thư mục wp-content
. Nếu quá trình tạo không thành công, thì hàm được sử dụng để làm việc với tệp sẽ là thông qua FTP.
Giải pháp
Vì vậy, vấn đề thực sự là chủ sở hữu quy trình hiện tại (chủ sở hữu quy trình chạy WordPress như apache hoặc PHP) không có quyền ghi trực tiếp vào thư mục gốc wp-content
. Tuy nhiên, nếu bạn nói rằng bạn đã sử dụng CHMOD sửa quyền cho wp-content/plugins
và wp-content/themes
, thì bạn cần buộc WordPress sử dụng hệ thống tệp gốc. Bạn có thể thực hiện việc này bằng cách khai báo lệnh sau trong tệp wp-config.php
của mình :
Ví dụ
define('FS_METHOD', 'direct');
Sau khi buộc sử dụng hệ thống tệp, hộp thoại sẽ không xuất hiện nữa và quá trình cài đặt plugin và chủ đề sẽ thành công nếu và chỉ khi quyền của các thư mục được đề cập cấp quyền truy cập cho người dùng chạy quy trình WordPress.
Nếu sau khi sửa đổi này, việc cài đặt plugin và chủ đề không thành công, bạn cần điều chỉnh quyền của thư mục wp-content/plugins
và wp-content/themes
. Bạn có thể xác định người dùng nào đang chạy dịch vụ WordPress bằng cách chạy mã PHP sau trong phiên bản WordPress của bạn:
Ví dụ
<?php
// for example "www-data"
echo(exec("whoami"));
?>
Sau đó, điều chỉnh quyền cho mọi thư mục với chown:
Ví dụ
sudo chown -R www-data:www-data /wp-content/plugins
sudo chown -R www-data:www-data /wp-content/themes
Chúc bạn lập trình vui vẻ ❤️!