我如何编写我的插件以安全地修改.htaccess?

时间:2019-03-14 作者:Andy Macaulay-Brook

我想将规则添加到.htaccess 在不破坏WP核心permalink规则或其他插件添加的规则的情况下从插件中删除。

(我的目标是通过检查对字体文件的任何请求的引用来阻止字体的刮取。我知道这不是高安全性,只是需要遵守字体许可。)

虽然我可以编写PHP来读写文件,但如果我不十分小心,似乎还有很大的空间可以破坏网站,所以我想知道是否已经有了一种干净的方法来处理.htaccess 来自WP内部。

1 个回复
最合适的回答,由SO网友:Andy Macaulay-Brook 整理而成

/wp-admin/includes/misc.php 包括功能insert_with_markers() :

/**
 * Inserts an array of strings into a file (.htaccess ), placing it between
 * BEGIN and END markers.
 *
 * Replaces existing marked info. Retains surrounding
 * data. Creates file if none exists.
 *
 * @since 1.5.0
 *
 * @param string       $filename  Filename to alter.
 * @param string       $marker    The marker to alter.
 * @param array|string $insertion The new content to insert.
 * @return bool True on write success, false on failure.
 */
function insert_with_markers( $filename, $marker, $insertion ) {
insert_with_markers() 检查文件是否存在(&P);是可写的,必要时创建它。它将您的数据插入到文件中# BEGIN# END 标记,替换那些标记之间已经存在的任何线。可以向其传递一个行数组或带换行符的字符串。确保您的标记名是唯一的,以避免与WP core或其他插件发生冲突。

在同一个核心文件中,save_mod_rewrite_rules() 显示WP的设置方式$filename, $marker &;$insertion 对于默认的permalink规则,从该函数中大量窃取:

if ( is_multisite() ) {
    // I\'m not going to go here
} else {
    // Ensure get_home_path() is declared.
    require_once( ABSPATH . \'wp-admin/includes/file.php\' );

    $home_path     = get_home_path();
    $htaccess_file = $home_path . \'.htaccess\';

    $lines = array(
        \'# These are\',
        \'# the lines\',
        \'# I want to add\',
    );

    if ( insert_with_markers( $htaccess_file, \'wpse_331608\', $lines ) ) {
        // Celebrate your success
    } else {
        // Deal with your failure
    }
}
如果您的规则是用于重写的,那么WP还具有一个helper函数来检查您使用Apache的情况mod_rewrite 已启用:

if ( got_mod_rewrite() ) {
    if ( insert_with_markers( $htaccess_file, \'wpse_331608\', $lines ) ) {
        // Celebrate your success
    } else {
        // Deal with your failure
    }
}