函数文档

iis7_save_url_rewrite_rules()

💡 云策文档标注

概述

iis7_save_url_rewrite_rules() 函数用于在 IIS 7+ 环境下更新 web.config 文件中的 URL 重写规则。它根据当前规则状态,在文件可写时添加或删除规则,并返回操作结果。

关键要点

  • 函数在非多站点环境下运行,多站点时返回 null。
  • 使用 win_is_writable() 检查文件可写性,以规避 Windows PHP 的 bug。
  • 根据 iis7_supports_permalinks() 和 $wp_rewrite->using_mod_rewrite_permalinks() 判断是否需要重写规则。
  • 如果规则非空,调用 iis7_add_rewrite_rule() 添加规则;否则调用 iis7_delete_rewrite_rule() 删除规则。
  • 返回类型为 bool|null:成功返回 true,失败返回 false,多站点返回 null。

代码示例

function iis7_save_url_rewrite_rules() {
    global $wp_rewrite;

    if ( is_multisite() ) {
        return null;
    }

    // Ensure get_home_path() is declared.
    require_once ABSPATH . 'wp-admin/includes/file.php';

    $home_path       = get_home_path();
    $web_config_file = $home_path . 'web.config';

    // Using win_is_writable() instead of is_writable() because of a bug in Windows PHP.
    if ( iis7_supports_permalinks()
        && ( ! file_exists( $web_config_file ) && win_is_writable( $home_path ) && $wp_rewrite->using_mod_rewrite_permalinks()
            || win_is_writable( $web_config_file ) )
    ) {
        $rule = $wp_rewrite->iis7_url_rewrite_rules( false );

        if ( ! empty( $rule ) ) {
            return iis7_add_rewrite_rule( $web_config_file, $rule );
        } else {
            return iis7_delete_rewrite_rule( $web_config_file );
        }
    }

    return false;
}

注意事项

  • 函数依赖于多个辅助函数,如 get_home_path()、iis7_supports_permalinks() 和 win_is_writable(),需确保这些函数可用。
  • 在 Windows 服务器上运行时,优先使用 win_is_writable() 以避免 is_writable() 的已知 bug。
  • 函数主要用于内部调用,如 WP_Rewrite::flush_rules(),开发者通常无需直接使用。

📄 原文内容

Updates the IIS web.config file with the current rules if it is writable.

Description

If the permalinks do not require rewrite rules then the rules are deleted from the web.config file.

Return

bool|null True on write success, false on failure. Null in multisite.

Source

function iis7_save_url_rewrite_rules() {
	global $wp_rewrite;

	if ( is_multisite() ) {
		return null;
	}

	// Ensure get_home_path() is declared.
	require_once ABSPATH . 'wp-admin/includes/file.php';

	$home_path       = get_home_path();
	$web_config_file = $home_path . 'web.config';

	// Using win_is_writable() instead of is_writable() because of a bug in Windows PHP.
	if ( iis7_supports_permalinks()
		&& ( ! file_exists( $web_config_file ) && win_is_writable( $home_path ) && $wp_rewrite->using_mod_rewrite_permalinks()
			|| win_is_writable( $web_config_file ) )
	) {
		$rule = $wp_rewrite->iis7_url_rewrite_rules( false );

		if ( ! empty( $rule ) ) {
			return iis7_add_rewrite_rule( $web_config_file, $rule );
		} else {
			return iis7_delete_rewrite_rule( $web_config_file );
		}
	}

	return false;
}

Changelog

Version Description
2.8.0 Introduced.